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.
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
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
Auteur
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.
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
Auteur
Bonjour,
Le code est toujours disponible sur la page gitlab donnée en lien dans l’article 🙂
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
[…] LIBRARIE OBSOLETE, voire ICI pour la nouvelle […]