begin process at 2008 07 05 07:20:49
1 205 054 membres
40 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONTROLE D'UN ECRAN LCD VIA LE PORT PARALLELE


Information sur la source

Description

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

  • /*----------------------------------*\
  • * 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
  • }
/*----------------------------------*\
*  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
}
  • signaler à un administrateur
    Commentaire de BruNews le 16/08/2004 17:47:49 administrateur CS

    Dommage je n'ai pas d'ecran LCD pour tester sur XP.
    Je doute des resultats avec in et out en asm.

  • signaler à un administrateur
    Commentaire de J6B le 18/08/2004 13:56:07

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

    cmd=(cmd & 0x03); ==> cmd&=0x03;

  • signaler à un administrateur
    Commentaire de BruNews le 18/08/2004 14:11:36 administrateur CS

    _inp() ne serait pas un appel direct a IN asm ?

  • signaler à un administrateur
    Commentaire de MaX271 le 20/10/2005 09:53:46

    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!

  • signaler à un administrateur
    Commentaire de Linuss le 17/01/2006 10:50:49

    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,

    ++

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Boutique

Boutique de goodies CodeS-SourceS