Gérer un écran LCD avec un pic 16f876
Mon programme permet de gérer un
écran LCD ayant un certain 'Chipset' (programme interne, protocole).
Il gère le
HD44780 et compatible avec un chipset d'écran Samsung
SX66 (enfin je crois).
LCD.asmEn fait, vous
pouvez quasiment l'utiliser comme ça, copier-coller dans votre prog. Respectez
juste
les connections, voir en début de Programme....
Explications du Programme :
LCD_E EQU 0 ; LCD Enable control line
LCD_RW EQU 1 ; LCD Read/Write control line
LCD_RS EQU 2 ; LCD Register-Select control line
Ligne A0 du port A pour Enable (Broche 6) : c'est une entrée d'activation, selon son état le contrôleur de l'afficheur LCD lit les données DB0-DB7.
Ligne A1 du port A pour Read/Write (Broche 5) : Entrée qui commande l'afficheur en lecture ou en écriture.
Ligne A2 du port A pour RS (broche 4) : Entrée qui permet d'informer l'afficheur de la nature de l'octet sur DB0-DB7 --> Données ou Instructions.
; PORTB bits
DB7 EQU 0 ; LCD dataline 7 (MSB)
DB6 EQU 1 ; LCD dataline 6
DB5 EQU 2 ; LCD dataline 5
DB4 EQU 3 ; LCD dataline 4
DB3 EQU 4 ; LCD dataline 3
DB2 EQU 5 ; LCD dataline 2
DB1 EQU 6 ; LCD dataline 1
DB0 EQU 7 ; LCD dataline 0 (LSB)
Ce sont là toutes les entrées/sorties du PORT B du Pic, le port qui envoie l'octet qui contient soit les instructions, soit les données, il lit aussi les données envoyées par l'afficheur.
Les Broches de Connexions (Ecran LCD < 80 caractères).
Pin number |
Symbol |
Level |
I/O |
Function |
1 |
Vss |
- |
- |
Power supply (GND) |
2 |
Vcc |
- |
- |
Power supply (+5V) |
3 |
Vee |
- |
- |
Contrast adjust |
4 |
RS |
0/1 |
I |
0 = Instruction input 1 = Data input |
5 |
R/W |
0/1 |
I |
0 = Write to LCD module 1 = Read from LCD module |
6 |
E |
1, 1->0 |
I |
Enable signal |
7 |
DB0 |
0/1 |
I/O |
Data bus line 0 (LSB) |
8 |
DB1 |
0/1 |
I/O |
Data bus line 1 |
9 |
DB2 |
0/1 |
I/O |
Data bus line 2 |
10 |
DB3 |
0/1 |
I/O |
Data bus line 3 |
11 |
DB4 |
0/1 |
I/O |
Data bus line 4 |
12 |
DB5 |
0/1 |
I/O |
Data bus line 5 |
13 |
DB6 |
0/1 |
I/O |
Data bus line 6 |
14 |
DB7 |
0/1 |
I/O |
Data bus line 7 (MSB) |
Instructions du HD44780.
Instruction |
Code |
Description |
Execution time** |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
Clear display |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Clears display and returns cursor to the home position (address 0). |
1.64mS |
Cursor home |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
* |
Returns cursor to home position (address 0). Also returns display being shifted to the original position. DDRAM contents remains unchanged. |
1.64mS |
Entry mode set |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
Sets cursor move direction (I/D), specifies to shift the display (S). These operations are performed during data read/write. |
40uS |
Display On/Off control |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
Sets On/Off of all display (D), cursor On/Off (C) and blink of cursor position character (B). |
40uS |
Cursor/display shift |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
* |
* |
Sets cursor-move or display-shift (S/C), shift direction (R/L). DDRAM contents remains unchanged. |
40uS |
Function set |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
* |
* |
Sets interface data length (DL), number of display line (N) and character font(F). |
40uS |
Set CGRAM address |
0 |
0 |
0 |
1 |
CGRAM address |
Sets the CGRAM address. CGRAM data is sent and received after this setting. |
40uS |
Set DDRAM address |
0 |
0 |
1 |
DDRAM address |
Sets the DDRAM address. DDRAM data is sent and received after this setting. |
40uS |
Read busy-flag and address counter |
0 |
1 |
BF |
CGRAM / DDRAM address |
Reads Busy-flag (BF) indicating internal operation is being performed and reads CGRAM or DDRAM address counter contents (depending on previous instruction). |
0uS |
Write to CGRAM or DDRAM |
1 |
0 |
write data |
Writes data to CGRAM or DDRAM. |
40uS |
Read from CGRAM or DDRAM |
1 |
1 |
read data |
Reads data from CGRAM or DDRAM. |
40uS |
Remarques:
- DDRAM = RAM données Ecrans.
- CGRAM = RAM du générateur de Caractères.
- DDRAM = Adresse de la position du Curseur.
- * = Pas Utilisé
Nom des "Bits"
Bit name |
Setting / Status |
I/D |
0 = Decrement cursor position |
1 = Increment cursor position |
S |
0 = No display shift |
1 = Display shift |
D |
0 = Display off |
1 = Display on |
C |
0 = Cursor off |
1 = Cursor on |
B |
0 = Cursor blink off |
1 = Cursor blink on |
S/C |
0 = Move cursor |
1 = Shift display |
R/L |
0 = Shift left |
1 = Shift right |
DL |
0 = 4-bit interface |
1 = 8-bit interface |
N |
0 = 1/8 or 1/11 Duty (1 line) |
1 = 1/16 Duty (2 lines) |
F |
0 = 5x7 points |
1 = 5x10 points |
BF |
0 = Can accept instruction |
1 = Internal operation in progress |
DDRAM utilisation des adresses pour un écran 1 ligne
Taille Ecran |
Visible |
positions Caractères |
DDRAM adresses |
1*8 |
00..07 |
0x00..0x07 |
1*16 |
00..15 |
0x00..0x0F |
1*20 |
00..19 |
0x00..0x13 |
1*24 |
00..23 |
0x00..0x17 |
1*32 |
00..31 |
0x00..0x1F |
1*40 |
00..39 |
0x00..0x27 |
DDRAM utilisation des adresse pour Ecran 2 lignes
Taille Ecran |
Visible |
Positions Caractères |
DDRAM adresses |
2*16 |
00..15 |
0x00..0x0F + 0x40..0x4F |
2*20 |
00..19 |
0x00..0x13 + 0x40..0x53 |
2*24 |
00..23 |
0x00..0x17 + 0x40..0x57 |
2*32 |
00..31 |
0x00..0x1F + 0x40..0x5F |
2*40 |
00..39 |
0x00..0x27 + 0x40..0x67 |
Protocole 8 bits
Il existe aussi un mode 4 bits mais je ne l'ai pas utilisé.
Je vous laisse vous débrouiller avec tout ça, je pense que vous pouvez faire facilement le rapprochement entre le tableau des instructions et les routines du programme d'utilisation d'un écran LCD HD44780.
Bon allez je vous donne un exemple d'interprétation :
;====================================================
; LCDDMODE
; Sets display control.
; Required display mode must be set in W
; b0 : 0 = cursor blink off 1 = cursor blink on
; b1 : 0 = cursor off 1 = cursor on
; b2 : 0 = display off 1 = display on
; b3-7 : don't care
; OK
;===================================================
LCDDMODE
ANDLW 0x007 ; Strip upper bits
IORLW 0x008 ; Function set
CALL LCDPUTCMD ;
Envoi l'instruction dans l'écran
RETURN
Le "ANDLW" 0x007 crée un masque avec le registre de travail W :
Ce qui permet de ne "garder" que les trois dernier bits de W pour commander les choix décrit dans le tableau de description.
Le "IORLW" 0x008 impose un état haut sur DB3 sans changer les états des autres bits et nous fait passer dans la ligne d'instruction Display On/Off control (voir le tableau des instructions).
Nous pouvons effectivement voir que par rapport au tableau des instructions et au nom des "bits", les trois bits du résultat W AND 0x07 puis IORLW 0x08 commandent le clignotement du curseur, la visibilité du curseur ainsi que l'afiichage général de l'écran LCD.
Pour le reste, c'est exactement la même philosophie.
;==================================================
; LCDCLEAR
;==================================================
LCDCLEAR
MOVLW 0x001
CALL LCDPUTCMD ;envoi de 0x001 dans l'écran.
RETURN
En regardant le tableau des instructions vous pouvez voir qu'il s'agit bien de la ligne concernant la fonction "clear display", efface écran. Très simple, non ?