On a réalise un ensemble de fonctions en assembleur PIC pour gérer un LCD.
Il y a en plus quelques fonctions de timer qui sont utiles.
Ce programme tourne sur un 16F877 cadencé à 20Mhz mais peut être adapté très facilement sur un 16F84
(dont il va tout de même utiliser 7 E/S) sauf la fonction LCD_PRINTF. Pensez quand même à revoir les timers !
Mais au pire en les laissant tels quels tout va marcher. L'affichage sera juste un poil plus lent.
Le programme n'est ni trop gourmand en taille mémoire (moins de 270 instructions, en comptant les timers),
ni en RAM (4 octets pour le LCD, 3 pour les timers).
IMPORTANT : Ce programme utilise des tempo fixe entre 2 instructions, conrrespondant au temps max normalisé.
Il ne va pas tester périodiquement l'état du LCD pour savoir
si il peut enchainer une nouvelle instruction ou non.
Inconvénient, l'exécution est probablement plus longue. Mais du coup l'affichage se fait à temps constant,
et surtout le bit R/W n'est plus utile. On peut l'affecter à 0 et récupérer ainsi une E/S sur le PIC.
(ce n'est pas représenté sur le schéma ou la liaison RD1 -> 5 peut donc être supprimée,
et remplacée par une liaison à la masse).
|
|
|
|
- LCD_INIT : Initialisation du LCD en mode 4 bits. D'autres paramètres sont définissables par des defines :
- LCD_SET_MATRIX 1 -> Matrices de 5*11, 0 -> Matrices de 5*8 (défaut 0. C'est le cas pour les LCD bas de gamme)
- LCD_SET_DISPLAY 1 -> Display LCD On, 0 -> Display LCD Off (défaut 1. Et oui, sinon on voit rien :P
- LCD_SET_CURSOR 1 -> Cursor On, 0 -> Cursor Off (défaut 1, mais vous pouvez le désactiver)
- LCD_SET_BLINK 1 -> blink character at cursor position On, 0 -> Off (défaut 0. 1 fait clignotter le caractère sous le curseur)
- LCD_SET_DIRECT 1 -> to the right, 0 -> to the left (défaut 1)
- LCD_SET_SCROLL 1 -> Scroll display, 0 -> do not scroll (défaut 0. 1 fait se déplacer tout l'affichage si le curseur dépasse de l'écran)
- LCD_SEND_CHAR : Affiche le caractère dont le code ascii est dans W.
Exemple qui affiche F sur l'afficheur :
MOVLW "F"
CALL LCD_SEND_CHAR
- LCD_SEND_HEXA : Affiche W en hexa (sur 2 caractères).
Exemple qui affiche FF sur l'afficheur :
MOVLW D'255'
CALL LCD_SEND_HEXA
- LCD_SEND_DECI : Affiche W en décimal (sur 3 caractères).
Exemple qui affiche 050 sur l'afficheur :
MOVLW D'50'
CALL LCD_SEND_DECI
- LCD_SEND_BIN : Affiche W en binaire (sur 8 caractères).
Exemple qui affiche 11111110 sur l'afficheur :
MOVLW D'254'
CALL LCD_SEND_BIN
- LCD_CLEAR : Efface l'écran LCD
- LCD_SCROLL : Scrolle l'écran LCD (déplace tout l'affichage d'un cran)
- LCD_LOCATE : Place le curseur sur la position définie par W
- LCD_LOCATE_LINE0 : Place le curseur au début de la 1ère ligne
- LCD_LOCATE_LINE1 : Place le curseur au début de la 2ème ligne
- LCD_LOCATE_LINE2 : Place le curseur au début de la 3ème ligne
- LCD_LOCATE_LINE3 : Place le curseur au début de la 4ème ligne
- LCD_PRINT_SPACE : Affiche un espace
- LCD_PRINTF : Fonction la plus compliquée, elle est utilisée pour afficher une
chaîne de caractères pré-définie dans la mémoire du PIC.
Il faut d'abord définir les chaînes de la sorte (nombre quelconque limité à 255 chaînes) :
Printf_START
VARIABLE PRINTF_CMP = 1 ; Variable MPLAB
(pas d'existence en assembleur) pour trouver le bon printf.
Printf_Fribotte EQU PRINTF_CMP
PRINTF_CMP++
DT "Fribotte",0
Printf_Coucou EQU PRINTF_CMP
PRINTF_CMP++
DT "* Coucou ! *", 0
Printf_Fribotte_Made EQU PRINTF_CMP
PRINTF_CMP++
DT "Made by Fribotte",0
Printf_Ok EQU PRINTF_CMP
PRINTF_CMP++
DT "OK",0
Printf_Error EQU PRINTF_CMP
PRINTF_CMP++
DT "ERROR",0
Printf_STOP
Ensuite on appelle l'affichage d'une chaîne en mettant son identifiant dans W.
Ici affichage de la chaîne "* Coucou ! *" et de la chaîne "Made by Fribotte" :
MOVLW Printf_Coucou
CALL LCD_PRINTF
MOVLW Printf_Fribotte_Made
CALL LCD_PRINTF
- Les boucles : Wait1s, Wait15ms, Wait10ms, Wait1.5ms, Wait100µs, Wait50µs, Wait1µs
|
|
Vous trouverez le programme complet ici.
Il affiche des chaînes de caractères et ensuite, en boucle, les valeurs
analogiques sur le port A0 converties en numérique.
|
|