par Jan Svenungson <jan.svenungson(at)linux.nu>
L´auteur:
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).
Traduit en Français par:
Iznogood <iznogood /at/ iznogood-factory.org>
Sommaire:
|
Comprendre les afficheurs LCD HD44780
Résumé:
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.
_________________ _________________ _________________
|
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 ?
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
Talkback form for this article
Every article has its own talkback page. On this page you can submit a comment or look at comments from other readers:
2005-02-13, generated by lfparser version 2.52