La norme Hitachi HD44780

La norme Hitachi HD44780 est mise en œuvre par la plupart des afficheurs LCD classiques.

Modèle de l'afficheur

Un afficheur possède deux mémoires RAM :

  • la DDRAM (Display Data RAM) : d'une centaine d'octets, elle contient les caractères à afficher en mémoire. Selon les modèles, différentes zones de la DDRAM sont mappées sur les caractères à l'écran ; la correspondance doit être indiquée dans le datasheet de l'afficheur.
  • la CGRAM (Character Generator RAM) : la table des caractères est principalement stockée en ROM (voir le datasheet pour connaître les caractères présents), mais 8 caractères supplémentaires sont eux présents en RAM, et les glyphes correspondants peuvent donc être définis en écrivant dans la CGRAM.

On peut envoyer à l'afficheur des commandes et des données à écrire en mémoire (DDRAM et CGRAM), ainsi que lire des données situées en mémoire. Les commandes permettent de configurer l'afficheur, ainsi que de positionner un pointeur pour les écritures et lectures en DDRAM.

Interface de communication

La norme HD44780 définit une liaison parallèle pour la connexion de l'afficheur. Cette liaison permet de lire et écrire des données, et d'envoyer des commandes. L'unité de base des transferts est l'octet.

Les signaux sont :

  • RS (Register Select) : indique si l'octet transmis est une donnée (RS=1) ou une commande (RS=0).
  • RW (Read-Write) : sens du transfert, vers (RW=1) ou à partir de (RW=0) l'afficheur.
  • E (Enable) : une sorte de « strobe » qui provoque l'échantillonnage des données sur front descendant.
  • D0 à D7 : lignes de données pour un octet. L'afficheur peut être passé en mode 4 bits pour économiser des fils, auquel cas le transfert d'un octet se fait en deux temps sur D4 à D7.

Autant que je le sache, le brochage de l'interface de communication parallèle est le même quel que soit le modèle d'afficheur.

Protocole

Le protocole est abondamment documenté dans la littérature. Une très bonne introduction est disponible sur le site Aurel32. L'utilisation est assez simple ; schématiquement il faut :

  • initialiser l'afficheur : effacer l'écran, définir l'apparence du curseur, etc.
  • définir la position d'écriture en DDRAM ;
  • envoyer successivement les octets de données correspondant aux caractères à afficher. Par défaut, à chaque caractère envoyé, le pointeur en DDRAM avance d'une position, ce qui est très pratique.

Variante sur bus I2C : PCF2119

20090131_lcd.jpg Philips a spécifié le contrôleur LCD PCF2119, qui fonctionne sur bus I2C. Cela simplifie grandement le câblage par rapport à l'interface parallèle, car il n'y a besoin que de deux fils en plus de la masse (horloge et données). De plus, l'interface PCF2119 ne définit pas de nouveau protocole, mais l'encapsule dans des trames I2C le protocole HD44780, ce qui ne gâche rien...

La transposition du protocole parallèle exposé ci-dessus se fait selon les principes suivants :

  • RW n'est pas transmis, car l'écriture et la lecture se font à deux adresses différentes : 0x76 en écriture, 0x77 en lecture ;
  • E n'a pas de raison d'être ;
  • les échanges se font sous forme de trames I2C qui commencent, après l'adresse I2C (0x76 ou 0x77), par un octet de contrôle, qui indique si la trame contient des commandes ou des données. Cet octet de contrôle contient donc le bit RS.

Format général simplifié pour l'envoi d'une ou plusieurs commandes :

I2C startadresse I2C
0x76
contrôle
0x00 (commande)
commande 1...commande nI2C stop

Format général simplifié pour l'envoi de données :

I2C startadresse I2C
0x76
contrôle
0x40 (données)
données
octet 1
...données
octet n
I2C stop

Notons qu'il est possible d'envoyer plusieurs salves de commandes ou données dans une même trame I2C en utilisant le bit de poids fort de l'octet de contrôle : s'il est à 1, un nouvel octet de contrôle sera attendu ; seul le dernier octet de contrôle d'une trame a son bit de poids fort à 0.

Au niveau du brochage des afficheurs, contrairement au protocole parallèle, rien n'est standardisé ici. Il m'est arrivé de tomber sur deux afficheurs I2C aux caractéristiques identiques, dont les références concordaient jusqu'au 10ème caractère, mais qui possédaient des brochages radicalement différents !

Mise à jour, 7 novembre 2009 : mise en œuvre d'un afficheur LCD sur I2C avec un PIC.

Pour l'anecdote, sur la photo, le fil bleu au milieu ne sert à rien. C'est une masse en l'air oubliée là, qui, quelques instants après la prise de cette photo, est allée faire un court-circuit qui a grillé le PIC... ChrisJ ou « je vais te fumer derrière les cyprès. »