Bonjour cela fais deux/trois jours que j'essaye d'utiliser un afficheur LCD avec un pic 16f628a en programmant en C mais là je suis bloqué, j'ai fini d'écrire la fonction d'initialisation du LCD mais je pense que celle ci n'est pas bonne.
Voici mon code, celui-ci est commenté (pour une fois que je commente un truc), notez que le fichier lcd.h contient les prototypes des fonctions en dessous de la fonctions principale:
Je vous ai aussi mis le schéma du montage bien qu'avec les define l'on peut savoir où sont relié les broches.Code:#define D_LCD PORTB #define D4 PORTB.4 #define D5 PORTB.5 #define D6 PORTB.6 #define D7 PORTB.7 #define RS PORTB.2 #define E PORTB.3 #include "lcd.h" // Inclusion des prototypes des fonctions void main (void){ D_LCD = 0; // Initialisation des variables, mise à zéro des broches du PORTB. TRISB = 0b00000000;// Toutes les broches du port B sont en sortie. init_lcd(); // Appelle de la fonction d'initialisation de l'afficheur LCD } /** * Permet de consommer environ 45µs * @author ****** **/ void short_wait(void) { char temps; // Déclaration de temps, permet de faire des boucles de nop pour consommer du temps. for(temps=0;temps<3;temps++); // La boucle met environ 36µs pour s'executer et la fonction 6µs pour être appelé ce qui donne 42µs nop(); //On rajoute 3 nop(); pour consommer 3µs en plus (12 périodes à 4MHz) et ainsi atteindre 45µs nop();nop();nop(); } /** * Permet de consommer environ 1,5ms * @author ****** **/ void long_wait(void) { char temps; // Déclaration de temps, permet de faire des boucles de nop pour consommer du temps. for(temps=0;temps<165;temps++); // La boucle met environ 1,494 ms pour s'executer et la fonction 6µs pour être appelé ce qui donne 1,5ms pile. nop(); } /** * Fonction permettant de crée une pulsation sur la broche e pour valider une action * @author ****** **/ void enable(void) { nop(); nop(); E = 1; // On met E au niveau haut pour créer l'impulsion nop(); nop(); E = 0; // On le remet au niveau bas pour finir l'impulsion } /** * Fonction permettant d'effacer l'afficheur LCD * @author ****** **/ void clear_display(void) { // Commande pour effacer l'écran sur 8 bits : 0000 0001 D_LCD = 0b00000000; enable(); nop(); nop(); D_LCD = 0b00010000; enable(); nop(); nop(); // Pas besoin de temps d'attente pour cette commande } /** * Fonction permettant d'initialiser le LCD en mode 4 bits * @author ****** **/ void init_lcd(void) { unsigned temps : 16; for(temps=0;temps<2118;temps++); // Boucle consommant environ 30ms permettant d'attendre que l'afficheur LCD se réveille long_wait(); // On force l'afficheur LCD à passer en mode 8 bits 3 fois D_LCD = 0b00110000; // = mode 8 bits enable(); // 3 long_wait() pour consommer 4.5ms (4.1ms mini marqué sur la doc) long_wait(); long_wait(); long_wait(); D_LCD = 0b00110000; enable(); // 3 short_wait() pour consommer 135µs (10*s mini sur la doc) short_wait(); short_wait(); short_wait(); D_LCD = 0b00110000; enable(); nop(); nop(); short_wait(); // Maintenant on passe l'afficheur LCD en mode 4 bits D_LCD = 0b0010000; // = mode 4 bits enable(); nop(); nop(); short_wait(); // On ré-envoie les paramètres de l'afficheur mais en deux parties cette fois et entier surtout D_LCD = 0b00100000;// Envoie des 4 bits de poids forts enable(); nop(); nop(); D_LCD = 0b10000000; // N = 1 --> deux lignes et F n'est important que si une ligne est utilisé enable(); nop(); nop(); short_wait(); // On attends un peu le temps que l'afficheur prenne la commande en compte clear_display(); // On efface l'écran // Paramètre d'affichage // Commande sur 8 bits : 0000 1000 D_LCD = 0b0000000; // Envoie des 4 bits de poids forts enable(); nop(); nop(); D_LCD= 0b10000000; // 4 bits de poids faible enable(); nop(); nop(); short_wait(); // Mode d'entrée // Commande sur 8 bits : 0000 0110 D_LCD = 0b00000000; // Envoie des 4 bits de poids forts enable(); nop(); nop(); D_LCD = 0b01100000;// 4 bits de poids faible enable(); nop(); nop(); short_wait(); D_LCD = 0; // On remet les broches à zéro (facultatif) // L'afficheur LCD est maintenant initialisé !!! }
Donc c'est un afficheur 2*16 et je l'utilise en mode 4 bits, en faite quand dans l'initialisation
D = 1 et C = 1 (donc display sur on et cursor sur on) je devrais voir un curseur s'afficher non ?
-----