{"id":931,"date":"2015-05-06T14:27:11","date_gmt":"2015-05-06T12:27:11","guid":{"rendered":"http:\/\/pila.fr\/wordpress\/?p=931"},"modified":"2015-05-06T14:31:13","modified_gmt":"2015-05-06T12:31:13","slug":"librairie-pour-afficheurs-lcd-hd44780-sur-pic-version-3","status":"publish","type":"post","link":"https:\/\/pila.fr\/wordpress\/archives\/931","title":{"rendered":"Librairie pour afficheurs LCD hd44780 sur PIC : Version 3"},"content":{"rendered":"<p>Ayant commenc\u00e9 un projet utilisant un afficheur LCD \u00e0 contr\u00f4leur HD44780, j&rsquo;ai ressorti ma petite <a href=\"http:\/\/pila.fr\/wordpress\/?p=40\" target=\"_blank\">biblioth\u00e8que qui va bien<\/a>. Seulement, elle a l&rsquo;inconv\u00e9nient de modifier tous les bits du port connect\u00e9 au LCD, m\u00eame ceux qui peuvent \u00eatre d\u00e9di\u00e9s \u00e0 autre chose. Ce comportement emp\u00eache par exemple le fonctionnement de l&rsquo;afficheur sur la carte PICDEM2PLUS, sur laquelle je travaille. J&rsquo;ai donc d\u00e9cid\u00e9 d&rsquo;y apporter quelques petites modifications, qui se sont rapidement transform\u00e9es en r\u00e9\u00e9criture d&rsquo;une grande partie du code.<\/p>\n<div id=\"attachment_934\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-934\" class=\"size-full wp-image-934\" src=\"http:\/\/pila.fr\/wordpress\/wp-content\/uploads\/PICDEM2PLUS_lcd.jpg\" alt=\"Avec des vrais morceaux de barre de progression \u00e0 l'int\u00e9rieur !\" width=\"500\" height=\"339\" srcset=\"https:\/\/pila.fr\/wordpress\/wp-content\/uploads\/PICDEM2PLUS_lcd.jpg 500w, https:\/\/pila.fr\/wordpress\/wp-content\/uploads\/PICDEM2PLUS_lcd-300x203.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><p id=\"caption-attachment-934\" class=\"wp-caption-text\">Avec des vrais morceaux de barre de progression \u00e0 l&rsquo;int\u00e9rieur !<\/p><\/div>\n<p>La nouvelle biblioth\u00e8que est disponible sur sa <a href=\"https:\/\/gitlab.com\/Pilatomic\/pic-hd44780-lib\" target=\"_blank\">page GitLab<\/a>, et son fonctionnement est d\u00e9crit ci-dessous : <!--more--><\/p>\n<h3>R\u00e9sum\u00e9<\/h3>\n<p>Cette biblioth\u00e8que permet le pilotage d&rsquo;un afficheur LCD \u00e0 base de contr\u00f4leur HD44780. La communication s&rsquo;effectue en mode 4 bits, sur les 4 bits de points fort ou de poids faible d&rsquo;un port quelconque d&rsquo;un microcontr\u00f4leur PIC, sans modifier les bits inutilis\u00e9s. Elle est pr\u00e9vue pour le compilateur XC8 de Microchip. Elle autorise l&rsquo;affichage de cha\u00eene de caract\u00e8res, de variables enti\u00e8res non sign\u00e9es sur 8 ou 16 bits, de barres de progressions sur toute une ligne, et l&rsquo;exploitation des 7 caract\u00e8res personnalisables de l&rsquo;afficheur.<\/p>\n<h3>Fichiers<\/h3>\n<p>Cette biblioth\u00e8que est compos\u00e9e de 4 fichiers :<\/p>\n<ul>\n<li><strong>config.h<\/strong> : contient les param\u00e8tres relatifs au mat\u00e9riel utilis\u00e9.<\/li>\n<li><strong>hd44780.h<\/strong> : contient les en-t\u00eates des fonctions disponibles.<\/li>\n<li><strong>hd44780.c<\/strong> : contient toutes les fonctions disponibles.<\/li>\n<li><span class=\"str-truncated\"><strong>HD44780SamplePICDEM2PLUS.c<\/strong> : un exemple d&rsquo;utilisation pour la carte de d\u00e9veloppement PICDEM2PLUS<\/span><\/li>\n<\/ul>\n<h3>Initialisation de l&rsquo;afficheur<\/h3>\n<p>Elle s&rsquo;effectue \u00e0 l&rsquo;aide de la fonction <strong><em>void LCDinit(uint8_t param)<\/em><\/strong>. Elle doit pr\u00e9c\u00e9der toute autre appel de fonction li\u00e9 \u00e0 l&rsquo;afficheur. Il est pr\u00e9f\u00e9rable de laisser une temporisation de 50ms entre la mise sous tension de l&rsquo;afficheur et l&rsquo;appel de cette fonction, afin de laisser le temps au contr\u00f4leur de l&rsquo;afficheur de d\u00e9marrer. Il est possible de passer 3 valeurs diff\u00e9rentes en param\u00e8tre, influen\u00e7ant l&rsquo;apparence du curseur <em>LCD_INIT_CURSOR_DISABLED<\/em> : L&#8217;emplacement actuel du curseur n&rsquo;est pas visible <em>LCD_INIT_CURSOR_ENABLED<\/em>\u00a0 : L&#8217;emplacement actuel du curseur est soulign\u00e9 <em>LCD_INIT_CURSOR_BLINKING<\/em> : L&#8217;emplacement actuel du curseur clignote<\/p>\n<h3>D\u00e9placement du curseur, effacement<\/h3>\n<p>Le positionnement du curseur \u00e0 un emplacement sp\u00e9cifi\u00e9 s&rsquo;effectue par appel de la fonction <strong><em>LCDpos(x,y)<\/em><\/strong>, o\u00f9 <em>x<\/em> repr\u00e9sente la ligne (0 pour la premi\u00e8re ligne), et <em>y<\/em> le caract\u00e8re sur cette ligne (0 pour le 1er) La macro <strong><em>LCDhome()<\/em><\/strong> permet de ramener le curseur en haut \u00e0 gauche de l&rsquo;afficheur La macro <strong><em>LCDclear()<\/em><\/strong> efface l&rsquo;afficheur, et place le curseur en haut \u00e0 gauche<\/p>\n<h3>\u00a0Afficher du texte<\/h3>\n<p>L&rsquo;affichage du texte se fait gr\u00e2ce aux fonctions <strong><em>LCDprintConst(const char string[])<\/em><\/strong> et <strong><em>LCDprint(char string[])<\/em><\/strong>, la premi\u00e8re permettant d&rsquo;\u00e9crire directement le texte en param\u00e8tre, la seconde n\u00e9cessitant l&rsquo;instanciation d&rsquo;une variable contenant le texte : Exemple :<\/p>\n<blockquote><p>\u00a0LCDprintConst(\u00ab\u00a0Hello \u00ab\u00a0); char myString[] = \u00ab\u00a0World !\u00a0\u00bb; LCDprint(myString);<\/p><\/blockquote>\n<h3>Afficher une variable num\u00e9rique<\/h3>\n<p>Les fonctions <strong><em>LCDvalue8fp(uint8_t value, uint8_t decimale)<\/em><\/strong> et<strong><em> LCDvalue16fp(uint16_t value, uint8_t decimale)<\/em> <\/strong>permettent l&rsquo;affichage de variables num\u00e9riques non sign\u00e9es, stock\u00e9es respectivement sur 8 bits et sur 16 bits. La valeur affich\u00e9e correspond \u00e0 <em>value<\/em> divis\u00e9 par 10^<em>decimale<\/em>. Par exemple, pour value = 102, et decimale = 2, la valeur 1.02 s&rsquo;affiche. Avant l&rsquo;appel de ces fonctions, il faut placer le curseur \u00e0 droite de la zone o\u00f9 la valeur doit s&rsquo;afficher. Les macros <strong><em>LCDvalue8(x)<\/em><\/strong> et <strong><em>LCDvalue16(x)<\/em><\/strong>, permettent d&rsquo;ignorer le param\u00e8tre d\u00e9cimale, et d&rsquo;offrir une compatibilit\u00e9 avec la version pr\u00e9c\u00e9dente de cette biblioth\u00e8que<\/p>\n<h3>Utilisation de caract\u00e8res personnalis\u00e9s<\/h3>\n<p>Il est possible d&rsquo;enregistrer 8 caract\u00e8res personnalis\u00e9s dans la m\u00e9moire de caract\u00e8res de l&rsquo;afficheur, gr\u00e2ce aux fonctions <strong><em>LCDsetCustomChar(uint8_t carnumber, uint8_t * car)<\/em><\/strong> et <strong><em>LCDsetCustomCharConst(uint8_t carnumber, const uint8_t * car)<\/em><\/strong>. Le param\u00e8tre <em>carnumber<\/em> correspond au num\u00e9ro de la banque m\u00e9moire o\u00f9 stocker le caract\u00e8re, de 0 \u00e0 7. Le param\u00e8tre <em>car<\/em> est un tableau de 8 char repr\u00e9sentants le caract\u00e8re \u00e0 afficher, ligne par ligne. L&rsquo;appel de cette fonction ram\u00e8ne le curseur en haut \u00e0 gauche de l\u2019afficheur. Exemple d&rsquo;un caract\u00e8re personnalis\u00e9 ( smiley ) :<\/p>\n<blockquote><p>{0b00001010,\\ 0b00001010,\\ 0b00001010,\\ 0b00000000,\\ 0b00010001,\\ 0b00001110,\\ 0b00000000,\\ 0b00000000}<\/p><\/blockquote>\n<p>Il est d\u00e9conseill\u00e9 d&rsquo;utiliser la derni\u00e8re ligne, celle-ci \u00e9tant occup\u00e9e par le curseur, lorsque celui-ci est activ\u00e9. L&rsquo;affichage d&rsquo;un caract\u00e8re personnalis\u00e9 s&rsquo;effectue soit en \u00e9crivant la valeur correspondante dans une chaine de caract\u00e8re (0x00 \u00e0 0x07), soit gr\u00e2ce \u00e0 la macro <strong><em>LCDuseCustomChar(x)<\/em><\/strong>, en pr\u00e9cisant le num\u00e9ro de la banque m\u00e9moire du caract\u00e8re personnalis\u00e9 \u00e0 afficher (de 0 \u00e0 7)<\/p>\n<h3>Afficher une barre de progression<\/h3>\n<p>Cette biblioth\u00e8que permet \u00e9galement l&rsquo;affichage de bar de progressions, moyennant l&rsquo;utilisation des caract\u00e8res personnalis\u00e9s 0 \u00e0 5. La fonction <strong><em>LCDsetupProgressBar(void)<\/em><\/strong> permet d&rsquo;enregistrer les caract\u00e8res sp\u00e9ciaux n\u00e9cessaires pour la barre de progression. Cette fonction doit \u00eatre appel\u00e9e une fois, avant la fonction <strong><em>LCDprogressBar<\/em><\/strong> La fonction <strong><em>LCDprogressBar(uint8_t line, uint8_t value, uint8_t total)<\/em><\/strong> permet alors d&rsquo;afficher une barre de progression sur toute la ligne <em>line<\/em>, dans la valeur correspond au quotient de <em>value<\/em> sur <em>total<\/em> : <em>value<\/em> = 0 -&gt; barre vide, <em>value<\/em> = <em>total<\/em> -&gt; barre pleine<\/p>\n<h3>Conclusion<\/h3>\n<p>Cette nouvelle mouture corrige la plupart de d\u00e9fauts et des lacunes de la version pr\u00e9c\u00e9dente, je l&rsquo;ai utilis\u00e9 et am\u00e9lior\u00e9 toute la semaine, je pense que la plupart des bugs ont \u00e9t\u00e9 corrig\u00e9es, mais n&rsquo;h\u00e9sitez pas \u00e0 me signaler si quelque chose vous semble anormal, ou si mon style de code vous semble \u00e9trange, je suis avant tout programmeur amateur, et d\u00e9sireux de me perfectionner. J&rsquo;esp\u00e8re que cette petite biblioth\u00e8que vous sera aussi utile qu&rsquo;\u00e0 moi \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ayant commenc\u00e9 un projet utilisant un afficheur LCD \u00e0 contr\u00f4leur HD44780, j&rsquo;ai ressorti ma petite biblioth\u00e8que qui va bien. Seulement, elle a l&rsquo;inconv\u00e9nient de modifier tous les bits du port connect\u00e9 au LCD, m\u00eame ceux qui peuvent \u00eatre d\u00e9di\u00e9s \u00e0 autre chose. Ce comportement emp\u00eache par exemple le fonctionnement de l&rsquo;afficheur sur la carte PICDEM2PLUS, &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/pila.fr\/wordpress\/archives\/931\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,8],"tags":[26,24,21,27,22,71],"class_list":["post-931","post","type-post","status-publish","format-standard","hentry","category-electronique","category-prog","tag-afficheur","tag-bibliotheque","tag-hd44780","tag-lcd","tag-pic","tag-xc8","item-wrap"],"_links":{"self":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/comments?post=931"}],"version-history":[{"count":18,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/931\/revisions"}],"predecessor-version":[{"id":952,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/931\/revisions\/952"}],"wp:attachment":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/media?parent=931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/categories?post=931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/tags?post=931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}