Bonjour à tous.
J'essaye en ce moment, pour un projet, de dompter un afficheur LCD 4x20 lignes display204A de chez displaytech. En m'aidant de la datasheet et en googlisant, j'ai réussi à comprendre certaines choses sur le fonctionnement. En m'inspirant GRANDEMENT du site http://nalhossri.free.fr/LCD4bits.h/LCD4bits.h.html (merci à lui), j'ai adapté son programme à mon pic. Enfin c'est ce que je pensais. Avec le programme suivant, lorsque je lance l’exécution, il ne se passe RIEN. Même la variation du contraste de l'écran avec VO ne fonctionne pas. Si vous pouviez m'aider, je vous en serais reconnaissant.
Merci.
#include<p18f4550.h>
// met le portD comme data
#define DATA PORTD
//définir les 3 LSB du port E comme RS/RW/E
#define LCD_RS PORTEbits.RE0
#define LCD_RW PORTEbits.RE1
#define LCD_E PORTEbits.RE2
//fonction qui envoie un octet de controle pour modifier la config du LCD
void ecr_ctrl(byte ctrl)
{
DATA=ctrl; //ctrl placé sur le bus de donnée
LCD_RS=0; //envoie un octet de COMMANDE
LCD_RW=0; //écriture dans la ram du LCD
LCD_E=1;
LCD_E=0; //validation par front descendant sur E
busy_lcd; //test du busy
}
/////fonction du test busy: test si le LCD est prêt à recevoir un octet de donnée ou de commande.
void busy_lcd(void)
{
signed char temp; //valeur tampon
TRISD=0; //port data en entrée
LCD_RS=0; //commande
LCD_RW=1; //lecture de la RAM
do{
LCD_E=1;
temp=DATA; //port data dans temp
LCD_E=0;
LCD_E=1; //retard
LCD_E=1;
LCD_E=0; //validation sur E
}
while(temp<0); boucle si busy=1
LCD_RW=0; //ecriture dans la RAM
TRISD=1; //port data en sortie
}
/////initialisation du lcd
void init_lcd(curseur);
{
TRISD=0xFF; //portD en sortie
TRISE=0b00000111; //RE0,RE1,RE2 en sortie
busy_lcd(); //test du busy, attend que le lcd soit prêt
ecr_ctrl(0b00111000); // adressage 8 bits, afficheur 4 lignes, caractères 5*7
ecr_ctrl(0b00000110); // direction du curseur quand il bouge: droite
ecr_ctrl(0b000000001); // efface l'écran, et met curseur en haut à gauche
switch(curseur)
{
case 0:
ecr_ctrl(0b00001100); // affichage actif, curseur OFF
break;
case 1:
ecr_ctrl(0b00001110); //affichage actif, curseur ON, non clignotant
break;
case 2:
ecr_ctrl(0b00001111); //affichage actif, curseur ON, clignotant
break;
default:
break;
};
}
////fonction d'écriture d'un seul caractère sur l'afficheur
void ecr_data(byte data)
{
DATA=data; //met le mot sur le bus de donnée
LCD_RS=1; // octet de donnée
LCD_RW=0; //ecriture dans la RAM
LCD_E=1;
LCD_E=0; // validation avec E
busy_lcd();
}
void main ()
{
init_lcd(2);
}
-----