Controle d'un ecran LCD via le port parallele d'un PC. Vous choisissiez un message, et celui-ci defile sur l'ecran LCD.
Le schema pour relier l'ecran au port est fourni dans le zip.
Source / Exemple :
/*----------------------------------*\
| Date: 11/08/2004 |
| e-mail: halim.abouzeid@gmail.com |
+------------------------------------+
| Ce programme fait defiler un texte |
| sur un ecran LCD. |
| Ce programme devrait fonctionner |
| avec n'importe quel ecran LCD |
\*----------------------------------*/
#include <windows.h>
#include <stdio.h>
#define PORT 0x378 //adresse du port parallele
#define DATA PORT+0
#define STATUS PORT+1
#define CONTROL PORT+2
BYTE inportb(UINT portid)
{
unsigned char value;
__asm mov edx,portid
__asm in al,dx
__asm mov value,al
return value;
}
void outportb(UINT portid,BYTE value)
{
__asm mov edx,portid
__asm mov al,value
__asm out dx,al
}
//Envoie une commande a l'ecran
void PUTCMD(int cmd)
{
outportb(DATA, cmd);
outportb(CONTROL,inportb(CONTROL) | 0x01); //Enable niveau haut
Sleep(20);
outportb(CONTROL,inportb(CONTROL) & 0xFE); //Enable niveau bas
Sleep(20);
return;
}
//Efface l'ecran
void CLEAR()
{
outportb(CONTROL, inportb(CONTROL) | 0x08);
PUTCMD(0x01);
outportb(CONTROL, inportb(CONTROL) & 0xF7);
return;
}
void EMODE(int cmd)
{
cmd=(cmd & 0x03);
cmd=(cmd | 0x04);
PUTCMD(cmd);
return;
}
void DMODE(int cmd)
{
cmd=(cmd & 0x07);
cmd=(cmd | 0x08);
PUTCMD(cmd);
return;
}
void SDDMODE(int cmd)
{
cmd=(cmd | 0x80);
PUTCMD(cmd);
return;
}
//Affiche un caractere
void PUTCHAR(char cmd)
{
outportb(DATA, cmd);
outportb(CONTROL,inportb(CONTROL) | 0x01); //Enable niveau haut
Sleep(2);
outportb(CONTROL,inportb(CONTROL) & 0xFE); //Enable niveau bas
//Sleep(2);
return;
}
//Choix de la ligne sur laquelle afficher
void LINE(int cmd)
{
cmd=(cmd | 0x80);
outportb(CONTROL, inportb(CONTROL) | 0x08); //RS niveau haut
PUTCMD(cmd);
outportb(CONTROL, inportb(CONTROL) & 0xF7); //RS niveau bas
return;
}
//Initialisation de l'ecran LCD
void INIT()
{
int cmd;
outportb(CONTROL, inportb(CONTROL) & 0xDF); /* Reset Control Port - Make sure Forward Direction */
outportb(CONTROL, inportb(CONTROL) | 0x08); //RS niveau haut
cmd=0x38; //2 lignes 8 colonnes
PUTCMD(cmd);
cmd=0x00; //disp. off, curs. off, blink off
DMODE(cmd);
cmd=0x04; //disp. on, curs. off
DMODE(cmd);
cmd=0x02; //auto-inc a droite
EMODE(cmd);
outportb(CONTROL, inportb(CONTROL) & 0xF7); //RS niveau bas
return;
}
//Fait derouler le message
void AFFICHE(char message[100],int count)
{
int i;
char mess[100];
if(count<16) //si le message fait moin de 16 caracteres
count=16; //forcer a prendre les 16 1ers caracteres
if (count>16) //si le message fait plus de 16 caracters
if (100-count>5) //on ajoute un espacement entre 2 defilements successif
count=count+5;
else
count=100;
while(1)
{
mess[count-1]=message[0]; //
for (i=0;i<count-1;i++) //
mess[i]=message[i+1]; //Modification de l'ordre des x caracteres
for (i=0;i<100;i++) //du message pour donner l'effet de defillement
message[i]=mess[i]; //(x=count)
Sleep(200);
LINE(0x00); //Ramene le curseur au debut de la ligne
for (i=0;i<16;i++) //Affiche les 16 premiers caracteres
PUTCHAR(message[i]);
}
return;
}
void main()
{
char message[100];
int i,count;
INIT(); //initialisation de l'ecran LCD
CLEAR(); //efface l'ecran LCD
for(i=0;i<100;i++) //message=que des espaces vides
message[i]=' ';
printf("Enter message (100 car. max): ");
//Saisie du message a faire defiler
for(i=0;i<100;i++)
{
message[i]=getchar();
if (message[i]=='\n')
{
message[i]=' '; //suppression du caractere de retours a la ligne
count=i; //count=nombre de caracteres dans le message
break;
}
}
AFFICHE(message,count); //affiche le message
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.