Probleme afficheur ASCII

RemiiS Messages postés 2 Date d'inscription lundi 30 avril 2012 Statut Membre Dernière intervention 1 mai 2012 - 1 mai 2012 à 14:05
RemiiS Messages postés 2 Date d'inscription lundi 30 avril 2012 Statut Membre Dernière intervention 1 mai 2012 - 1 mai 2012 à 14:09
Bonjour a tous.
Apres plusieurs recherches sur votre forum (et beaucoup d'autres) en vain.
Je n'arrive pas a trouver solution a mon problème.

Je voudrais réaliser un module d'affichage de bureau pour chaudière a l'aide d'un programme gérant un afficheur 2x16 et bus CAN.
Mon problème se porte sur l'afficheur.

afficheur lcd 2x16 : FDCC1602G
contrôleur de l'afficheur : SPLC780D
Pic : 18f4580
Logiciel : MPLAB (version 8.66) + boitier ICD2 (Original)
compilateur : CCS

Je ne veux pas utiliser de fonction réaliser (exemple : LCD.C).
Mon initialisation se fais correctement.(affichage d'un curseur clignotant).
Mais lorsque je lui demande d'afficher un ou plusieurs caractères, d’après la table ASCII, il m'affiche autre chose. Apres plusieurs test, je me suis aperçus Que sur la table ASCII il se placer sur la bonne "ligne" mais rester dans la même colonne.
Je m'explique : Je veux afficher 0x41,0x42,0x53 (ABS),
l'afficheur va m'afficher 0xf1,0xf2,0xf3 (caractère spéciaux).
-> voir les test dans fenêtre,..., fenêtre.

Avais vous déjà eu un problème identique ?

#include <18F4580.h>			

#fuses HS,NOWDT,NOPROTECT,NOLVP // Configuration des Bits
#use delay(clock=20000000) // Oscillateur a 20MHz


/************ DEFINITION LIEE AU PIC *************************/

#define ENTREE PIN_D4 // definition de la touche Valide
#define ECHAP PIN_D6 // definition de la touche Sortie
#define PLUS PIN_D7 // definition de la touche +
#define MOINS PIN_D5 // definition de la touche -

/************* DEFINITION LIEE A AFFICHEUR *******************/

#define LCD_RS PIN_C6 // definition de l'entree RS
#define LCD_E PIN_C4 // definition de l'entree Enable
#define LCD_K PIN_C7 // definition de l'entree K retroeclairage
#define lcd_type 2 // LCD 2 lignes
#define LONG_CAR_LCD 16 // definition nmb carac. par ligne


/************** DEFINITION VARIABLE ************************/

char etatprecedent, lecture, sens, mola, molb;
char bouton;

/****************** FONCTION PULSE DE L'AFFICHEUR *************/

void pulseE() //création d'un Pulse
{
output_high(LCD_E); //E=1
delay_us(2);
output_low(LCD_E); //E=0
delay_us(2);
}

/************ FONCTION COMMANDE 8 BITS ****************/

void commande_8bit(int8 command) //commnande en 8bits
{
output_low(LCD_RS); //RS=0
delay_us(2);
output_c(command>>4); //ecriture quartet poids fort placé sur bus DB4-DB7
pulseE(); //ecriture validee par E
delay_us(10);
}

/************** FONCTION COMMANDE 4 BITS****************/

void commande_4bit(int8 command) //commande en 4bits
{
output_low(LCD_RS); //RS=0
delay_us(2);
output_c(command>>4); //ecriture quartet poids fort placé sur bus DB4-DB7
pulseE(); //ecriture validee par E
output_c(command); //ecriture quartet poids faible placé sur bus DB4-DB7
pulseE(); //ecriture validee par E
delay_us(50);
}

/************** FONCTION DONNEE 4 BITS ******************/
void donnee_4bit(int c)
{
output_high(LCD_RS); //RS=1
delay_us(2);
output_c(c>>4); //ecriture quartet poids fort placé sur bus DB4-DB7
pulseE(); //ecriture validee par E
output_c(c); //ecriture quartet poids faible placé sur bus DB4-DB7
pulseE(); //ecriture validee par E
delay_us(50);
}

/***************** FONCTION LIGNE COLONNE LCD ****************/

void lcd_gotoxy(int8 x, int8 y) // 1<x<16 et 1<y<2
{
int8 adresse;

switch(y)
{
case 1 : adresse=x; //ligne 1+colonne x
break;
case 2 : adresse=0x40 +x; //ligne 2+colonne x
break;

}

commande_4bit(adresse|0x80);
}

/****************** FONCTION AFFICHE CARAC. LCD ***************/

void lcd_affiche(char c)
{
switch(c)
{
case'\f':
commande_4bit(0b00000001); //efface ecran
delay_ms(2);
break;

case'\n':
lcd_gotoxy(1,2); //passage a la ligne 2
break;

default :
donnee_4bit(c); //envoie caractere
break;
}
}



/****************** FONCTION EFFACE LCD ********************/

void eff_lcd() //sous-programme de l'effaçage du LCD
{
commande_4bit(0b00000001); //(clear display)
delay_ms(5);
commande_4bit(0b00000010); //(return home)
delay_ms(5);
}


/****************** FENETRE 1 **************/
void fenetre1()
{
lcd_affiche(0b01000100);
}
/****************** FENETRE 2 ***************/
void fenetre2()
{
lcd_affiche("ABS");
}
/****************** FENETRE 3 ***************/
void fenetre3()
{
lcd_affiche(0x57);
}
/****************** FENETRE 4 ***************/
void fenetre4()
{
donnee_4bit("A");
}
/****************** FENETRE 5 ***************/
void fenetre5()
{

}
/****************** FENETRE 6 ***************/
void fenetre6()
{

}
/****************** INITIALISATION LCD**************/

void init_lcd() //sous-programme de l'initialisation du LCD
{
delay_ms(500); //attente sup. a 15ms
commande_8bit(0b00110000); //ecriture de 3h dans IR (fonction set pour init)
delay_ms(10); //attendre 4.1 ms minimum
commande_8bit(0b00110000); //ecriture de 3h dans IR (fonction set pour init)
delay_ms(10); //attendre 100 µs min
commande_8bit(0b00110000); //ecriture de 3h dans IR (fonction set pour init)
delay_ms(10); //attendre 40 µs min
commande_8bit(0b00100000); //ecriture 2h dans IR
(fonction set pour bus 4bit)
delay_us(45); //attendre la fin de l'opération
commande_4bit(0b00101000); //ecriture en 2 foi 28h dans IR (fonction set 4bits/2ligne 5*8)
delay_us(45); //attendre la fin de l'opération
commande_4bit(0b00000001); //ecriture en 2 foi 01h dans IR (clear display)
delay_ms(5); //attente la fin de l'opération
commande_4bit(0b00000110); //ecriture en quartet 06h (entry mode set : aucun décalage de fenetre)
delay_ms(5); //attente la fin de l'opération
commande_4bit(0b00000010); //ecriture en quartet 02h (return home)
delay_ms(5); //attente la fin de l'opération
commande_4bit(0b00001111); //ecriture en quartet 0Fh (display 'on', cursor 'on', blink 'on')
delay_us(45); //attente la fin de l'opération
}


/****************** BOUTONS POUSSOIRS *********************/

void bouton_poussoirs() //sous-programme des boutons poussoirs
{
bouton=0; //mise variable bouton poussoir = 0
if(INPUT(ENTREE)==0) //si la touche Entree est appuyee
{
bouton=3; //variable bouton=3
}
if(INPUT(MOINS)==0) //si la touche - est appuyee
{
bouton=5; //variable bouton=5
}
if(INPUT(ECHAP)==0) //si la touche Echap est appuyee
{
bouton=9; //variable bouton=9
}
if(INPUT(PLUS)==0) //si la touche + est appuyee
{
bouton=17; //variable bouton=17
}
}

/****************** MOLETTE ********************************/

void molette ()
{
sens=0;
mola=((input(PIN_D2)));
molb=((input(PIN_D3)));
lecture=mola;
lecture=lecture<<1;
lecture=lecture|molb;

if(etatprecedent==0)
{
switch(lecture)
{
case 0b00: sens=0; //inactivite
break;
case 0b01: sens=3; //sens horaire
break;
case 0b10: sens=5; //sens anti-horaire
break;
}
}

if(etatprecedent==1)
{
switch(lecture)
{
case 0b01: sens=0; //inactivite
break;
case 0b11: sens=3; //sens horaire
break;
case 0b00: sens=5; //sens anti-horaire
break;
}
}

if(etatprecedent==2)
{
switch(lecture)
{
case 0b10: sens=0; //inactivite
break;
case 0b00: sens=3; //sens horaire
break;
case 0b11: sens=5; //sens anti-horaire
break;
}
}

if(etatprecedent==3)
{
switch(lecture)
{
case 0b11: sens=0; //inactivite
break;
case 0b10: sens=3; //sens horaire
break;
case 0b01: sens=5; //sens anti-horaire
break;
}
}

etatprecedent=lecture; //mise a jour de l'etat precedent
}

/****************** ESSAIS ***********************************/

void essai1() //ESSAIE 1 ALLUME/ETEINT LED CAN
{
while(true)
{
output_high(LED_CAN); //allume LED CAN
delay_ms(1000);
output_low(LED_CAN); //eteint LED CAN
delay_ms(1000);
}
}

void essai2() //ESSAIE 2 ALLUME/ETEINT LED CAN AVEC MOLETTE
{
while(true)
{
molette();

if(sens==5)
{
output_high(LED_CAN);
delay_ms(10);
output_low(LED_CAN);
delay_ms(10);
}
}
}

void essai3() //ALLUME RETROECLAIRAGE LORS D'UN APPUIE SUR BP
{
while(true)
{
bouton_poussoirs();
if (bouton==9) //BOUTON ECHAP
{
output_high(LCD_K);
delay_ms(1000);
output_low(LCD_K);
delay_ms(1000);
}
}
}

/******************PROGRAMME PRINCIPAL*************************/

void main()
{
output_low(LCD_E);
init_lcd();
delay_ms(5000);
fenetre4();

while(true)
{
essai1();
}
}

1 réponse

RemiiS Messages postés 2 Date d'inscription lundi 30 avril 2012 Statut Membre Dernière intervention 1 mai 2012
1 mai 2012 à 14:09
Ps : L'afficheur est en mode 4 bits avec :
DB7 : RC3
DB6 : RC2
DB5 : RC1
DB4 : RC0

Cordialement.
0
Rejoignez-nous