Librairie pour afficheurs LCD hd44780 sur PIC : Version 3

Ayant commencé un projet utilisant un afficheur LCD à contrôleur HD44780, j’ai ressorti ma petite bibliothèque qui va bien. Seulement, elle a l’inconvénient de modifier tous les bits du port connecté au LCD, même ceux qui peuvent être dédiés à autre chose. Ce comportement empêche par exemple le fonctionnement de l’afficheur sur la carte PICDEM2PLUS, sur laquelle je travaille. J’ai donc décidé d’y apporter quelques petites modifications, qui se sont rapidement transformées en réécriture d’une grande partie du code.

Avec des vrais morceaux de barre de progression à l'intérieur !

Avec des vrais morceaux de barre de progression à l’intérieur !

La nouvelle bibliothèque est disponible sur sa page GitLab, et son fonctionnement est décrit ci-dessous :

Résumé

Cette bibliothèque permet le pilotage d’un afficheur LCD à base de contrôleur HD44780. La communication s’effectue en mode 4 bits, sur les 4 bits de points fort ou de poids faible d’un port quelconque d’un microcontrôleur PIC, sans modifier les bits inutilisés. Elle est prévue pour le compilateur XC8 de Microchip. Elle autorise l’affichage de chaîne de caractères, de variables entières non signées sur 8 ou 16 bits, de barres de progressions sur toute une ligne, et l’exploitation des 7 caractères personnalisables de l’afficheur.

Fichiers

Cette bibliothèque est composée de 4 fichiers :

  • config.h : contient les paramètres relatifs au matériel utilisé.
  • hd44780.h : contient les en-têtes des fonctions disponibles.
  • hd44780.c : contient toutes les fonctions disponibles.
  • HD44780SamplePICDEM2PLUS.c : un exemple d’utilisation pour la carte de développement PICDEM2PLUS

Initialisation de l’afficheur

Elle s’effectue à l’aide de la fonction void LCDinit(uint8_t param). Elle doit précéder toute autre appel de fonction lié à l’afficheur. Il est préférable de laisser une temporisation de 50ms entre la mise sous tension de l’afficheur et l’appel de cette fonction, afin de laisser le temps au contrôleur de l’afficheur de démarrer. Il est possible de passer 3 valeurs différentes en paramètre, influençant l’apparence du curseur LCD_INIT_CURSOR_DISABLED : L’emplacement actuel du curseur n’est pas visible LCD_INIT_CURSOR_ENABLED  : L’emplacement actuel du curseur est souligné LCD_INIT_CURSOR_BLINKING : L’emplacement actuel du curseur clignote

Déplacement du curseur, effacement

Le positionnement du curseur à un emplacement spécifié s’effectue par appel de la fonction LCDpos(x,y), où x représente la ligne (0 pour la première ligne), et y le caractère sur cette ligne (0 pour le 1er) La macro LCDhome() permet de ramener le curseur en haut à gauche de l’afficheur La macro LCDclear() efface l’afficheur, et place le curseur en haut à gauche

 Afficher du texte

L’affichage du texte se fait grâce aux fonctions LCDprintConst(const char string[]) et LCDprint(char string[]), la première permettant d’écrire directement le texte en paramètre, la seconde nécessitant l’instanciation d’une variable contenant le texte : Exemple :

 LCDprintConst(« Hello « ); char myString[] = « World ! »; LCDprint(myString);

Afficher une variable numérique

Les fonctions LCDvalue8fp(uint8_t value, uint8_t decimale) et LCDvalue16fp(uint16_t value, uint8_t decimale) permettent l’affichage de variables numériques non signées, stockées respectivement sur 8 bits et sur 16 bits. La valeur affichée correspond à value divisé par 10^decimale. Par exemple, pour value = 102, et decimale = 2, la valeur 1.02 s’affiche. Avant l’appel de ces fonctions, il faut placer le curseur à droite de la zone où la valeur doit s’afficher. Les macros LCDvalue8(x) et LCDvalue16(x), permettent d’ignorer le paramètre décimale, et d’offrir une compatibilité avec la version précédente de cette bibliothèque

Utilisation de caractères personnalisés

Il est possible d’enregistrer 8 caractères personnalisés dans la mémoire de caractères de l’afficheur, grâce aux fonctions LCDsetCustomChar(uint8_t carnumber, uint8_t * car) et LCDsetCustomCharConst(uint8_t carnumber, const uint8_t * car). Le paramètre carnumber correspond au numéro de la banque mémoire où stocker le caractère, de 0 à 7. Le paramètre car est un tableau de 8 char représentants le caractère à afficher, ligne par ligne. L’appel de cette fonction ramène le curseur en haut à gauche de l’afficheur. Exemple d’un caractère personnalisé ( smiley ) :

{0b00001010,\ 0b00001010,\ 0b00001010,\ 0b00000000,\ 0b00010001,\ 0b00001110,\ 0b00000000,\ 0b00000000}

Il est déconseillé d’utiliser la dernière ligne, celle-ci étant occupée par le curseur, lorsque celui-ci est activé. L’affichage d’un caractère personnalisé s’effectue soit en écrivant la valeur correspondante dans une chaine de caractère (0x00 à 0x07), soit grâce à la macro LCDuseCustomChar(x), en précisant le numéro de la banque mémoire du caractère personnalisé à afficher (de 0 à 7)

Afficher une barre de progression

Cette bibliothèque permet également l’affichage de bar de progressions, moyennant l’utilisation des caractères personnalisés 0 à 5. La fonction LCDsetupProgressBar(void) permet d’enregistrer les caractères spéciaux nécessaires pour la barre de progression. Cette fonction doit être appelée une fois, avant la fonction LCDprogressBar La fonction LCDprogressBar(uint8_t line, uint8_t value, uint8_t total) permet alors d’afficher une barre de progression sur toute la ligne line, dans la valeur correspond au quotient de value sur total : value = 0 -> barre vide, value = total -> barre pleine

Conclusion

Cette nouvelle mouture corrige la plupart de défauts et des lacunes de la version précédente, je l’ai utilisé et amélioré toute la semaine, je pense que la plupart des bugs ont été corrigées, mais n’hésitez pas à me signaler si quelque chose vous semble anormal, ou si mon style de code vous semble étrange, je suis avant tout programmeur amateur, et désireux de me perfectionner. J’espère que cette petite bibliothèque vous sera aussi utile qu’à moi 🙂

5 Commentaires

1 ping

Passer au formulaire de commentaire

  1. Salut, merci pour la lib!!

    Il y a une raison (autre que hardware) qui limite le nombre de caractères spéciaux que l’on peut envoyer avec ton code?

    Merci de ta réponse

  2. Salut,

    Si tu parle des caractères personnalisables, les afficheurs basé sur le contrôleur HD44780 n’en supportent que 8, et encore, lorsque la dimension d’un caractère est 5*8. Si les caractères mesure 5*10, seuls 4 caractère spéciaux peuvent être stockés.

  3. Bonjour
    Je suis intéressé par cet article et surtout par la librairie d’accès à l’afficheur.
    c’est un gros travail. Bravo !
    Est-il possible de me transmettre cette librairie (en c pour MPLABX) par mail ?
    Merci d’avance
    Guy Desbief

  4. Bonjour,

    Le code est toujours disponible sur la page gitlab donnée en lien dans l’article 🙂

    • Nicolas LAHCEN sur 24 novembre 2021 à 9h22
    • Répondre

    Bonjour,
    Merci pour cet article. Est ce que ce code est applicable à un pic16F18857.
    En effet, j’ai un projet de fin d’études avec un pic16f et un capteur cardiaque, et je dois afficher la valeur en temps réel sur l’écran LCD.
    A l’heure actuelle, j’ai quelques difficulté pour afficher un simple caractère…
    Si vous pourriez m’aider. Merci d’avance
    Cordialement
    Nicolas

  1. […] LIBRARIE OBSOLETE, voire ICI pour la nouvelle […]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.