Bonjour,
Il y a quelques mois je me suis lancé dans l'aventure des PICs.
Après quelques réussites en C et ASM, j'ai décidé de m'attaquer à un écran LCD avec un contrôleur Hitachi HD44780 (utilisation en mode 4 bits).
Après divers essais peu concluants, j'ai trouvé un code en C sur internet que je souhaiterais adapter à mon PIC (un 16F88).
J'ai donc adapté le code au 16F88 et à mon compilateur CC5X.
BUILD SUCCEEDED !
Certes, ça ne veut pas dire que le code est juste, mais bon...
Après câblage : RIEN ! Pas de caractère d'affiché, le LCD se comporte comme si il n'était pas connecté au PIC.
Première ligne noire, seconde rien...
Je joint le code modifié, si vous avez des suggestions je suis prenant !
Merci à tous pour votre aide
Programme principale :
Code:/*********************** projet Lcd HD 44780 QUARTZ 4Mhz 1cycle -> 1µs ************************/ #pragma chip PIC16F88 #include "lcdspi.h" // fichier du lcd HD 44780 void Message_Lcd(const char* texte); // fonction de transfert, d'un message vers lcd /************* debut du main *************************/ void main() { TRISB=0; // portB Output pour lcd 44780 ANSEL=0x00; // Sortie numériques OPTION_REG=0b10000101; // initialise TMR0, prédiviseur 64 : 1 cycle -> 64µs Ini_Lcd(); // Initialisation lcd Efface_LCD(); Ligne_LCD(1); Message_Lcd("Ceci est un test"); Ligne_LCD(2); Message_Lcd("Oui, un test..."); while(1); // le cours du programme se termine ici } /********** fin du main *******************************/ void Message_Lcd(const char* texte) // écriture d'une chaine de caractère { char cCount=0; while (texte[cCount] != 0 ) wr_Lcd(texte[cCount++],1); }
Fonction du LCD
Code:/* lcdspi.h */ #define pins PORTB #define Lcd_E PORTB.3=1; nop(); nop(); PORTB.3=0; #define Lcd_RS PORTB.2 unsigned char cL; void Efface_LCD(void); void Ligne_LCD(char cLigne); void Efface_LigneLCD(char cEff); void wr_Lcd(unsigned char cVar,unsigned char cLcd_RS); void Ini_Lcd(void); void Tempo(char ti); // tempo void Ini_Lcd(void) { // **** initialisation LCD ***** PORTB=0; Lcd_RS=0; for(cL=0;cL<2;cL++) {TMR0=1; while(TMR0 != 0);} //32ms afficheur pins=0x30; Tempo(189); // 4,3ms E inclus Tempo(254); // 150µs pins=0x20; Tempo(254); // 150µs //**** initialisation paramètres LCD ********************************** wr_Lcd(0x28,0); // 2 lignes wr_Lcd(1,0); // Efface l'affichage initialisation DD-ram wr_Lcd(0x0C,0); // Affichage des caractères wr_Lcd(6,0); // Déplacement vers la droite } void wr_Lcd(unsigned char cVar,unsigned char cLcd_RS) { char b3; Lcd_RS=cLcd_RS; b3=cVar & 0xF0; // envoi 4 bit poids fort pins=pins & 4; // copie du bit lcd_E pins=pins | b3; Tempo(255); pins=pins & 4; // envoi 4 bits poids faible b3=(cVar<<4); pins=pins | b3; Lcd_E; if((cVar>2) && (Lcd_RS==0)) TMR0=255; // tempo 86µs else TMR0=228; // tempo 1,7ms while(TMR0 != 0); } void Tempo(char ti) { Lcd_E; TMR0=ti; while(TMR0 != 0); } void Ligne_LCD(char cLigne) { if(cLigne==1) wr_Lcd(0x80,0); // afficheur se cale sur ligne 1 else if (cLigne==2) wr_Lcd(0xC0,0); // afficheur se cale sur ligne 2 } void Efface_LigneLCD(char cEff) { if(cEff==1) { wr_Lcd(0x80,0); // set DDRAM passe 1 ere ligne for(cL=0;cL<=15;cL++)wr_Lcd(0x20,1); // affiche des espaces (ascii): 0x20 } if(cEff==2) { wr_Lcd(0xC0,0); // set DDRAM passe 2 eme ligne for(cL=0;cL<=15;cL++)wr_Lcd(0x20,1); // affiche des espaces } } void Efface_LCD(void) {wr_Lcd(1,0);}
-----