# HD44780

Un HD44780 est un contrôleur standard permettant de piloter un dispositif d'affichage par cristaux liquides.
Des « clones » existent, tels que le KS0070B ou le SPLC780A1.

## Branchement physique

Un module HD44780 comporte 16 bornes (dont les 2 dernières sont optionnelles si l'écran piloté ne dispose pas d'un rétroéclairage) :
| Borne | Symbole | Type | Fonction |
| 1 | Vss ou V0 | Alim | Masse 0V |
| 2 | Vcc ou Vdd | Alim | Alimentation générale 5V |
| 3 | Vee | Alim | Alimentation du panneau LCD (Contraste des caractères) Vee = Vcc – Vss Vss = Vcc → Vee = 0 → Caractères invisibles Vss = 0 → Vee = Vcc → Contraste maximum |
| 4 | RS | Entrée | RS = 1 → Sélection du registre de données RS = 0 et R/W = 0 → Sélection du registre d’instruction RS = 0 et R/W = 1 → Sélection du drapeau BUSY et du compteur d’adresse |
| 5 | R/W | Entrée | R/W = 0 → Mode écriture R/W = 1 → Mode lecture |
| 6 | E | Entrée | Entrée de validation Les entrées RS et R/W sont lues sur le front montant, et le bus de données est lu sur le front descendant. |
| 7 | D0 | Entrée/Sortie | Bus de données, bit n°0 (LSB) |
| 8 | D1 | Entrée/Sortie | Bus de données, bit n°1 |
| 9 | D2 | Entrée/Sortie | Bus de données, bit n°2 |
| 10 | D3 | Entrée/Sortie | Bus de données, bit n°3 |
| 11 | D4 | Entrée/Sortie | Bus de données, bit n°4 |
| 12 | D5 | Entrée/Sortie | Bus de données, bit n°5 |
| 13 | D6 | Entrée/Sortie | Bus de données, bit n°6 |
| 14 | D7 | Entrée/Sortie | Bus de données, bit n°7 (MSB) |
| 15 | A | Alim | Anode du système de rétro-éclairage (à alimenter en 5V à travers une résistance de 50 à 100Ω pour limiter le courant à 100mA) |
| 16 | K | Alim | Cathode du système de rétro-éclairage (masse) |

## Commande
### En mode 8 bits

Dans ce mode, l’octet contenant les données est envoyé à l'afficheur (ou lu par l'afficheur) directement sur les broches D0 à D7.

### En mode 4 bits

Dans ce mode, on n’utilise que les broches D4 à D7, les broches D0 à D3 doivent être connectées à la masse.
L’octet de données est envoyé (ou lu) en 2 fois :
* d’abord les 4 bits de poids fort, par une première validation sur la broche E,
* puis les 4 bits de poids faible, par une seconde validation sur la broche E.

## Instructions de contrôle et d’affichage

| Instructions | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Description | Durée |
| Clear display | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | Efface l'écran Place le curseur dans la position d'origine (1re position à gauche, 1re ligne : compteur d'adresse à 00h) | > 1.64 ms |
| Return home | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - | Place le curseur dans la position d'origine (1re position à gauche, 1re ligne : compteur d'adresse à 00h) | > 1.64 ms |
| Entry set mode | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | I/D = 1 → Déplacement du curseur d'une position à droite (Incrémentation du compteur d'adresse) I/D = 0 → Déplacement du curseur d'une position à gauche (Décrémentation du compteur d'adresse) S(Shift) = 1 → Décalage de l'affichage dans le sens de déplacement du curseur S = 0 → L'affichage n'est pas décalé Attention le décalage de l'affichage (S = 1) décale également les adresses de l'afficheur de sorte que l’adresse 00h ne correspondra plus à la 1re position à gauche, 1re ligne. | > 40 µs |
| Display on/off control | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | D = 1 → Affichage visible D = 0 → Affichage invisible C = 1 → Curseur visible C = 0 → Curseur invisible B = 1 → Curseur clignotant B = 0 → Curseur fixe | > 40 µs |
| Cursor or display shift | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | - | - | S/C = 1 → Décalage de l'affichage S/C = 0 → Déplacement du curseur R/L = 1 → Décalage à droite R/L = 0 → Décalage à gauche | > 40 µs |
| Function set | 0 | 0 | 0 | 0 | 1 | DL | N | F | - | - | DL = 1 → Interface 8 bits DL = 0 → Interface 4 bits N = 1 → 2 lignes d'affichage N = 0 → 1 ligne d'affichage F = 1 → Matrice 5 x 11 points F = 0 → Matrice 5 x 8 points | > 40 µs |
| Set CGRAM address | 0 | 0 | 0 | 1 | ACG5 | ACG4 | ACG3 | ACG2 | ACG1 | ACG0 | Positionne le compteur d'adresse de la CGRAM à la valeur (ACG5 ... ACG0) | > 40 µs |
| Set DDRAM address | 0 | 0 | 1 | ADD6 | ADD5 | ADD4 | ADD3 | ADD2 | ADD1 | ADD0 | Positionne le compteur d'adresse de la DDRAM (ADD6 ... ADD0) | > 40 µs |
| Read busy & address | 0 | 1 | BF | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | Lit le drapeau BF (Busy Flag) et le compteur d'adresse (AC6 ... AC0) BF = 1 → Le contrôleur est occupé et n’accepte aucune nouvelle instruction BF = 0 → Le contrôleur est disponible pour une nouvelle instruction | > 1 µs |
| Write data to CGRAM or DDRAM | 1 | 0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Write data to CGRAM : écrit la donnée (D7 ... D0) à l'adresse de la CGRAM définie par l'instruction précédente Set CGRAM address Write data to DDRAM : écrit la donnée (D7 ... D0) à l'adresse de la DDRAM définie par l'instruction précédente Set DDRAM address | > 43 µs |
| Read data from CGRAM or DDRAM | 1 | 1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Read data from CGRAM : lit la donnée (D7 ... D0) à l'adresse de la CGRAM définie par l'instruction précédente Set CGRAM address Read data from DDRAM : lit la donnée (D7 ... D0) à l'adresse de la DDRAM définie par l'instruction précédente Set DDRAM address | > 43 µs |

## Initialisation

* Attendre au moins 15ms depuis le passage à +5V de Vcc,
* Envoyer l'instruction Function set avec la valeur 0011...(.),
* Attendre au moins 4.1ms,
* Envoyer à nouveau l'instruction Function set avec la valeur 0011(.)...,
* Attendre au moins 100µs,
* Envoyer à nouveau l'instruction Function set avec la valeur 0011....,
* Si on veut activer le mode 4 bits, envoyer les 4 bits de poids fort de l'instruction Function set avec la valeur 0010,
* Configuration du nombre de lignes et de la matrice, en envoyant l'Instruction Function set avec par exemple la valeur 00111000 (8 bits, 2 lignes, 5x8pixels),
* Configuration du contrôle d'affichage, en envoyant l'instruction Display on/off control avec par exemple la valeur 00001110 (Affichage visible, curseur visible, curseur fixe),
* Effacement de l'écran, en envoyant l'instruction Clear display, avec pour valeur 00000001,
* Configuration du curseur, en envoyant l'instruction Entry set mode, avec par exemple pour valeur 00000110 (déplacement du curseur vers la droite, pas de décalage du compteur d'adresse).
* Fin de l'initialisation, l'écran est prêt à recevoir les autres instructions permettant l'affichage.

## Mémoire d’affichage DDRAM (Display Data RAM)

Il s’agit de la mémoire où sont stockés les caractères affichés.
L’adresse du caractère correspond à sa position à l’écran.
Pour un écran à 1 ligne (80 caractères max) :
* le premier caractère de gauche est à l'adresse 0x00,
* le caractère à sa droite est à l'adresse 0x01,
* le caractère suivant est à l'adresse 0x02,
* et ainsi de suite...
| @ 0x00 | @ 0x01 | @ 0x02 | @ 0x03 | .......... | @ 0x4C | @ 0x4D | @ 0x4E | @ 0x4F |
Pour un écran à 2 lignes (40 caractères max par ligne) :
* la logique d'accès aux caractères est la même que pour un écran 1 ligne,
* la logique d'accès aux caractères est la même que pour un écran 1 ligne sauf que l'adresse du premier caractère de gauche commence à 0x40.
| @ 0x00 | @ 0x01 | @ 0x02 | @ 0x03 | .......... | @ 0x24 | @ 0x25 | @ 0x26 | @ 0x27 |
| @ 0x40 | @ 0x41 | @ 0x42 | @ 0x43 | .......... | @ 0x64 | @ 0x65 | @ 0x66 | @ 0x67 |
Pour l’écran à 2 lignes de 40 caractères, si on écrit un caractère à l’adresse 27h, le curseur vient se placer automatiquement à l’adresse 40h.
Pour un écran plus petit (de 2 lignes de 16 caractères par exemple), bien qu’inutile, il est possible d’accéder aux adresses mémoires des caractères inexistants.

## Mémoire du générateur de caractères CGRAM (Character Generator RAM)

Pour une matrice de caractères de 5x8, il y a 8 caractères personnalisables dans la CGROM, et seulement 4 lorsque la matrice est de 5x11. Pour une matrice de 5x8 :
* Le 1er caractère est accessible aux adresses 00h et 08h (de la DDRAM),
* Le 2e caractère est accessible aux adresses 01h et 09h,
* Le 8e caractère est accessible aux adresses 07h et 0Fh.
Pour configurer les caractères personnalisables :
* il faut appeler la fonction « Set CGRAM address » où les bits « ACG5 ACG4 ACG3 » correspondent à l’adresse du caractère (ex : « 010 » pour le 3e caractère) et les bits « ACG2 ACG1 ACG0 » à la ligne dans la matrice du caractère (ex : « 011 » pour la 3e ligne en partant du haut),
* il faut ensuite appeler la fonction « Write data to CGRAM » où les bits « D7 D6 D5 » sont mis à 0 et les bits « D4 D3 D2 D1 D0 » correspondent à l’état des pixels (0 = éteint, 1 = allumé).
Pour une matrice de 5x11, même principe sauf que :
* Le 1er caractère est accessible aux adresses 00h et 08h (de la DDRAM) pour les 8 lignes du haut, et 01h et 09h pour les 3 autres lignes,
* Le 2e caractère est accessible aux adresses 02h et 0Ah pour les 8 lignes du haut, ainsi que 03h et 0Bh pour les 3 autres lignes,
* Le 4e caractère est accessible aux adresses 06h et 0Eh pour les 8 lignes du haut, ainsi que 07h et 0Fh pour les 3 autres lignes.

## Les jeux de caractères standards de la CGROM (Character Generator ROM)

Les 128 premiers caractères sont répartis comme suit :
* les 16 premiers caractères correspondent aux caractères personnalisés stockés en CGRAM,
* les 16 suivants sont des caractères de contrôle (flèches, guillemets, ...),
* les 96 suivants sont à peu près les caractères ASCII.
Pour les 128 derniers caractères, il existe plusieurs standards en fonction de la référence du contrôleur « HD44780Ux » où « x » correspond au ROM code :
* si ce « ROM code = A00 », alors le contrôleur utilise le jeu de caractère japonais ;
* si le « ROM code = A02 », alors le contrôleur utilise le jeu de caractère européen.
Il peut exister encore d'autres jeux de caractères notamment pour les clones KS0070B et SPLC780A1.
Il faut se référer à la datasheet pour connaître la signification exacte de chaque emplacement de la CGROM, ou alors le vérifier expérimentalement.