C18 - LCD - Float

Başlatan SpeedyX, 08 Şubat 2007, 03:18:12

SpeedyX

Selamlar,

C18 de 2 satırlık text lcd de değerler göstermek istiyorum ama bir türlü olmuyor.

lcd_puts("deneme 123");

şu şekilde yazı, cümle vs gösterebiliyorum. Benim sorunum printf gibi bir komut kullanamamak.

#include <p18f252.h>
#include <Evaporator.h>
#include <math.h>

void main (void)
{
	float Level_Old = 0.025, Level_New, Level_Rate_In, Level_Rate_Out,
		Level_Rate_Vapor, Temperature_Old = 100, Temperature_New;
	unsigned long OldTemp = 0, NewTemp;
	unsigned char dir = 1, Alarm_Tank_Full = 0, Alarm_Tank_Empty = 0,
		Alarm_Overheated = 0, Alarm_Underheated = 0;

	unsigned char lcd_buffer[6];


sprintf(lcd_buffer,"%1.3f",Level_New); lcd_puts(lcd_buffer);

burada sprintf ile lcd_buffer ın içine düzgün hale gelmiş bilgiyi atıp lcd_puts ile de ekrana yazmaya çalışıyorum ama hiç birşey göstermiyor.

lcd_gotoxy(7,1);
                //printf(lcd_puts,"%1.3fm",Level_New); 
		sprintf(lcd_buffer,"%1.3fm",Level_New); lcd_puts(lcd_buffer);
		if(Alarm_Tank_Full) lcd_puts(" Hi");
		if(Alarm_Tank_Empty) lcd_puts(" Lo");
		if(!Alarm_Tank_Full && !Alarm_Tank_Empty) lcd_puts("   ");
		
		lcd_gotoxy(6,2);
                //printf(lcd_puts,"%3.1f'C",Temperature_New);
		sprintf(lcd_buffer,"%3.1f'C",Temperature_New); lcd_puts(lcd_buffer);
		if(Alarm_Overheated) lcd_puts(" Hi");
		if(Alarm_Underheated) lcd_puts(" Lo");
		if(!Alarm_Overheated && !Alarm_Underheated) lcd_puts("   ");


yukarıdaki şekildede olmuyor. direkt printf ile de denedim yine olmuyor.
Biraz yardıma ihtiyaç var.

kurumahmut

lcd_puts ile lcd'ye veri gönderebiliyorsan sprintf fonksyonunun yardımıyla istediğin değişkenleri stringe çevirebilirsin. Böylece ekrana rahatlıkla yazabilirsin. C18 de yazdığım ve kullandığım kod parçaları. C18 LCD kütüphanesini kullanmamıştım. "LCD_Send_String" fonksiyonları yerine lcd_puts fonksiyonunu yazarsan çalışacaktır...

/********************************************************************************
*
*  GLOBAL VALUES
*
*******************************************************************************/
// 16bit hex sayıyı decimal olarak LCD ye yazan fonksiyon için tanımlandı...
// ÖRN: 0xFFFF sayısı bu stringe 65536 olarak yazılır...
char gString_transformed_Decimal[6];	//basamak sayısının bir fazlası kadar uzunlukta olsun...


// karakterin hex değerini lcd ye yazan fonksiyon için tanımlandı...
// ÖRN: '0' karakteri bu stringe 30 olarak yazılır. Çünkü '0' = 0x30...
char gString_transformed_char[2];



//////////////////////////////////////////////////////////////////////////
// 16bit hex sayıyı decimal olarak LCD ye yazan fonksiyon...
void LCD_Send_u16_as_Decimal(u16 transform_Decimal)
{
	sprintf( gString_transformed_Decimal, "%u", transform_Decimal);
	LCD_Send_String(gString_transformed_Decimal);
	return;
}
//////////////////////////////////////////////////////////////////////////
// 8bit hex sayıyı decimal olarak LCD ye yazan fonksiyon...denenmedi...
void LCD_Send_u8_as_Decimal(u8 transform_Decimal)
{
	sprintf( gString_transformed_Decimal, "%u", transform_Decimal);
	LCD_Send_String(gString_transformed_Decimal);
	return;
}

//////////////////////////////////////////////////////////////////////////
// karakterin hex değerini lcd ye yazan fonksiyon...
void LCD_Send_char_as_hex(u8 transform_char)
{
	sprintf( gString_transformed_char, "%x", transform_char);
	LCD_Send_String(gString_transformed_char);
	return;
}
//////////////////////////////////////////////////////////////////////////

SpeedyX

sprintf(lcd_buffer,"%1.3fm",Level_New); lcd_puts(lcd_buffer);

Benim burda yaptığımın bundan ne farkı var?
Float yazdırmak istiyorum. Format özelliği ile x.xxx şeklinde yazdırmak istiyorum.

EES

Kullandığın derleyici crack'li ise sprintf ve float değişkenler çalışmıyor

SpeedyX

Evet crackli. Bunun bir çözümü yok mu?
"Warning [2058] call of function without prototype" ve "Warning [2054] suspicious pointer conversion
" diye iki hata veriyor o satırda.

kurumahmut

Biraz deneme yaptım sprintf fonksiyonu float değişkenleri stringe yazamıyor. string boş görünüyor. MPLAB simulator de sende görebilirisin...

Bu nedenle C18 float sayıları belleğe nasıl yerleştirdiğini araştırıp byte byte işlemelisin ya da float sayını integer olarak değerlendirmelisin...

Çözümlerim hakkında kesin bi cevabım yok.

crackli ya da cracksiz sprintf fonksiyonu kullanılabilir ve floatin işlemler tanımlanabilir...

SpeedyX

Hallettim.
sol = (long int)fco;
	sag= (long int)((fco-(float)sol)*1000);

Bu şekilde virgüllü sayıyı iki parçaya ayırarak ekrana basit bir formatta yazdırdım.

xenitis

biraz geç olmuş ama daha sonra okuyan olursa diye yazmak istedim C18'de sprintf ve printf fonksiyonlarının float desteği yoktur crackli olması yada olmaması ile ilgili değildir C18 libraries dosyasını microchip sitesinden indirip incelerseniz orda hangi değişken türleri olduğu tek tek yazılmıştır
herkese kolay gelsin