http://micropic.free.fr
La gestion d'un afficheur LCD 2*16
Dans cette partie , nous allons voir comment interfacer le PIC16F84 avec un afficheur LCD ( 2 lignes de 16 caractères )

Il existe plusieurs manières d'interfacer le pic avec un afficheur LCD :
sur 8 bits , sur 4 bits ( qui sont les deux modes standarts des afficheurs à base de HDD44780 ) et le mode 2 bits que nous allons voir maintenant qui permet de dialoguer avec l'afficheur sur 2 bits , ce qui nous permettras d'economiser les ports d'E/S du pic.

L'astuce consiste à utiliser un registre à décalage pour envoyer les données de façon serielle par l'intermediaire d'une sextuple bascule D ( 74LS174 ) qui les retranscrira de façon parallele , l'afficheur étant configuré en mode 4 bits.

L'avantage est que l'on n'utilise que 2 lignes d'E/S , l'inconvénient est que l'on pourra uniquement envoyer des commandes à l'afficheur , mais en aucun cas lire ce qui est déja à l'écran ( ce qui n'est pas génant dans l'application qui nous concerne ).

Le fichier que l'on va utiliser est inspiré du fichier de Myke Predko :
http://www.myke.com

Je l'ai légèrement modifié et ai ajouté des commandes d'effaçage d'écran et de positionnement sur les différentes lignes.

Voici le fichier asm
lcd2.asm

et le schéma de branchement :


Pour ceux qui voudrait utiliser l'afficheur LCD en mode 4 bits , voici un include à inserer dans votre programme :
lcd4.asm

et le schéma de branchement :


Les commandes disponibles sont les suivantes :
  • call LCDinit : initialisation de l'afficheur>
  • call LCDchar : envoi un caractere ( contenu dans w ) sur l'afficheur
  • call LCDins : envoi une commande ( contenue dans w) à l'afficheur
  • call LCDcls : efface l'afficheur
  • call LCDcls2 : efface la deuxieme ligne de l'afficheur
  • call LCDhome : renvoi le curseur en haut a gauche
  • call LCDlin1 : renvoi le curseur au debut de la ligne 1
  • call LCDlin2 : renvoi le curseur au debut de la ligne 2

Pour positionner le curseur sur la ligne 1 :
movlw 0x80+offset
call LCDins

pour positionner le curseur sur la ligne 2 :
movlw 0xC0+offset
call LCDins

Et comme exemple le classique
hello world qui offre une démonstration de programme utilisant un afficheur LCD en mode 4 bits.
Il a été compilé sur un 16F84 mais fonctionne aussi sur le 16F877 moyennant quelques modifications mineures ( include "P16F877.inc" , spécification du port utilisé , ... ).

Le même programme , mais cette fois ci avec un affichage sur 2 lignes , et en utilisant une table de caractères dans le pic :
hello2.asm

Pour finir , un include qui permet d'afficher des valeurs 8 ou 16 bits en décimal , hexadécimal et binaire :
bcd.asm

Les commandes disponibles sont les suivantes :
  • call bin8 : affiche une valeur de 8 bits ( contenue dans w ) en binaire --> 00000000
  • call bcd5 : affiche une valeur de 16 bits ( contenue dans val1 et val1+1 ) en décimal 5 digits --> 00000 à 65535
  • call bcd3 : affiche une valeur de 8 bits ( contenue dans w ) en décimal 3 digits --> 000 à 255
  • call hex8 : affiche une valeur de 8 bits ( contenue dans w ) en hexadécimal 2 digits -->00 à FF
A l'aide ces 4 commandes , il est possible d'afficher n'importe quelle valeur en 8 ou 16 bits en décimal , hexadécimal et binaire :

Affichage d'une valeur 8 bits en décimal
movlw .23
call bcd3

Affichage d'une valeur 8 bits en hexadécimal
movlw .23
call hex8

Affichage d'une valeur 8 bits en binaire
movlw .23
call bin8

Affichage d'une valeur 16 bits en décimal
movlw .23
movwf val1
movlw .25
movwf val1+1
call bcd5

Affichage d'une valeur 16 bits en hexadécimal
movlw .23
call hex8
movlw .25
call hex8

Affichage d'une valeur 16 bits en binaire
movlw .23
call bin8
movlw .25
call bin8


Voici un petit exemple d'utilisation de ces routines :
bcdex.asm
il affiche , sur un LCD , la valeur 55 en binaire sur la première ligne de l'écran , en décimal et hexadécimal sur la seconde.


voici un autre exemple : un affichage défilant.
on utilise pour cela les commandes 20 et 24 du controleur HDD44780 qui permet un décalage de la zone d'affichage.
( il est prevu pour un 16F873 mais tournera sans problêmes sur un 16F84 ) :
testlcd.asm




Nouvelle version de la gestion d'un afficheur LCD

Cette nouvelle version d'include de gestion d'un afficheur LCD comporte 5 boutons poussoirs reliés sur le même port que l'afficheur.

voici tout d'abord le schéma électrique du montage :


Les boutons poussoirs sont reliés entre les broches communes à l'afficheur et RB0 qui sert ici de point commun à toutes les touches.
Par exemple la broche 28 du pic est à la fois reliée à la broche 14 de l'afficheur et au bouton poussoir .
Les 5 diodes sont des 1N4148.

voici les includes pour ce montage:
-
BLCD4.asm : include qui comprends les sous programmes de gestion
-
TLCD4.asm : include qui comprends les routines de temporisation nécessaires au contrôle de l'afficheur
les routines de temporisations ont été placées dans un fichier indépendant pour permettre de modifier la vitesse du quartz utilisé dans l'application sans devoir à toucher à l'include de gestion de l'afficheur ( TLCD4.asm comprend les temporisations pour un quartz à 4 MHz ).

Les routines de gestion sont :
  • LCDinit : initialisation de l'afficheur
  • LCDchar : envoi un caractere ( contenu dans w ) sur l'afficheur
  • LCDins : envoi une commande ( contenue dans w) à l'afficheur
  • LCDcls : efface l'afficheur
  • LCDcls2 : efface la deuxieme ligne de l'afficheur
  • LCDhome : renvoi le curseur en haut a gauche
  • LCDlin1 : renvoi le curseur au debut de la ligne 1
  • LCDlin2 : renvoi le curseur au debut de la ligne 2
  • LCDdefg : fait défiler l'affichage vers la gauche
  • LCDdefd : fait défiler l'affichage vers la droite
  • CLAVtst : renvoi dans W l'état des 5 touches ( également dans la variable 'clav' )
Ce sont les mêmes routines que l'ancien include , mais avec l'ajout des commandes suivantes:

- LCDdefg qui permet de faire défiler l'affichage d'un caractère vers la gauche
- LCDdefd qui permet de faire défiler l'affichage d'un caractère vers la droite

L'exemple de base est d'afficher par exemple sur la ligne1 la chaine de caractère suivante :
'                affich. scrollant'
Les 16 premiers caractères etant des espaces , on ne voit rien à l'écran ( le texte suivant se trouvant en dehors de la zone visible ).
Puis il suffit d'appeler 16 fois la routine 'LCDdefg' ( avec une tempo ) pour faire apparaître le message.
Il est à noter qu'après avoir fait défiler l'affichage , le caractère situé en haut à gauche ne se trouve plus à l'adresse H'C0'.
Pour remédier à cela , il suffit d'appeler la routine 'LCDhome' pour repositionner l'afficheur dans son état initial.

- CLAVtst
Cette routine permet de tester l'état des 5 boutons poussoirs branchés en parallèle sur l'afficheur. En retour de ce sous-programme , on retrouve l'état des boutons dans W , ainsi que dans la variable 'clav'.
Les bits correspondants aux boutons sont les bits 0 à 4 de cette variable.

voici un petit exemple de programme d'utilisation de cet include :
BLCDtest.asm
Il affiche simplement sur l'écran la variable 'clav' en binaire , et permet donc de suivre l'état des boutons poussoirs.

Il a été compilé sur un 16F873 à 3.2768 MHz , mais tournera sans problêmes sur un 16F84 à 4 MHz.

© 1999-2004 Philippe Brégea