Bonsoir a tous,
Sur mon LCD HD44780 1602L je viens de rencontrer un probleme concernant l'affichage d'une temperature apres traitement.
En, effet sur mon PIC 18F4550 a 4Mhz je recupere 2 octets d'une sonde 18B20.5jusque la pas de soucis).
Cependant par la suite je traite ces 2 octets pour en tirer un affichage ex: "+22.75 C" ce qui correspond aux octets
Octet L= 0011 0110 et Octet H=1000 0000.
ce qui me donne normalement apres traitement une chaine --> char chaine={0x2D,50,50,0x2E,55,53, 0x20,0x43,'\0'}
voici le code (dans l'algo de traitement temeprature on peut avoir une positive et une negative)
vous l'aurez compris c'est juste une conversion en ajoutant le '0' ascii soit "48".Code:#include <p18f4550.h> #include <delays.h> #include <stdio.h> #include "xlcd.h" #include "project.h" #pragma config WDT = OFF //watchdog OFF #pragma config FOSC = HS //definition des variables globales unsigned char sondeT[5]={0xFE,0x07,0xFE,0x07}; char temp1 [15] = "";//variable affichage temperature //******************************************************************* // Fonction Main * //******************************************************************* void main (void) { ADCON0=0; ADCON1=0x0f; //initialisation hardware LcdInit(); while(1) //boucle infinie du programme vide car uniquement interruptions { //*********partie non traitee pour essai*************** //sondes DS18B20 //Delay10TCYx(10); //Sonde_Reset(); //Sonde_Write(0xCC); //Sonde_Write(0x44); //Delay10KTCYx(100); //Sonde_Reset(); //Sonde_Write(0xCC); //Sonde_Write(0xBE); //Sonde_Readbyte(sondeT,0); //Sonde_Readbyte(sondeT,1); //********************************************** Temp_String (temp1,sondeT[0],sondeT[1]);//conversion temperature en chaine de caractere pour affichage LCD SetDDRamAddr(0x80);//debut 1ere ligne putsXLCD(temp1);//affichage de l'heure while( BusyXLCD() ); }//fin de la boucle }//fin du main //******************************************************************* // Fonctions d'Initialisation * //******************************************************************* void LcdInit(void) // initalisation du LCD sur PORTD (D0-D6) { PORTD=0x00; TRISD=0x00; LATD=0x00; OpenXLCD( FOUR_BIT & LINES_5X7 ); while( BusyXLCD() ); WriteCmdXLCD( FOUR_BIT & LINES_5X7 ); while( BusyXLCD() ); WriteCmdXLCD( DON & BLINK_OFF); while( BusyXLCD() ); } //******************************************************************* // Fonctions de temporisation * // pour les fonctions LCD * //******************************************************************* void DelayFor18TCY( void ) //50micro { Delay10TCYx(6); return; } void DelayPORXLCD(void)//15ms { Delay1KTCYx(16); return; } void DelayXLCD(void)//5ms { Delay1KTCYx(6); return; } //********************************************************* // fonction traitement des octets hauts et bas * //********************************************************* void Temp_String (char * buffer,unsigned char byteL,unsigned char byteH) { static unsigned int decimales;static unsigned char result; if((byteH&0xF8)==0xF8) // temperature negative { //la virgule decimales =(((0xFF-byteL)+1)&0x0F)*625; //les entiers result=(((0xFF-byteL)+1)>>4)|(((0xFF-byteH)&0x07)<<4); //------>if (result>9)sprintf (buffer, "-%d.%3u C",result,decimales); //------>else sprintf (buffer, "-0%d.%3u C",result,decimales); buffer[0]=0x2D; buffer[1]=((result/10)+48); buffer[2]=((result-((buffer[1]-48)*10))+48); buffer[3]=0x2E; buffer[4]=((decimales/1000)+48); buffer[5]=(((decimales-((buffer[4]-48)*1000))/100)+48); buffer[6]=0x20; buffer[7]=0x43; buffer[8]='\0'; } else { //la virgule decimales =(byteL&0x0F)*625; //les entiers result=(byteL>>4)|((byteH&0x07)<<4); //en string //---------->if (result>9)sprintf (buffer, "+%d.%3u C",result,decimales); //---------->else sprintf (buffer, "+0%d.%3u C",result,decimales); buffer[0]=0x2B; buffer[1]=((result/10)+48); buffer[2]=((result-((buffer[1]-48)*10))+48); buffer[3]=0x2E; buffer[4]=((decimales/1000)+48); buffer[5]=(((decimales-((buffer[4]-48)*1000))/100)+48); buffer[6]=0x20; buffer[7]=0x43; buffer[8]='\0'; } }
mais l'ideal pour moi aurait été d'utiliser la fonction Sprintf de Stdio.h mais la impossible malgre quelques aide nottement le fameux que je n'ai pas reussi a le faire fonctionner sur mon LCD
Pour mon code il semblerait que ce soir le traitement qui donne ces resultats bizarre --->"+/ .LL C"Code:stdout=_H_USER; //dans le main int _user_putc(char c) { putcXLCD(c); } fprintf (_H_USER,"ecriture sur LCD");
j'ai essayer de mettre directement dans la fonction de triatement les valeurs "0x2D,50,50,0x2E,55,53,0x20,0x 43,'\0'". et ca marche bien (juste pour voir si ca venait du pointeur).
bref si vous avez une idee pour mon probleme merci car la je ne comprends plus et ce LCD me tue...juste pour un foutu affichage!!!!
au fait quel est le meilleur moyen d'alimenter un LCD pour ne pas qui claque apres plusieurs on/off...le mien vient de s'affaiblir le retroeclairage est tres tres faible.
merci a tous
-----