Accueil
COMMENT PILOTER UN LCD A CONTROLEUR HD44780



PS :

Ok les gars, apparemment il y a des problèmes d'accès au LCD qui foutent la merde alors je vais rentrer un peu plus en détail sur les signaux de commande et les tempos.
J'espère que ça va vous aider a les résoudre

Bon comme vous le savez, les LCDs se pilotent par trois fils de commande et un bus de données qui peut être de 4 ou 8 bits (c'est notre cas).
Ces signaux sont :

DATA : c’est le bus de données.

Une chose primordiale est que les données doivent etre stables pendant qu on dis au controleur de venir lire.

R/S : (Register Select) : ce qu il faut savoir c est que le contrôleur HD44780 a deux endroits ou on peut lui expédier les données.

- Dans sa case « donnée » pour afficher une lettre
- Dans sa case « commande » pour lui dire d’effacer l’écran par exemple.
Le signal R/S permet de choisir.
A « 1 » c est une donnée que l on veut lui donner et a « 0 » c’est une commande.

R/W : ( Read/Write ) : c’est un signal que l on force au niveau bas pour dire au LCD que l’on ne viens que lui dire ce qu’il dois faire…..si on mets ce signal au niveau haut, alors c’est lui qui nous dis ce qu il fais ou a fait !

Il est ainsi possible de venir lire son BUSY FLAG (indicateur d’activité) qui permet de savoir s’il a fini de traiter l’ordre qu’on lui a donné.

Cela permet de se passer de temporisations puisque l on sait s’il a fini ou pas.

Il est aussi possible de venir littéralement lire l’écran du LCD c'est-à-dire de vérifier que ce qu il a affiché est effectivement ce qu’on lui a dit d’afficher c’est une sorte de CRC !
Tout cela est bien beau mais pour utiliser la lecture, il faut que l on puisse par programme venir lire les données.
Or la plupart des PCs sont maintenant équipés de ports parallèles bidirectionnels mais pas les anciens PCs.
De plus il est pas facile de lire le port parallèle par programme.

Enfin dernier signal :

E : ( ENABLE ) : qui en fait est un top départ pour dire au contrôleur « les données sont chaudes, viens les lire ».

C’est pour cela qu’il est PRIMORDIAL que le signal ENABLE soit validé que lorsque tout est positionné !
Si ce n est pas respecté, le controleur peut lire n’importe quoi !
C est l’erreur la plus fréquente lors de la programmation d’un acces a un LCD.

Bien ! maintenant que l’on a fait le tour des signaux, regardons comment jouer avec :

Sur les chrono diagrammes suivants, le signal en haut indique un « 1 » logique et le bas indique un « 0 ».

respectez surtout cet ordre pour ne pas écrire n importe quoi au LCD !

« Tas » représente une tempo de temps d’établissement ( set up ) , laissant le temps aux données de se stabiliser. Une valeur de 500µS est correcte mais ne dois pas aller en dessous de 200nS.
En pratique n’allez pas en dessous de 5µS car la longueur du câble perturbe cette impulsion.

«Tah » est une tempo de maintient des données ( hold ) pour laisser au controleur le temps de lire les données convenablement. Pareil que Ts, 500µS est bon mais pas descendre en dessous de 60nS

« Tp » tempo de pulse, très importante ! elle permet au controleur de « voir » votre demande de ce qu’il vienne lire les données que vous lui donnez.
Cette durée de tempo ne doit pas descendre en dessous de 500nS.
En dessous, il ne fais plus rien !

« Tcycle » est la tempo de période maximale du signal ENABLE a respecter. Si on descends en dessous de 1µS, le controleur perds les pédales !
donc soyez gentils avec lui !
de toute façon, cette valeur est basée sur Tas, Tah et Tp….

Autre chose très importante ! dans ce tableau se trouvent les durées des instructions du controleur HD44780 .
Il est primordial d’en tenir compte dans le Tcycle !!!
Il faut laisser le temps au controleur, après lui avoir demandé de faire quelque chose, d’attendre qu’il ait fini avant de lui donner autre chose a faire !

L’instruction la plus longue est le « RETURN HOME » avec 1.52mS !
Il faudra donc en tenir compte lors de l’utilisation de l’afficheur !

Pour composer le code a envoyer, c'est simple !

Au dessus du tableau vous avez « 8 4 2 1 8 4 2 1 » correspondant de DB7 à DB0 qui sont en fait séparées par un trait vertical en deux « quartet » ( moitié d un octet )
Lorsque vous devez envoyer une instruction, additionnez les valeurs correpondants au bits a mette a « 1 »
Par exemple on a pour l’instruction « set display on/off » :
ça c’est fixe ! et ça c’est un choix !
on lit dans le tableau :

« met le LCD en marche ou pas ( D ) met le curseur en marche ou pas ( C ) et fait clignotter le curseur ou pas ( B ).

Ce qui veut dire que si je veux le LCD allumé alors je remplace le D par un « 1 » et si je le veux éteint alors je mets un « 0 »

Si je veux un curseur je remplace « C » par un « 1 » et si je n’en veux pas je remplace « C » par un « 0 ».

Et enfin si je veux que le curseur clignote alors je remplace « B » par un « 1 », si je le veux fixe ( non clignotant ) je remplace « B » par un « 0 ».

Donc récapepettons :

Si je veux un LCD allumé un curseur allumé et que ce curseur soit fixe, je remplace « D C B » par « 1 1 0 ».

Donc j aurais au total :

maintenant on calcules sa valeur hexa décimale :
0 6 en hexa !

a vous de le convertir en décimal !
rappel : au delà de 9, en hexa on a A, B, C, D, E et F.

voila en fait c’est hyper simple !

maintenant pour positionner le curseur :

en fait chaque caractère affiché a l’écran a un numéro, une adresse selon ce tableau qui est valable que pour un LCD 2*16 caractères :
attention, ce sont des valeurs en hexa !
donc par exemple si je veux aller en deuxième ligne, deuxième position, il faut que je me mette a l’adresse 41 hex.
Maintenant il faut dire au controleur que l’on veut s’y mettre !
Et rien de plus simple !

On utilise l’instruction « set Display Data Ram adress » ou ajuster l’adresse de la mémoire de donnée.

En fait c est choisir la position !
Donc on a :

ou add est l’adresse code en binaire…

or on veut se mettre sur l’adresse 41hex soit en 8 bits « X1000001 »

on remplace donc !

le « X » indique que cette valeur doit suivre celle du tableau d’instructions et de toutes façon, on a pas un LCD de plus de 128 cases donc ce bit est inutile
on envoi un p’ti coup d’ENABLE et voila!

Le controleur nous mets en 2e ligne 2e case ! simple !

Voila maintenant c est a vous de le faire !

Les pages suivantes contiennent la table ASCII de tous les caractères connus par le LCD ainsi que la méthode a suivre pour initialiser le controleur.

Mais avant d’essayer, voici un exemple d’initialisation d’un LCD avec un microcontrôleur et en langage C :

Un petit conseil :

Creez une fonction comme LCDcommand(char) et LCDdata(char) qui en fait ne demandent qu’un parametre pour acceder au LCD.

Chaque fonction commandant le niveau de la broche RS.

LCDcommand le mettant a 0 et LCDdata le mettant a 1. comme ça il est impossible de se planter et d’oublier de changer le niveau de la pin RS qui est l’erreur qui arrive le plus souvent alors faites y attention !
#include <io8515.h>
#include <macros.h>
#include <stdio.h>

// fonction generant une impulsion sur la ligne enable du lcd

void lcdpulse()
{

wait();ici je fais une tempo pour laisser le temps aux données pour se stabiliser
PORTD |= 0x40;//enable =1 je mets enable a l’état haut
wait(); ici je fais une tempo pour le enable a l’état haut
PORTD &= ~0x40;//enable =0 je mets enable a l’état bas
wait();

}

// fonction d initialisation du lcd
void lcdinit() fonction qui initialise le LCD voir le diagramme d’initialisation du controleur

{

wait();
PORTA=0x30;
lcdpulse();
lcdpulse();
lcdpulse();
PORTA=0x38;
lcdpulse();
PORTA=0x0C;
lcdpulse();
PORTA=0x01;
lcdpulse();
PORTA=0x06;
lcdpulse();

}

void lcdprint(char chaine[]) fonction qui imprime une chaine de caracteres

{
PORTD |= 0x20;//register select = 1 (données)
while(*chaine != '\0')
{
PORTA=*chaîne;
lcdpulse();
chaine++;
}//end of while
PORTD &= ~0x20;//register select = 0 (instructions)
}

void send2lcd(char donnee,char command)

{
PORTA=donnee;
if (command > 1)
PORTD &= ~0x20;//register select
else
PORTD |= 0x20;//register select
PORTD |= 0x40;//enable = 1
wait();
PORTD &= ~0x40;//enable = 0
wait();

}
void wait()
{
unsigned char a,b;
for (a=0; a<255; a++);
for(b=0;b<255;b++);
}
void wait2()
{
unsigned char a,b;
for (a=0; a<255; a++)
for(b=0;b<255;b++);

}

/*

PA0:d0lcd PB0:push1 PC0:brightness1 PD0:RS232 Rx
PA1: PB1:push2 PC1:brightness2 PD1:RS232 Tx
PA2: PB2:push3 PC2:brightness4 PD2:IRRx (infra rouges Rx)
PA3: PB3:push4 PC3:brightness8 PD3:interruption touches
PA4: PB4:car.d PC4:contrast1 PD4:teamled1
PA5: PB5:isp PC5:contrast1 PD5:RegisterSelect
PA6: PB6:isp PC6:contrast1 PD6:Enable
PA7:d7lcd PB7:isp PC7:contrast1 PD7:teamled2

*/

void main()

{

/* définition des entrées sorties */

DDRA = 0xFF; /* PORT A EN SORTIE */
DDRB = 0x08; /* PORT B EN ENTREE sauf PB4 (carrier detect) */
DDRC = 0xFF; /* PORT C EN SORTIE */
DDRD = 0xFE; /* PORT D MIXTE */

PORTA = 0x00; /* ALL OFF */
PORTB = 0x0F; /* ALL OFF sauf pull up sur quartet LSB */
PORTC = 0x00; /* ALL OFF */
PORTD = 0x00; /* ALL OFF */

lcdinit();

lcdprint("TEST DU LCD 2*20 car");

PORTD &= ~0x20;//register select
PORTA=0xC0;
lcdpulse();

PORTD |= 0x20;//register select
lcdprint(" WWW.jackypc.com ");
while(1)
{

}/*end of while*/

}/*end of main */

INITIALISATION DU LCD
TABLE ASCII DU CONTROLEUR
Je mettrais sûrement a jour ce document pour expliquer comment créer ses propres caractères dans la table ASCII

D’autres infos sont disponibles dans le datasheet du HD44780.
Documentation disponible sur le site Internet Hitachi.
© Copyright, Tous droits de reproduction et de diffusion réservés à Design et Genesis2921