Bonjour,
C'est la première fois que j'écris un message sur ce forum. Je pense que ce type de problème (voir titre) et pour vous quelque chose de commun. J'ai trouvé de nombreux sujet sur des forums parlant de l'initialisation d'un LCD avec un pic16f877 mais je n'arrive pas à trouver le problème de mon code.
LCD: NewHaven display NHD-C0220AZFSW-FTW
Je programme sous mplab avec comme compilateur c: hi-tech.
Je pose mon code complet. Si vous pouviez m'aider car le problème est que le LCD n'affiche rien. J'ai vérifié les branchements (je suis en 4 bits, sur 2 lignes ...)
Merci d'avanceCode:#include <htc.h> #include "delay.h" #include "pic16f877.h" #define PIC_CLK 20 /*fréquence en MHz (4 MHz)*/ //-------------------------------Déclaration de fonction------------------------- void init_PIC(void); void LCD_INIT(void); // Fonction d'initialisation du LCD en mode 4 bits, LCD 2x16, matrice caractère 5x8 void lcd_write(unsigned char data); // Fonction qui prend en paramettre les données sur 8bits et les écrits en mode 4bits dans le LCD void write_at(const char* texte, char at); // Ecrit la chaine "texte" à l'emplacement "at" void LCD_STROBE(void); void DelayTicks( int ticks); void ClearLcd(); //-------------------------------Définition des I/O------------------------------ #define LED_POWER RA3 #define POUSS_01 RD5 #define POUSS_02 RD6 #define LCD_D4 RB4 #define LCD_D5 RB5 #define LCD_D6 RB6 #define LCD_D7 RB7 #define LCD_RS RB3 #define LCD_EN RB2 void LCD_STROBE(void) { LCD_EN=1; DelayUs(2); LCD_EN=0; } void main(void) { init_PIC(); // Temps d'attente pendant le démarrage du LCD DelayMs(2000); LCD_INIT(); LED_POWER=0; for (;;) { LED_POWER=1; write_at("Romain :", 0x00); DelayMs(2000); LED_POWER=0; DelayMs(2000); } } void DelayMs(unsigned char cnt) { unsigned char i; do { i=4; do { DelayUs(250); } while(--i); } while(--cnt); } void init_PIC(void) { PORTA = 0; TRISA = 0b00000000; PORTB = 0; TRISB = 0b00000000; PORTC = 0; TRISC = 0b01000000; PORTD = 0; TRISD = 0b11110000; //gestion du PWM TRISC=0x80; // Port C en sortie sauf C7 ( RX de l'UART ) PR2=77; // définit la période du signal PWM ( 25µS à 12 Mhz ) CCP1CON=0x0C; // CCP1CON.5:4 = bits de poids fort du cycle = 0 , mode PWM CCPR1L=38; // au départ la valeur du signal à 1 dans le cycle est égale à 38 ( 50% ) // modifiez cette valeur pour modifier le rapport cyclique T2CON=0x04; // prescaler et postscaler =1 , timer 2 on } // Fonction d'initialisation du LCD en mode 4 bits, LCD 2x16, matrice caractère 5x8 void LCD_INIT() { DelayTicks( 10000); LCD_RS=0; LCD_D5=1; LCD_D4=0; LCD_STROBE; // init! DelayTicks( 1000); lcd_write(0x28); DelayTicks( 1000); lcd_write(0x0C); DelayTicks( 1000); ClearLcd(); lcd_write(0x02); DelayTicks( 1000); LCD_RS=1; lcd_write(0x48); lcd_write(0x65); lcd_write(0x6C); lcd_write(0x6C); lcd_write(0x6F); } void DelayTicks( int ticks) { int ctr; for( ctr=0; ctr<ticks; ctr++); } void ClearLcd() { // Clear display LCD_RS=0; lcd_write(0x01); DelayTicks( 1000); } // Fonction qui prend en paramettre les données sur 8bits et les écrits en mode 4bits dans le LCD void lcd_write(unsigned char data) { /* LCD_DATA = ( ( data >> 4 ) & 0x0F ); // On sélectionne les 4 bits de poids fort LCD_STROBE(); Delay250Us(); LCD_DATA = ( data & 0x0F ); // Puis on sélectionne les 4 bits de poids faible LCD_STROBE(); Delay250Us(); */ if(data & 0x80) LCD_D7=1; else LCD_D7=0; if(data & 0x40) LCD_D6=1; else LCD_D6=0; if(data & 0x20) LCD_D5=1; else LCD_D5=0; if(data & 0x10) LCD_D4=1; else LCD_D4=0; LCD_STROBE; DelayMs(1); if(data & 0x08) LCD_D7=1; else LCD_D7=0; if(data & 0x04) LCD_D6=1; else LCD_D6=0; if(data & 0x02) LCD_D5=1; else LCD_D5=0; if(data & 0x01) LCD_D4=1; else LCD_D4=0; LCD_STROBE; DelayMs(1); } // Ecrit le caractère "caractere" à l'emplacement "at" void write_char_at(char caractere, char at) { LCD_RS = 0; lcd_write(0b10000000 | at); // Set DDRAM address : Emplacement "at" LCD_RS = 1; lcd_write(caractere); // Affichage du caractère "caractere" } void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } // Ecrit le caractère "caractere" à l'emplacement actuel du curseur void write_char(char caractere) { LCD_RS = 1; lcd_write(caractere); // Affichage du caractère "caractere" } // Efface l'écran void clear() { LCD_RS = 0; lcd_write(1); // Efface //DelayMs(1); //DelayMs(1); //DelayUs(1000); //DelayUs(1000); } // Ecrit la chaine "texte" à l'emplacement "at" void write_at(const char* texte, char at) { char i =0; LCD_RS = 0; lcd_write(0b10000000 | at); // Set DDRAM address : Emplacement "at" LCD_RS = 1; do { lcd_write(texte[i]); // Affichage le caractère i de la chaine texte i++; } while(texte[i]!='\0'); }
-----