<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte



 Introduction : Les afficheurs LCD
Les afficheurs LCD à logique intégrée sont un moyen pratique et efficace pour afficher des informations sur votre robot.
Bien mieux qu'une série de LED, il vous servira à afficher des messages lors de l'initialisation, des messages d'erreurs, des valeurs de variables... ou tout simplement un petit coucou pour en mettre plein la vue.

L'afficheur LCD permet d'afficher des caractères ASCII, sur 16, 20 ou 40 colonnes, et de 1 à 4 lignes.
En gros il existe 2 modèles d'interfaces normalisées : Une version "parallèle" (pas au sens PC du terme) et une version série (RS232).
Les versions parallèles sont moins chères (dans les 50Fr au minimum). Comptez dans les 150Fr une version série.
Les version séries utilisent bien sur moins d'E/S, mais elles monopolisent une liaison série.
Nous ne parlerons ici que des versions parallèles.

LCD 16 colonnes, 2 lignes


 Comment commander l'afficheur
 La connexion
L'interface avec la version parallèle comporte 16 ports (voir la photo).
  • 1 masse
  • 2 +5V
  • 3 références pour le contraste (mettez à la masse, ça marche, ou alors un potard avec le +5V)
  • 4 RS (Choix donnée ou instruction)
  • 5 R/W (Choix read ou write)
  • 6 E (Enable - validation)
  • 7 Data 0 (D0)
  • 8 Data 1 (D1)
  • 9 Data 2 (D2)
  • 10 Data 3 (D3)
  • 11 Data 4 (D4)
  • 12 Data 5 (D5)
  • 13 Data 6 (D6)
  • 14 Data 7 (D7)
  • 15 LED A (non utilisé, en tout cas dans la version que j'ai)
  • 16 LED K (idem)

Pour utiliser le LCD, il faut bien sûr l'alimenter (+5V, masse, contraste).
Ensuite il va falloir relier les ports RS, R/W et E (qui sont obligatoires) au µc.
Puis les ports D4, D5, D6 et D7 au µc aussi.
Les ports de D0 a D3 sont facultatifs ! Et on va s'en passer pour économiser des ports sur le µc.
En résumé il y a besoin de 7 ports sur le µc (éventuellement un ON/OFF supplémentaire si vous voulez, mais vérifiez bien la consomation de votre LCD si vous voulez l'alimenter directement par le µc - un port du PIC ne peut délivrer que 25mA max).

 Utilisation des ports pour envoyer une instruction
Pour envoyer une instruction à l'afficheur,
il faut régler le bit Read/Write (généralement à Write), spécifier le bit RS (si c'est une commande ou une donnée), mettre les bits de poids fort de la commande ou la donnée en question sur les bits D7 D6 D5 D4, et enfin valider pour que l'afficheur en tienne compte.
La validation se fait en mettant le bit E à 1. Puis on le remet à 0.
Rebelotte ensuite avec les bits de poids faibles sur D7 D6 D5 D4. Nouvelle validation.
Ca y est, la commande est enregistrée par le LCD, en 2 coups pour éviter d'utiliser D3 D2 D1 D0.

Il y a tout de même des contraintes de temps à respecter (il faut un certain temps au LCD pour comprendre et exécuter une requête).
Ces contraintes sont des temps minimums. On peut prévoir large et les dépasser.

 Les commandes
Apres avoir alimenté le LCD, il vous faudra envoyer une série de commande pour l'initialiser.
Vous allez pouvoir régler le mode 4 bits, l'aspect du curseur, le défilement, le nombre de pixels par caractères, etc ...
Cette phase d'initialisation terminée, vous pouvez envoyer directement des codes ascii pour que le LCD les affiche.
Vous pouvez aussi envoyer d'autre commandes, comme effacer l'écran, placer le curseur à tel ou tel endroit, et même relire les informations contenues dans sa mémoire.

Je ne vais pas tout re-détailler, certaines pages très bien faites expliquent tout ça en détail.
En voici une, en anglais. Ou en local ici.


 Un exemple de gestion du LCD sur PIC
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).

 Le cablage
 Les fonctions
  • 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


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

Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/lcd/lcd.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail