Salut,
Je débute la prog sur un pic18f4550 et l'on m'a demandé de ne pas utiliser les .h spécifique à l'affichage pour que je me familiarise à l'utilisation des registres des pics etc... Je dois faire un CAN et l'afficher à l'écran... Mon lcd est un LCM1602A-NSW-BBS, même si d'après les datasheet je ne vois pas trop la différence entre tous les LCD.
J'ai fait ce code et l'ai testé sur mon easypic5, rien ne s'affiche à part les carreaux blancs de la première ligne de mon écran ( je suppose que la deuxième est morte mas bon... ).
Quoiqu'il en soit, je ne vois pas trop ce qu'il manque à mon prog...
Si vous pouvez me donner des conseils ^^.
// déclaration :
#include <p18f4550.h>
#include <delays.h>
/* Variables*/
#pragma config WDT = OFF // WatchDog désactivé.
#pragma config LVP = OFF // Mode basse consommation désactivé.
#pragma config FOSC = INTOSC_HS // Oscillateur interne.
//int i;
//int Anl;
//int affichage;
// Code :
void config(void);
//int analogique();
void initLcd(void) // TRISB étant en sortie Nous utilisons LAT plutot que PORT
{
TRISB = 0x00;
Delay10KTCYx(1); // Démarrage de l'écran.
LATBbits.LATB4 = 0; // RS en niveau bas : config du LCD.
//LATBbits.LATB6 = 0; // R/W en mode écriture. A zéro par défault ( à la masse )...
Delay10KTCYx(1);
// Mode 8 bits / 1 ligne / matrice 5*8. (*3)
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 1; // DB5.
LATBbits.LATB0 = 1; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0; // E validation.
Delay10KTCYx(1);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 1; // DB5.
LATBbits.LATB0 = 1; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0; // E validation.
Delay10KTCYx(1);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 1; // DB5.
LATBbits.LATB0 = 1; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0; // E validation.
Delay10KTCYx(1);
// Mode 4 bits (*2);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 1; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(10);
LATBbits.LATB5 = 0;
Delay10KTCYx(10);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(10);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(10);
LATBbits.LATB5 = 0;
Delay10KTCYx(10);
// Etape 3 : Mode 4 bits / 2 lignes / 5*8.
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(10);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 1; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0;
Delay10KTCYx(1);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 1; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(1);
PORTBbits.RB5 = 0;
Delay10KTCYx(1);
}
// display on, curseur off, blink off :
void display_on(void)
{
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0;
Delay10KTCYx(1);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 1; // DB7.
LATBbits.LATB2 = 1; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0;
Delay10KTCYx(1);
}
void clearDisplay(void)
{
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0;
Delay10KTCYx(1);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 1; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0;
Delay10KTCYx(1);
}
void waitData(void)
{
LATBbits.LATB4 = 1; // RS en niveau haut : le LCD attend des données (et non des instructions).
//LATBbits.LATB6 = 0; // R/W en mode écriture.
Delay10KTCYx(1);
}
void config(void){
// horloge à 8Mhz :
OSCCONbits.IRCF2=1;
OSCCONbits.IRCF1=1;
OSCCONbits.IRCF0=0;
//ADCON1 = 15;
/*
// comparateur par défaut :
CMCONbits.CM2=1;
CMCONbits.CM1=1;
CMCONbits.CM0=1;
*/
}
void main(void)
{
config();
initLcd();
clearDisplay();
waitData();
while(1)
{
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 1; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 0; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0;
Delay10KTCYx(1);
LATBbits.LATB5 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
Delay10KTCYx(1);
LATBbits.LATB3 = 0; // DB7.
LATBbits.LATB2 = 0; // DB6.
LATBbits.LATB1 = 0; // DB5.
LATBbits.LATB0 = 1; // DB4.
Delay10KTCYx(1);
LATBbits.LATB5 = 0;
Delay10KTCYx(1);
}
}
Une dernière question, je vais devoir afficher un long dans mon écran, quel est la méthode à suivre. faut il passer les bits 4 par 4 comme pour un octet ou faire autrement.
Merci.
-----