Bonjour tous le monde !
J'expose mon problème
Matériel
- PIC16F690
- LCD MC16021E8 SBLW
- PicKit 2
J'ai réussi à faire fonctionner tout ce joli monde en assembleur, mais maintenant que je veux passer au C (oui je suis plus à l'aise avec le C) je n'y arrive pas. Pour voir comment je pouvais faire j'ai récupérer un code tout fait sur "Angeliz", suivit leur câblage sauf pour... le quartz ! et je soupçonne que là est mon problème. Je veux utiliser le temps du PIC sans passer par un Quartz et je dois avouer que je m'y perd. Mon branchement est des plus simple, juste le pic et le LCD (+un potard pour le contraste). Je vous poste le code.
Le main.c
le lcd.c :Code:#include <htc.h> #include "lcd.h" void Message_Lcd(const char* texte); void main(void) { TRISC=0; // portC pour lcd 44780 OPTION=0b10000101; // initialise TMR0 pas de 64µs Ini_Lcd(); // Initialisation lcd Efface_LCD(); Ligne_LCD(1); Message_Lcd("Angeliz@free.fr"); Ligne_LCD(2); Message_Lcd("Oups ! ca marche"); while(1); // le cours du programme se termine } 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); }
Merci à vousCode:#include <htc.h> #include "lcd.h" #include "timer.c" 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 ***** PORTC=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 } 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);}
-----