Projet à microcontrôleur PIC 16F628A
Commande d'un afficheur LCD alphanumérique par le port RS232 d'un ordinateur
On se propose de commander un afficheur LCD alphanumérique avec un ordinateur.
Photo de la carte :
La communication entre l'ordinateur et la carte se fait par une liaison série RS232.
Les commandes utilisées dans l'application Windows sont celles du contrôleur du module LCD.
On reste ainsi proche du matériel (dans un but pédagogique) :
Ci-dessous, un exemple d'afficheur LCD alphanumérique 16 x 2 (2 lignes de 16 caractères) :
Le connecteur possède 16 broches :
Plusieurs contrôleurs existent sur le marché, entre autres :
Ils sont compatibles entre eux.
Il y a cependant des petites différences au niveau des tables de caractères.
Voici les formats les plus courants :
Suivant les modèles, 5 x 8 points ou 5 x 11 points.
Le curseur se trouve en dernière ligne :
Numéro
de broche du connecteur
|
Symbole
|
Type
|
Description |
1 |
GND
|
alimentation
|
masse (0V) |
2
|
Vdd
|
alimentation
|
+ 5 V (alimentation du contrôleur interne) |
3
|
V0
|
alimentation
|
alimentation du panneau LCD |
4
|
RS (Register Select)
|
entrée
|
|
5
|
R/W (Read / Write)
|
entrée
|
|
6
|
E (Enable)
|
entrée
|
Entrée de validation |
7
|
DB0 (Data bit 0)
|
entrée/sortie
|
Bus de données (8 bits)
|
8
|
DB1 (Data bit 1)
|
entrée/sortie
|
|
9
|
DB2 (Data bit 2)
|
entrée/sortie
|
|
10
|
DB3 (Data bit 3)
|
entrée/sortie
|
|
11
|
DB4 (Data bit 4)
|
entrée/sortie
|
|
12
|
DB5 (Data bit 5)
|
entrée/sortie
|
|
13
|
DB6 (Data bit 6)
|
entrée/sortie
|
|
14
|
DB7 (Data bit 7)
|
entrée/sortie
|
|
15*
|
A (Anode)
|
alimentation
|
alimentation du système de rétroéclairage |
16*
|
K (Cathode)
|
alimentation
|
* seulement pour les modules LCD équipés de LED de rétroéclairage.
R = 10 k
P = 2,2 k
R' = quelques dizaines d'ohms
Le potentiomètre P règle la tension d'alimentation (V0) du panneau LCD : on agit ainsi sur le contraste.
R' règle le courant du système de rétroéclairage (de l'ordre de 100 mA). Consulter la documentation du constructeur pour déterminer sa valeur exacte.
Le contrôleur dispose de 11 instructions, dont voici une description sommaire :
Instruction
|
RS
|
R/W
|
DB7
|
DB6
|
DB5
|
DB4
|
DB3
|
DB2
|
DB1
|
DB0
|
Description
|
Durée (KS0070B à 270 kHz) |
Display clear
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
|
1,53 ms
|
Return home
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
X
|
Place le curseur dans la position d'origine (1ère position à gauche, 1ère ligne : compteur d'adresse à 0x00) |
1,53 ms
|
Entry mode set
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
I/ D
|
S
|
I/D = 1 : Déplacement du curseur d'une position à droite (Incrémentation du compteur d'adresse) I/D = 0 : Déplacement du curseur d'une position à gauche (Décrémentation du compteur d'adresse) S(Shift) = 1 : Décalage de l'affichage dans le sens de déplacement du curseur S = 0 : L'affichage n'est pas décalé |
39 µs
|
Display On/Off control
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
|
39 µs
|
Cursor or display
shift
|
0
|
0
|
0
|
0
|
0
|
1
|
S/C
|
R/L
|
X
|
X
|
N.B. Les données de la DDRAM* ne sont pas modifiées. |
39 µs
|
Set Function
|
0
|
0
|
0
|
0
|
1
|
DL
|
N
|
F
|
X
|
X
|
|
39 µs
|
Set CGRAM address
|
0
|
0
|
0
|
1
|
a5
|
a4
|
a3
|
a2
|
a1
|
a0
|
Positionne le compteur d'adresse de la CGRAM** |
39 µs
|
Set DDRAM address
|
0
|
0
|
1
|
a6
|
a5
|
a4
|
a3
|
a2
|
a1
|
a0
|
Positionne le compteur d'adresse de la DDRAM |
39 µs
|
Write data to CGRAM
or DDRAM
|
1
|
0
|
d7
|
d6
|
d5
|
d4
|
d3
|
d2
|
d1
|
d0
|
Write data to CGRAM : écrit la donnée (d7 ...d0) à l'adresse de la CGRAM définie par l'instruction précédente Set CGRAM address Write data to DDRAM : écrit la donnée (d7 ...d0) à l'adresse de la DDRAM définie par l'instruction précédente Set DDRAM address |
43 µs
|
Read Busy flag and
address counter
|
0
|
1
|
BF
|
ac6
|
ac5
|
ac4
|
ac3
|
ac2
|
ac1
|
ac0
|
Lit le drapeau BF (Busy Flag) et le compteur d'adresse (ac6 ... ac0). Le drapeau Busy est disponible sur la sortie DB7. Quand le drapeau est au niveau 1, cela veut dire que le contrôleur est occupé à traiter une instruction. Le contrôleur n'accepte aucune nouvelle instruction tant que le drapeau est au niveau 1 : il faut donc attendre que le drapeau passe au niveau 0. |
-
|
Read data from CGRAM
or DDRAM
|
1
|
1
|
d7
|
d6
|
d5
|
d4
|
d3
|
d2
|
d1
|
d0
|
Read data from CGRAM : lit la donnée (d7 ...d0) à l'adresse de la CGRAM définie par l'instruction précédente Set CGRAM address Read data from DDRAM : lit la donnée (d7 ...d0) à l'adresse de la DDRAM définie par l'instruction précédente Set DDRAM address |
43 µs
|
X : 0 ou 1
* DDRAM = Display Data RAM
** CGRAM = Character Generator RAM
Cas d'un afficheur à une seule ligne :
Cas d'un afficheur à deux lignes :
N.B. Considérons un afficheur 16 x 2 (2 lignes de 16 caractères).
Seuls les caractères correspondant aux adresses 0x00 à 0x0F et 0x40 à 0x4F de la DDRAM sont visibles.
La CCROM contient les caractères prédéfinis (et non modifiables).
Exemple : on veut afficher le caractère K à la 4 ème position de la 1 ère ligne :
1) Instruction Set DDRAM address
avec (a6... a0) = (000011) = 0x03 (position)
2) Instruction Write data to DDRAM
avec (d7... d0) = (01001011) = 0x4B (code ASCII du caractère)
Vous disposez de 8 caractères personnalisables.
Les adresses de la CGRAM sont :
- 1er caractère : adresse 0x00 (ou 0x08)
- 2 ème caractère : adresse 0x01 (ou 0x09)
- ...
- 8 ème caractère : adresse 0x07 (ou 0x0F)
Exemple : on veut afficher le 2ème caractère personnalisable à la 4 ème position de la 1 ère ligne :
1) Instruction Set DDRAM address
avec (a6... a0) = (000011) = 0x03 (4 ème position de la 1 ère ligne)
2) Instruction Write data to DDRAM
avec (d7... d0) = (00000001) = 0x01 (2ème caractère personnalisable)
Considérons un afficheur à matrices 5 x 8 points.
Intéressons-nous au 2ème caractère personnalisable, que l'on veut définir de la manière suivante :
1 ère ligne de la matrice :
1) Instruction Set CGRAM address
avec (a5... a0) = (001000) = 0x08
- (a5a4a3) = (001) = 3 bits de poids faibles de l'adresse CGRAM (0x01 : 2ème caractère personnalisable)
- (a2a1a0) = (000) = 1ère ligne (ligne du haut) de la matrice
2) Instruction Write data to CGRAM
avec (d7... d0) = (00011110) = 0x1E
- (d7d6d5) = (000)
- (d4... d0) = (11110) = niveaux lumineux des 5 points de la première ligne
...
8 ème ligne :
1) Instruction Set CGRAM address
avec (a5... a0) = (001111) = 0x0F
- (a5a4a3) = (001) = 3 bits de poids faibles de l'adresse CGRAM (0x01 : 2ème caractère personnalisable)
- (a2a1a0) = (111) = 8ème ligne (ligne du bas) de la matrice
2) Instruction Write data to CGRAM
avec (d7... d0) = (00010010) = 0x12
- (d7d6d5) = (000)
- (d4... d0) = (10010) = niveaux lumineux des 5 points de la 8 ème ligne
Remarque : les données de la CGRAM sont perdues à la mise hors tension du module LCD.
Dans ce cas, la commande du module LCD nécessite 11 broches.
Vu du côté du microcontrôleur, cela fait :
3 sorties (reliées aux 3 entrées RS, R/W et E du module LCD)
8 broches (reliées au bus de données DB7~DB0) :
- configurées en sortie en mode écriture (R/W = 0)
- configurées en entrée en mode lecture (R/W = 1)
Si vous êtes limité par le nombre de broches disponibles de votre microcontrôleur, vous pouvez utiliser l'interface 4 bits.
Cela fait gagner 4 broches et seules 7 broches sont nécessaires à la commande du module LCD.
Vu du côté du microcontrôleur, cela donne :
3 sorties (reliées aux 3 entrées RS, R/W et E du module LCD)
4 broches (reliées aux 4 bits du bus de données DB7~DB4) :
- configurées en sortie en mode écriture (R/W = 0)
- configurées en entrée en mode lecture (R/W = 1)
L'interface 4 bits est plus lente que l'interface 8 bits.
En effet, le transfert des 8 bits de données se fait en 2 fois. On commence par transmettre les 4 bits de poids forts (DB7~DB4) puis les 4 bits de poids faibles (DB3~DB0).
Remarque : On peut gagner une broche en reliant R/W à la masse (R/W = 0 : mode écriture).
Le drapeau BUSY n'est donc plus accessible.
On contourne l'obstacle avec une temporisation suffisamment longue, à l'issue de laquelle on pourra transmettre une nouvelle instruction.
Le microcontrôleur commence par établir RS et R/W (R/W = 0), puis les 4 bits DB7-DB4.
Les niveaux de RS et R/W sont pris en compte par le module LCD sur le front montant de E.
Les niveaux des 4 bits DB7-DB4 sont pris en compte par le module LCD sur le front descendant de E.
Le microcontrôleur établit ensuite les 4 bits de poids faibles DB3-DB0, qui sont pris en compte par le module LCD sur le deuxième front descendant de E.
Le microcontrôleur commence par établir RS et R/W (R/W = 1).
Les niveaux de RS et R/W sont pris en compte par le module LCD sur le front montant de E.
Le module LCD fournit alors les 4 bits DB7-DB4 (au plus tard 120 ns après le front montant de E).
Le module LCD fournit ensuite les 4 bits de poids faibles DB3-DB0, après le deuxième front montant de E.
N.B. Au niveau du module LCD, les 4 broches DB7-DB4 sont configurées en sortie (mode lecture oblige). Au niveau du microcontrôleur, cela veut dire configuration en entrées.
Il faut donc un microcontrôleur avec 4 broches individuellement configurables :
Le chronogramme qui suit est valable pour les instructions où RS = 0 et R/W = 0 (Display Clear, Return Home, Entry Mode Set ...).
Au départ, nous sommes en mode écriture (R/W = 0).
On passe ensuite en mode lecture (R/W = 1) : le microcontrôleur peut alors lire le drapeau BF (Busy flag) pour savoir si l'instruction est terminée.
Il faut bien sûr un ordinateur qui possède un port COM, reconnaissable par son connecteur SubD 9 broches mâle.
Il faut brancher un câble "null-modem" (câble croisé) entre l'ordinateur et la carte.
Si vous n'en avez pas, vous pouvez facilement en faire un (il faut 3 fils et 2 connecteurs SubD 9 broches femelle).
L'ordinateur envoie 2 octets qui contiennent les 10 bits de l'instruction :
Le PIC reçoit ces 2 octets (sur la broche RX de l'UART) et les décode :
1er cas : R/W = 0, ce qui correspond au groupe d'instructions :
Le PIC lance la commande de l'instruction idoine puis lit le drapeau Busy Flag (avec l'instruction Read Busy Flag & Address counter).
Quand le drapeau passe à 0, le PIC transmet (sur la broche TX de l'UART) à l'ordinateur un octet qui contient la valeur du compteur d'adresse. Cet octet indique également à l'ordinateur que l'opération est terminée.
2ème cas : R/W = 1, ce qui correspond au groupe d'instructions :
Pour l'instruction Read data from CGRAM or DDRAM, le PIC lit ensuite le drapeau Busy Flag (avec l'instruction Read Busy Flag & Address counter).
Quand le drapeau passe à 0, le PIC transmet (sur la broche TX de l'UART) à l'ordinateur un octet qui contient la valeur des données. Cet octet indique également que l'opération est terminée.
Avant-propos
Cette application a été écrite en C++ Borland Builder 5.
L'application fonctionne sous Windows NT4 et Windows XP (non testée sous Windows Vista, merci de me dire ce qu'il en est ...).
N.B. La gestion de la liaison RS232 nécessite l'installation du composant TComPort (la version 2.64 est suffisante) :
Procédure d'utilisation :
-> Brancher le câble "null-modem" entre l'ordinateur et la carte (hors tension)
-> Mettre la carte sous tension
-> Ouvrir l'application
-> Configurer les paramètres de la liaison RS232C :
- 9600 bauds/s
- 8 bits de données
- Pas de bit de parité
- 1 bit de STOP
- Pas de contrôle de flux
-> Ouvrir le port
Exemple d'utilisation :
On se propose d'afficher Hello! sur un afficheur LCD alphanumérique 16 x 2
-> Set Function (avec DL = 0, N = 1 et F = 0)
-> Display On/Off Control (avec D = 1, C = 0 et B = 0)
-> Entry Mode Set (avec I/D = 1 et SH = 0)
-> Display Clear
-> Write Data into DDRAM (avec 0x48 : caractère 'H')
-> Write Data into DDRAM (avec 0x65 : caractère 'e')
-> Write Data into DDRAM (avec 0x6C : caractère 'l')
-> Write Data into DDRAM (avec 0x6C : caractère 'l')
-> Write Data into DDRAM (avec 0x6F : caractère 'o')
-> Write Data into DDRAM (avec 0x21 : caractère '!')
N.B. A la mise sous tension, le module LCD est en mode interface 8 bits (mode par défaut).
Pendant sa phase d'initialisation, le PIC exécute l'instruction Set Function de manière à configurer le module LCD en mode interface 4 bits.
Le PIC est maintenant prêt à recevoir des instructions de l'application Windows, instructions qui seront traités dans le mode interface 4 bits.
- 1 câble null-modem (femelle/femelle)
- 1 ordinateur avec port COM
Le code source a été écrit en langage assembleur avec l'environnement de développement gratuit MPLAB IDE de Microchip.
(C) Fabrice Sincère ; Révision 0.9.10