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
  • RS = 1 : sélection du registre de données
  • RS = 0 :
    • en mode écriture : sélection du registre d'instruction
    • en mode lecture : sélection du drapeau BUSY et du compteur d'adresse
5
R/W (Read / Write)
entrée
  • R/W = 1 : mode lecture
  • R/W = 0 : mode écriture
6
E (Enable)
entrée
Entrée de validation
7
DB0 (Data bit 0)
entrée/sortie

Bus de données (8 bits)

  • DB0 : bit de poids faible (LSB)
  • DB7 : bit de poids fort (MSB)
  • En mode écriture : bus configuré en entrée
  • En mode lecture : bus configuré en sortie
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
  • Efface l'écran
  • Place le curseur dans la position d'origine (1ère position à gauche, 1ère ligne : compteur d'adresse à 0x00)
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
  • D = 1 : affichage visible
  • D = 0 : affichage invisible
  • C = 1 : curseur visible
  • C = 0 : curseur invisible
  • B = 1 : curseur clignotant
  • B = 0 : curseur fixe
39 µs
Cursor or display shift
0
0
0
0
0
1
S/C
R/L
X
X
  • S/C = 1 : Décalage de l'affichage
  • S/C = 0 : Déplacement du curseur
  • R/L = 1 : Décalage à droite
  • R/L = 0 : Décalage à gauche

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
  • DL = 1 : interface 8 bits
  • DL = 0 : interface 4 bits
  • N = 1 : 2 lignes d'affichage
  • N = 0 : 1 ligne d'affichage
  • F = 1 : matrice 5 x 11 points
  • F = 0 : matrice 5 x 8 points
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 :

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

 

2) Instruction Write data to CGRAM

avec (d7... d0) = (00011110) = 0x1E

 

...

 

8 ème ligne :

1) Instruction Set CGRAM address

avec (a5... a0) = (001111) = 0x0F

 

2) Instruction Write data to CGRAM

avec (d7... d0) = (00010010) = 0x12

 

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) :

 

 

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) :

 

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 :

-> 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.

 

 

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