Bonjour à tous,
Je me suis cassé la tête toute la journée et je n'arrive à rien, c'est pourquoi je fais appel à votre aide.
J'essaye de piloter un afficheur LCD 1x16 ref GDM1601C -> datasheet
J'ai essayé plusieurs fichiers qui fonctionnent sous CC5x et il m'est impossible d'afficher quoi que ce soit.
J'ai branché les connecteurs Data 4,5,6 et 7 aux bornes RC0,RC1,RC2 et RC3.
RS et EN respectivement sur RC4 et RC5, RW est à la masse.
Merci à tous de votre aide !
Voici mon code commenté :
#define ICD_DEBUG
#pragma config = 0x3F39
/**************************Defi ne**************************** *******/
#define TRUE 1
#define FALSE 0
/*************************defin e LCD*************************** ***/
#define RS PORTC.4 // Port RC4
#define EN PORTC.5 // Port RC5
#define flag_busy PORTC.3 // Port RC3
const char buffer[] = "Test LCD ";
/*********************** Function LCD *****************************/
void init_lcd(void);
void lcd_puts(const char *);
void lcd_putch(unsigned char);
void lcd_write_instr(unsigned char );
void lcd_write(unsigned char );
void lcd_busy(void);
void LCD_STROBE(void);
void lcd_home(void);
void lcd_clear(void);
void lcd_pos(unsigned char, unsigned char);
void delayms( char millisec);
/************* Debut du main *************************/
void main()
{
//configuration PortC en sortie
TRISC = 0x00;
OPTION = 0xCF;
GIE=0; //disable all interrupt
//configuration pour le LCD
init_lcd();
lcd_home();
lcd_clear();
//Le programme tourne dans cette boucle principale
while(1)
{
delayms(500);
lcd_pos(0,0);
lcd_puts(buffer);
lcd_pos(1,0);
lcd_putch('t');
}
}
/********** Fin du main ****************************** */
/****************************** ****************************** ********/
void LCD_STROBE(void)
{
EN = 1;
#asm
nop
nop
#endasm
EN = 0;
}
/****************************** ****************************** ********/
// Test le bit BF jusqu'a ce que le LCD soit ok
void lcd_busy(void)
{
static bit BF;
/*met en entree RC3*/
TRISC.3=1;
RS = 0; // selectionne registre
do
{
EN=1;
BF=flag_busy;
EN=0;
LCD_STROBE(); // lecture deuxieme demi-octet
}while(BF); // tant que BF=1
/*met en sortie RC3*/
TRISC.3=0;
}
/****************************** ****************************** ********/
// Ecriture d'un octet dans le LCD en mode 4 bits
//Most significant bit first
void lcd_write(unsigned char c)
{
char temp;
temp= (c>>4);
PORTC = temp;
LCD_STROBE();
PORTC = c;
LCD_STROBE();
}
/****************************** ****************************** ********/
//Ecrit une instruction dans LCD
void lcd_write_instr(unsigned char c)
{
lcd_busy();
RS = 0; // selectionne registre
lcd_write(c);
}
/****************************** ****************************** ********/
// Ecriture d'un caractere
void lcd_putch(unsigned char c)
{
lcd_busy();
RS = 1;
lcd_write(c);
}
/****************************** ****************************** ********/
// Ecriture d'une chaine de caracteres
void lcd_puts(const char * s )
{
while(*s )
lcd_putch(*s++);
}
/****************************** ****************************** ********/
/* initialise l'afficheur LCD en mode 4 bits */
void init_lcd(void)
{
char cpt;
RS = 0; // registre de controle
EN = 0;
delayms(15); // Attente power on
PORTC = 0x03; //ecrit 03 sur RC4:RC7 et recopie le reste
LCD_STROBE();
delayms(4);
PORTC = 0x03; //ecrit 03 sur RC4:RC7 et recopie le reste
LCD_STROBE();
/*delay=10+x*10 100us wait */
for (cpt=0;cpt<9;cpt++)
{
#asm
nop //1 cycle=1 usec
#endasm
}
PORTC = 0x03; //ecrit 03 sur RC4:RC7 et recopie le reste
LCD_STROBE();
/*delay=10+x*10 100us wait */
for (cpt=0;cpt<9;cpt++)
{
#asm
nop //1 cycle=1 usec
#endasm
}
PORTC = 0x02;
LCD_STROBE();
lcd_busy();
lcd_write_instr(0x28); // Mode 4 bit, 1/16, font 5x8 Function set
lcd_write_instr(0x0D); // display off
lcd_write_instr(0x01); // display on, blink cursor on
lcd_write_instr(0x06); // entry mode
}
/****************************** ****************************** ********/
void lcd_pos(unsigned char ligne,unsigned char pos)
/*positionne le cursor ligne, position*/
/*la premiere ligne est 0*/
{
char temp,temp1;
temp=(ligne*0x40);
temp1=temp+pos;
lcd_write_instr(temp1+0x80);
}
/****************************** ****************************** ********/
void lcd_clear(void)
/*efface screen*/
{
lcd_write_instr(0x01);
}
/****************************** ****************************** ********/
void lcd_home(void)
/*curseur home*/
{
lcd_write_instr(0x02);
}
/****************************** ****************************** ********/
void delayms( char millisec)
// Delays a multiple of 1 milliseconds at 4 MHz
// using the TMR0 timer
{
OPTION = 2; /* prescaler divide by 8 */
do {
TMR0 = 0;
clrwdt(); // only if watchdog enabled
while ( TMR0 < 125) // 125 * 8 = 1000
;
} while ( -- millisec > 0);
}
-----