Controle d'un ecran lcd via le port parallele

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 472 fois - Téléchargée 35 fois

Contenu du snippet

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 :


/*----------------------------------*\

  • Auteur: Halim ABOUZEID *
| 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 |
  • pilote par le HD44780. *
\*----------------------------------*/ #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 }

A voir également

Ajouter un commentaire

Commentaires

Messages postés
176
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
9 mai 2008

hello :)

oui moi non plus je ne vois pas le fichier zip... en tout cas ta source va bien m'aider :)
peux tu uploader le zip stp? :D

merci beaucoup,

++
Messages postés
4
Date d'inscription
mercredi 19 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2006

ca m'a l'air très bien tout ca, pas mal!
mais où est le Zip, parceque je ne le vois pas...
quant aux fonctions ASM pour utiliser le port parallèle je pense qu'elle ne sont plus fonctionelles sous Xp parceque microsoft l'a desactivée pour des raisons de <<sécurité>>
mouai... c'est pas grave, on leur en veut pas, de toute façon plus personne n'utilise de vieux programmes, et encore moins ROOOOH! le "Vieux" port COM! attention, on est à l'USB!
n'empèche que ca a énervé bcps de personnes de voir qu'ils devaient tout simplement simplement changer de matériel ET de logiciels au passage de Xp (à moins que les développeurs du logiciel n'aient cré une MAJ Xp)... Eh bien, moi aussi!
Et encore un grand merci à Microsoft!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
_inp() ne serait pas un appel direct a IN asm ?
Messages postés
11
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
4 septembre 2006

Au lieu de faire de l'assembleur avec des in , tu pe faire des _inp().

cmd=(cmd & 0x03); ==> cmd&=0x03;
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
Dommage je n'ai pas d'ecran LCD pour tester sur XP.
Je doute des resultats avec in et out en asm.

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.