Librairie pour afficheurs LCD hd44780 sur PIC avec le compilateur Microchip XC8

/!\ Nouvelle version dispo ICI

Permettant la mise en place d’interfaces simples et lisibles avec l’utilisateur, les afficheurs LCD comptent parmi les périphériques les plus souvent utilisés en association avec les micro-contrôleurs. Cependant, sans être d’une grande complexité, leur contrôle n’est pas des plus évidents. De plus, passer du temps à faire fonctionner un afficheur LCD sur un projet bien plus grand est souvent frustrant, et l’utilisation de fonctions pré-existantes permet de grandement simplifier le code écrit.

example afficheur

Afficheur LCD alphanumérique 4 lignes 20 colonnes piloté par un PIC.

 

J’ai donc codé une petite librairie regroupant les fonctions essentielles à l’utilisation d’un afficheur LCD utilisant le protocole hd44780 (la grande majorité des afficheurs alphanumériques).

Une archive contenant les fichiers nécessaires est disponible ici : LCDhd44780lib1. Nouvelle version disponible : LCDhd44780lib2.Au programme quelques optimisation, clarification du code,  correction de bug, et portage sous XC8.

L’afficheur est ici interfacé en mode 4 bits (nécessite d’envoyer 2 fois 4 bits de données/commande au lieu de 8 en une seule fois) et sans tenir compte du drapeau busy de l’afficheur, pour minimiser le nombre de broches d’entrée/sortie nécessaires.

Celle ci contient 3 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.

Les paramètres disponibles dans le fichier param.h sont les suivants :

  • _XTAL_FREQ : doit correspondre à la fréquence de l’oscillateur utilisé. Permet d’assurer les valeurs des temporisations quelque soit la fréquence de l’oscillateur utilisé.
  • LCD_E : correspond à la broche du PIC qui pilote la broche E (validation) de l’afficheur.
  • LCD_RS : correspond à la broche du PIC qui pilote la broche RS (sélection instruction ou donnée) de l’afficheur.
  • LCD_PORT : correspond au port du PIC sur lequel l’afficheur est connecté. Seules les 4 broches de poids fort ( par exemple, RB7 RB6 RB5 et RB4 si c’est PORTB qui est choisi) sont utilisées, car l’afficheur est interfacé en mode 4 bits.
  • LCD_WIDTH : correspond au nombre de caractères affichables par le LCD sur un ligne.

Les fonctions disponibles sont ( les fonctions les plus importantes/utilisées sont en gras ) :

  • LCDinit() : permet l’initialisation de l’afficheur. Doit être appelée avant tout autre fonction, sans quoi le LCD n’affichera rien, ou n’importe quoi.
  • LCDwrite(char,char) : permet d’envoyer un octet de donnée (premier paramètre = LCD_DATA) ou de commande (LCD_COMMAND) à l’afficheur. .
  • LCDprint(char *) : permet d’afficher un suite de caractère.
  • LCDvalue(char) : affiche la valeur décimale d’un octet.
  • LCDpos(char line, char row) : permet de déplacer manuellement le curseur (attention : les numéros de ligne / colonne commencent à zéro)
  • LCDclear() : efface l’écran et ramene le curseur en haut à gauche de l’écran.
  • LCDcustomCar(char carnumber, char * car) : permet de stocker des caractères personnalisés dans l’afficheur. carnumber correspond au numéro du caractère, et le tableau d’octet car contient chaque ligne de pixel du caractère.

Le code fonctionne avec le compilateur gratuit XC8 de microchip, mais il doit être possible de le porter rapidement vers d’autres compilateurs. J’ai utilisées cette librairie sans encombre pour tous mes projets utilisant un afficheur LCD piloté par un PIC, mais si jamais vous découvrez un bug, n’hésitez par à me le signaler.

/!\ Nouvelle version dispo ICI

6 Commentaires

1 ping

Passer au formulaire de commentaire

    • sapher sur 24 novembre 2014 à 13h23
    • Répondre

    Faudrait mettre ça sur Github

  1. Salut Sapher,
    je pense que je le mettrai sur Gitorious à la prochaine révision.
    En fait ma découverte des outils de versionning est assez récente, donc certains projets un peu ancien n’en utilisent pas.

    • Ph Loutrel sur 31 décembre 2014 à 20h55
    • Répondre

    Bonjour
    c’est sympa de mettre ce code mais hélas il est incomplet par exemple LCD-COMMAND et LCD_DATA ne sont définies nulle part.
    Si ça t’intéresse je t’enverrai les corrections.

    Amicalement

  2. Bonjour,

    Ces constantes sont définies dans le fichier hd44780.h, qui est inclus au début du fichier hd44780.c. Peut-être n’avez vous extrait que le fichier hd44780.c ?

    Cordialement

  3. Bonjour,

    Et merci pour ce tuto et librairie.
    En compilant avec xc8, j’ai une erreur au niveau de LCDprint.
    Je pense que je ne dois pas mettre ce qu’il faut. J’ai essayé avec LCDprint(« hello »);
    Pourriez-vous mettre un exemple de la syntaxe correcte?
    Par avance merci

  4. Bonjour,

    Désolé pour le retard, le commentaire ne m’avait pas été signalé.
    Il faut déclarer les chaines de caractères en dehors de l’appel de la fonction :

    char maChaine[] = « Hello »;
    LCDprint(maChaine);

  1. […] 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 […]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.