Comprendre les afficheurs LCD HD44780

ArticleCategory: [Choose a category, translators: do not translate this, see list below for available categories]

Hardware

AuthorImage:[Here we need a little image from you]

[jan.svenungson]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Jan Svenungson 

en to fr Iznogood 

AboutTheAuthor:[A small biography about the author]

Jan utilise GNU/Linux depuis 1996 et n'a d� effectuer que deux red�marrages involontaires depuis lors (sans compter les red�marrages d�s aux coupures de courant).

Abstract:[Here you write a little summary]

Cet article va tenter de vous apprendre deux ou trois choses sur l'afficheur LCD HD44780.
Nous verrons comment le connecter au port parall�le et comment le programmer avec un petit outil nomm� LCDInfo comme r�f�rence.
L'objectif n'est pas de simplement connecter l'afficheur, d'ex�cuter un programme et d'obtenir le r�sultat sur l'�cran, mais plut�t de comprendre comment le mat�riel peut r�agir selon vos souhaits.

ArticleIllustration:[One image that will end up at the top of the article]

[HD44780]

ArticleBody:[The main part of the article]

Introduction

Avant tout, il nous faut du mat�riel et du logiciel ; nous supposons que vous poss�dez un ordinateur avec un port parall�le standard (imprimante) sur lequel vous pouvez faire fonctionner GNU/Linux avec gcc et glibc.
Vous aurez bien s�r besoin d'un afficheur LCD HD44780, de c�bles pour le connecter au port parall�le, ainsi qu'un potentiom�tre si vous voulez changer le contraste. Pour alimenter l'afficheur, il vous faudra plus d'�nergie que ne peut en fournir le port parall�le et vous aurez s�rement besoin de trouver une autre forme d'alimentation, ailleurs dans l'ordinateur. La meilleure fa�on de le faire est de prendre un connecteur standard de +5V (celui utilis� pour alimenter les disques durs et lecteurs de disquette, etc.)

Une fois la connexion de l'afficheur LCD termin�e, vous devrez comprendre comment il fonctionne. Ceci est habituellement laiss� de c�t� dans les articles sur ce sujet, mais je vais tenter de vous expliquer quelques arcanes de l'afficheur qui vous aideront � le programmer.

La derni�re chose � faire est d'obtenir l'affichage de quelque chose d'utile. Comme r�f�rence, j'utiliserai un petit programme appel� LCDInfo qui supporte la plupart des fonctionnalit�s du HD44780 mais qui n'affiche pas grand chose pour l'instant. Ce programme est en phase alpha et je travaille dessus lorsque j'ai du temps libre.
Si vous n'avez jamais programm� en C, envisagez de d�couvrir d'abord un peu le sujet. Je consid�re que vous �tes d�butants, ce qui correspond � mon niveau actuel.

Comment le connecter ?

[schematic] Avant tout, examinons les diff�rentes broches disponibles sur le LCD et expliquons leur r�le.
La broche 1 se nomme VSS et elle est cens�e se connecter � GND.
La broche 2 se nomme VDD et correspond � la broche d'alimentation de +5V.
La broche 3, appel�e VLC, est connect�e au potentiom�tre pour d�finir le contraste de l'afficheur.
La broche 4 est la broche RS et selon sa position, l'afficheur se pr�pare � recevoir des instructions ou des donn�es.
La broche 5 est la broche R/W qui contr�le si le LCD est en mode �mission ou r�ception.
La broche 6 est la broche d'activation (Enable). Lorsqu'elle passe du niveau bas � haut et revient � bas, le LCD lit les broches 4,5 et 7-14.
Les broches 7-14 sont les lignes de bus de donn�es appel�es DB0-DB7, qui sont les bits de donn�es principaux envoy�s au LCD et qui contr�lent o� et quoi �crire sur l'afficheur.
Les broches 15 et 16 sont seulement pr�sentes sur les afficheurs avec r�tro-�clairage et correspondent simplement au +5V et au GND avec une r�sistance de 3.8 Ohm entre la broche 15 et le +5V.

Pour trouver comment les connecter au port d'imprimante, vous pouvez regarder sur le sch�ma de droite o� j'ai tent� de rendre les explications le plus clair possible. Cliquez sur le sch�ma pour agrandir l'image.
Ce sch�ma n'est utile que si vous voulez changer le contraste de l'afficheur. J'ai simplement connect� les broches 3 et 1 � GND, ce qui a bien fonctionn�; mais si vous avez un �clairage particulier dans la pi�ce, vous pouvez envisager d'ajouter un potentiom�tre.

Lorsque vous r�cup�rez l'alimentation du PC, soyez prudents. Si vous prenez l'alimentation � partir du mauvais c�ble, vous obtiendrez du +12V et vous grillerez le LCD. Vous devez choisir le rouge. Le jaune est le +12V et le noir est le GND.
Si vous avez branch� correctement, le LCD doit avoir la premi�re (et la troisi�me si elle existe) colonne en noir lorsque vous allumez le PC.

Comment fonctionne le LCD

Le LCD ne fait rien si vous ne lui demandez pas, il attend une variation valide (ce qui se produit lorsque la broche "enable" est mise en position haute, et qu'elle est remise en position basse apr�s un moment). L'afficheur d�tecte alors s'il s'agit de donn�es ou d'instructions � traiter, puis s'il doit recevoir ou envoyer des informations et enfin, les bits de donn�es sont envoy�s ou re�us.
Dans cet article, nous ne recevrons jamais d'information du LCD, la broche R/W restera donc en position basse, ce qui signifie en �criture.
La broche RS sera en position basse, sauf lors de l'impression de caract�res, tout le reste sera consid�r� comme instructions.
Ceci rend la programmation de l'afficheur r�ellement simple.

Une fois que nous savons ceci, nous voulons allumer l'afficheur et le pr�parer � recevoir des informations. Ceci est r�alis� dans la s�quence d'initialisation o� nous indiquons � l'afficheur de d�marrer, le � jeu de fonction � � utiliser, etc.
L'alimentation doit d�j� �tre active si vous la prenez � partir d'un c�ble du PC, sinon, c'est la premi�re chose � faire.
Arrive ensuite le � jeu de fonctions � selon le type d'affichage que vous avez.
Pour rendre ceci encore plus facile � comprendre, je vais expliquer exactement ce que nous faisons lors de l'utilisation du jeu de fonctions.
DB2 est le bit de police et il doit �tre en position basse indiquant une matrice de 5x7 points.
BD3 est le bit de ligne d'affichages et doit �tre en position haute signifiant 2 lignes. Que se passe-t-il si vous avez 4 lignes sur l'afficheur? Ne vous inqui�tez pas, la premi�re et la troisi�me ligne sont les m�mes dans la m�moire de l'afficheur, vous devez donc utiliser �galement la position haute.
DB4 est le bit de longueur de donn�es et ceci d�termine si vous avez 4 ou 8 DB. Si vous connectez l'affichage en fonction de mon sch�ma, vous devez avoir ce DB en position haute.
Initialisez alors DB5 � haut pour indiquer � l'affichage qu'il s'agit bien d'une instruction du � jeu de fonctions �, et v�rifiez ensuite que RS et R/W sont en position basse et activez une variation haut et bas. V�rifiez dans le manuel pour les d�lais; je suppose que les temps d'attente ne sont que des microsecondes, ce qui devrait �tre bien plus que n�cessaire.

Et � propos du code ?

Je vais parler ici des �l�ments du programme LCDInfo dont vous avez besoin pour comprendre comment l'interface du HD44780 fonctionne. Vous pouvez t�l�charger le programme LCDInfo � la fin de l'article ou allez lire les fichiers source en C iolcd.c et lcdinfo.c en cliquant ici.

Ce qu'il nous faut maintenant, ce sont les instructions en C et croyez-moi lorsque je vous dis que c'est facile. Je vais d�tailler le code pas � pas et m�me si vous �tes un d�butant en C, vous comprendrez.
En premier lieu, nous incluons quelques fichiers en-t�te et nous d�finissons quelques fonctions (voir le source pour information). Puis vient la partie la plus int�ressante.
#define D_REGISTER 0
#define I_REGISTER 2
#define WRITE_DATA 8
#define BASE 0x378

int main(void)
{
  ioperm(BASE,3,1);
  [CUT]
}
C'est la premi�re instruction dans la fonction principale qui nous donne les permissions sur le port parall�le. BASE doit �tre autour de 0x378 et la partie � 3 � signifie que nous avons acc�s � 0x378, 0x379 et 0x380, ce qui correspond basiquement au port d'imprimante.
La raison pour laquelle il y a trois adresses vient de ce que le port est divis� entre les donn�es, les statuts et les contr�les. Pour nous, cela signifie que nous devons d'abord d�finir les broches de donn�es, celles de contr�le en second et nous ne pouvons pas le faire en une seule commande.
La chose suivante, c'est le jeu de fonctions d�crit ci-dessus.
void function_set(void)
{
  outb(56, BASE);
Ceci d�finit les broches DB � une matrice de 5x7 points, deux lignes, etc.
  outb(I_REGISTER + WRITE_DATA, BASE + 2);
Ceci initialise les broches RS et R/W en instruction et �criture. J'ai d�fini des variables globales de I_REGISTER et WRITE_DATA et elles sont �gales � 2 et 8.
Il y a ensuite l'activation de la variation.
  outb(ENABLE + I_REGISTER + WRITE_DATA, BASE + 2);
  usleep(0);
  outb(I_REGISTER + WRITE_DATA, BASE + 2);
}
Ce que fait ce code est de basiquement mettre "enable" en position haute, attendre et le remettre en position basse. La commande usleep(0); n'est pas id�ale, mais je n'ai pas fini le code pour la gestion du temps.
Quelques uns d'entre vous peuvent se demander pourquoi j'active RS et R/W dans le code, alors que j'ai dit qu'ils devaient �tre mis en position basse dans les instructions. C'est parce que les broches 1, 14 et 17 sont � invers�es mat�riellement �, indiquant que la broche 14 est � ferm�e �; pour le port d'imprimante, la broche est en position haute !
Je vous avais bien dit que c'�tait facile, non ?

Comment afficher des caract�res

Vous voulez peut �tre un exemple pratique pour votre afficheur ? Pas de probl�me.
Le code (code comme dans commandes) est identique � l'impression d'un caract�re et � la d�finition de fonctions. La seule chose � faire est de changer quelques variables. Nous ne voulons pas que le RS soit initialis� en instructions mais en donn�es pour commencer. La fonction print_character() ressemble donc � :
void print_character(int character)
{
  outb(D_REGISTER + WRITE_DATA, BASE + 2);
  outb(character, BASE);
  outb(ENABLE + D_REGISTER + WRITE_DATA, BASE + 2);
  usleep(0);
  outb(D_REGISTER + WRITE_DATA, BASE + 2);
}
Comme vous pouvez le voir, nous avons chang� � I_REGISTER � en � D_REGISTER � et � 56 � en � character � mais qu'est ce que cela signifie ? Si vous regardez les codes de caract�res dans votre manuel, vous comprendrez.
Nous devons seulement remplir la fonction par un caract�re (comme nous utilisons le C, il n'est pas n�cessaire de se pr�occuper de le d�finir d'abord comme un entier) et le caract�re va alors s'afficher sur le LCD. Chouette, non ?

Avec ce code, nous avons le squelette d'un programme LCD, adaptez-le � vos besoins, affichez la m�moire disponible, affichez les connexions http actives ou ce que vous voulez. Quelques exemples se trouvent dans le programme LCDInfo qui affiche des informations disponibles dans le syst�me de fichiers proc sur un ordinateur GNU/Linux.

R�f�rences