I. Généralités
Les afficheurs LCD sont devenues incontournables dans toutes applications qui demandent la visualisation de paramètres, il s' agit donc d'une interface Homme/Machine. Auparavant onéreux et difficiles à mettre en œuvre, ils sont maintenant bon marchés et l'interface parallèle au standard Hitachi permet un pilotage facile.
On rencontre aussi de plus en plus d'afficheur pilotable avec un port série ou I2C.
Les afficheurs LCD se ressemblent tous, à part le nombre de lignes et le nombre de colonnes, le fonctionnement et le brochage est standard et identique. Un des points intéressant est de pouvoir contrôler l'afficheur en mode 8bits ou en mode 4bits.
II. Le brochage
L'afficheur LCD a 14 broches en standard et souvent 16, les broches 15 et 16 servent au rétro-éclairage (une option).
Broche |
Nom |
Description |
1 |
Vss |
Masse |
2 |
Vdd |
Alimentation 5v |
3 |
CO |
Variables de 0 à 5v permet de modifier le contraste de l'afficheur |
4 |
RS |
Indique une commande ou une donnée à afficher (0: Commande / 1: Donnée) |
5 |
R/W |
Indique une écriture ou une lecture (0: Écriture / 1: Lecture) |
6 |
E |
Indique une validation (Le niveau Haut doit être maintenu 500µs) |
7 |
D0 |
Bus de données bidirectionnel. |
8 |
D1 |
|
9 |
D2 |
|
10 |
D3 |
|
11 |
D4 |
|
12 |
D5 |
|
13 |
D6 |
|
14 |
D7 |
|
15 |
A |
Anode rétroéclairage (+5V) |
16 |
K |
Cathode rétroéclairage (masse) |
III. Le fonctionnement
On envoie deux types d'information à l'afficheur :
-
les commandes qui permettent de l'initialiser : positionnement du curseur, effacement écran, etc. ;
-
les données à afficher.
L'entrée RS permet de spécifier si on envoie une commande ou une donnée :
-
RS=0 : instruction (commande) ;
-
RS=1 : caractère (donnée).
L'afficheur dispose d'une entrée R/W pour spécifier une lecture ou une écriture :
-
R/W=0 : écriture vers l'afficheur ;
-
R/W=1 : lecture de l'afficheur.
Pour valider tous les échanges sur le bus de données (D7-D0) on utilise l'entrée E de l'afficheur. Un front descendant sur cette entrée valide la donnée. En programmation, il faudra placer un court instant E à l'état haut puis à l'état bas.
Il est possible d'utiliser l'afficheur LCD en mode 8 bits normal ou en mode 4 bits pour économiser les broches de son µContrôleur par exemple, c'est assez pratique :
Mode 8 bits:
En mode 8 bits on place la donnée ou la commande sur le bus D7 à D0 et on valide avec E
Mode 4 bits:
En mode 4 bits on place déjà les poids forts de la donnée ou la commande sur les bits de D7 à D4 et on valide une première fois avec E. Puis on va mettre le poids faibles sur les bits de D7 à D4 et on valide une seconde fois avec E.
L'envoie ou la lecture d'un octet s'effectue donc en 2 temps dans ce mode
IV. Les mémoires
Les afficheur LCD possède 2 types de mémoires :
-
la DD RAM qui mémorise les caractères affichés à l'écran ;
-
la CG RAM qui contient la table des caractères affichables.
DD RAM ( Display Data RAM )
La DD RAM commence à l'adresse 0x00 et dans le cas d’un afficheur 16x2 lignes, elle termine à 0x4F. C'est une mémoire d'affichage dont l'adresse contient le caractère affiché à l'écran à une certaine position.
La première ligne commence en 0x00 jusqu'à 0x0F inclue.
La seconde ligne commence en 0x40 jusqu'en 0x4F inclue.
Exemple : on utilise un afficheur LCD pour visualiser la température d'une pièce (voir ci-dessous). Donner les adresses des 2 cases où devront être envoyés les chiffres de la température.
CG RAM ( Character generator RAM )
Cette mémoire stocke le code des caractères affichables (voir la table ci-dessous). Une partie de la CG RAM est modifiable à volonté par le développeur, les 8 premiers caractères. Si un caractère de la CG RAM qui est actuellement sur l'afficheur est changé, alors le changement est immédiatement apparent sur l’afficheur.
V. La table des caractères
VI. Le jeu de commandes
Instructions |
Code |
Description |
Durée |
|||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
RS |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|||
Clear Display |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Efface l'ensemble de la mémoire de donnée sans toucher au générateur de caractères. Ramène le curseur en position « home », à l'adresse 00. |
1,64 ms |
Return home |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
X |
Ramène le curseur en position « home », à l'adresse 00. Si l'affichage était décalé, il est remis à sa position d'origine : l'adresse 00 se trouve à nouveau en haut à gauche. |
1,64 ms |
Entry mode set |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
Définit le sens de déplacement du curseur après l'apparition d'un caractère (vers la gauche si I/D=1, vers la droite si I/D=0) et si l'affichage accompagne le curseur dans son déplacement ou non (S). |
40 µs |
Display on/off control |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
Met l'affichage en ou hors fonction (D), le curseur (C), le clignotement du curseur (B). |
40 µs |
Cursor and display shift |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
X |
X |
Déplace le curseur (S/C=1) ou l'affichage (S/C=0) d'une position vers la gauche (R/L=1) ou la droite (R/L=0) sans changer la DD RAM. |
40 µs |
Function set |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
X |
X |
Définit la taille de l'interface (DL=0 pour mode 4 bits, DL=1 pour mode 8 bits), le nombre de lignes (N=0 pour 1 ligne, N=1 pour 2 ou 4 lignes), et la taille des fontes (F=0 pour des caractères 5x7, F=1 pour des caractères 5x10). |
40 µs |
Set CG RAM address |
0 |
0 |
0 |
1 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
Définit l'adresse de la CG RAM. Les données de la CG RAM sont envoyées après cette commande. |
40 µs |
Set DD RAM address |
0 |
0 |
1 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
Définit l'adresse de la DD RAM. Les données de la DD RAM sont envoyées après cette commande. |
40 µs |
Read busy flag & address |
0 |
1 |
BF |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
Lit le flag busy (BF), et l'adresse de la position du curseur. BF vaut 0 si l'afficheur accepte une instruction, 1 s'il est occupé |
1 µs |
Write data to CG or DD RAM |
1 |
0 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Écrit des données dans la DD RAM ou la CG RAM. |
40 µs |
Read data |
1 |
1 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Lit les données de la DD RAM ou de la CG RAM. |
40 µs |
Notes:
-
Busy Flag:
Ce bit permet de savoir si l'afficheur est prêt à recevoir une nouvelle commande ou donnée, pour se faire il faut effectuer une lecture de ce registre (RS=0 et RW=1). Ainsi avant d'effectuer n'importe quelle tache avec l'afficheur on s'assurera qu'il est disponible. (Il est possible de se passer de ce test en mettant des tempos fixe de 40µs ou 1.7 ms entre chaque instructions vers l'afficheur LCD ce qui permet donc de se passer de la broche RW en la positionnant toujours à la masse mais cela diminue nettement la vitesse de l'afficheur). -
Set CG RAM ou Set DD RAM Address:
Après avoir envoyé une instruction d'affectation d'adresse, les Commandes Write et Read agiront alors sur la dernière entité spécifiée.
Si vous spécifiez l'adresse de la DD RAM alors toutes les instructions de lecture et écriture suivantes concerneront alors la DD RAM.
Maintenant si vous spécifiez l'adresse de la CG RAM alors toutes les instructions de lecture et écriture suivantes concerneront désormais la CG RAM. -
Après avoir défini le sens de déplacement, les caractères apparaissent au dessus du curseur (qu'il soit visualisé ou non). On peut déplacer le curseur en utilisant la commande « Set DD RAM address ».
-
Un défilement des caractères est aussi possible, il suffit pour cela d'envoyer la commande 07H (I/D=1, S=1), sans oublier de positionner RS à 0. Mais il faut faire attention car un décalage de l'affichage décale également les adresses de l'afficheur de sorte que l'extrême gauche de la ligne supérieure ne soit plus adressable à l'adresse 00. La commande « Return home » permet de repositionner les adresses de l'affichage.
VII. L'initialisation de l’afficheur LCD
Mode 8bits
Étapes |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Hexa |
Description |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0x30 |
Mot d'initialisation (il est conseillé d'attendre 5ms entre les mots d'init) |
2 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0x30 |
Mot d'initialisation (il est conseillé d'attendre 5ms entre les mots d'init) |
3 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0x30 |
Mot d'initialisation (il est conseillé d'attendre 5ms entre les mots d'init) |
4 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0x38 |
Paramétrage 8bits, + d'une ligne, police 5x7 |
5 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0x0C |
Activation écran, pas de curseur, pas de clignotement |
6 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0x01 |
Effacement mémoire DD RAM donc effacement écran |
7 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0x06 |
Écriture de la gauche vers la droite sans activer le suivi de curseur |
Mode 4bits
Étapes |
D7 |
D6 |
D5 |
D4 |
Hexa |
Description |
1 |
0 |
0 |
1 |
1 |
0x3 0x3 |
Mot d'initialisation (il est conseillé d'attendre 5ms entre les mots d'init). Mot équivalent : 0x33 |
0 |
0 |
1 |
1 |
|||
2 |
0 |
0 |
1 |
1 |
0x3 0x2 |
Mot d'initialisation (il est conseillé d'attendre 5ms entre les mots d'init) |
0 |
0 |
1 |
0 |
Paramétrage 4bits(le bit busy est pris en charge a partir de cet instant !) |
||
3 |
0 |
0 |
1 |
0 |
0x2 0x8 |
Paramétrage 4bits, + d'une ligne, police 5x7 |
1 |
0 |
0 |
0 |
|||
4 |
0 |
0 |
0 |
0 |
0x0 0xC |
Activation écran, pas de curseur, pas de clignotement |
1 |
1 |
0 |
0 |
|||
5
|
0 |
0 |
0 |
0 |
0x0 0x1 |
Effacement mémoire DD RAM donc effacement écran |
0 |
0 |
0 |
1 |
|||
6 |
0 |
0 |
0 |
0 |
0x0 0x6 |
Écriture de la gauche vers la droite sans activer le suivi de curseur |
0 |
1 |
1 |
0 |
En mode 4 bits les 3 premiers mots d'initialisation ET la commande de paramétrage de l'interface sont envoyés comme si l'afficheur était en mode 8bits (en effet seuls les bits de poids fort sont significatifs) après ces 4 étapes l'afficheur fonctionne réellement en mode 4 bits, il faudra passer les commandes ou les données en 2 temps.
VIII. Exemples d'algorithme de programmation
-
comment envoyer un octet en mode 4 bits ?
L'afficheur LCD est souvent utilisé avec 4 bits de données afin de limiter le nombre de connexions. Comment alors lui envoyer des octets sur 4 bits ?
Le principe est le suivant : envoyer le quartet de poids fort, valider, envoyer le quartet de poids faible et valider. L'algorithme s'écrit :
début de la fonction envoiOctetSur4bits(byte octet)
envoyer bit4 de octet sur D4 // Ces 4 lignes peuvent s'écrire avec un « for »
envoyer bit5 de octet sur D5 // et l'instruction "bitRead(octet,n° bit)"
envoyer bit6 de octet sur D6
envoyer bit7 de octet sur D7
mise à 1 de E // validation
attendre 1ms
mise à 0 de E
attendre 1ms
envoyer bit0 de octet sur D4 // Ces 4 lignes peuvent s'écrire avec un « for »
envoyer bit1 de octet sur D5 // et l'instruction "bitRead(octet,n° bit)"
envoyer bit2 de octet sur D6
envoyer bit3 de octet sur D7
mise à 1 de E // validation
attendre 1ms
mise à 0 de E
attendre 1ms
fin de la fonction
-
comment envoyer une commande ?
début de la fonction envoiCommande(byte codeCommande)
mise à 0 de RS // RS = 0 pour l'envoi des commandes
envoiOctetSur4bits(codeCommande) // appel de envoiOctetSur4bits
fin
-
comment envoyer un caractère à afficher ?
début de la fonction envoiCaractere(byte codeCaractere)
mise à 1 de RS // RS = 1 pour l'envoi des caractères à afficher
envoiOctetSur4bits(codeCaractere) // appel de envoiOctetSur4bits
fin
Source : Lycée Le Dantec Lannion