PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Integer Variable mit LCD Lib von Peter Fleury



PcVirus
19.06.2007, 16:34
Hi,
ich habe jetzt angefangen meinen µC in C zu programmieren und hab das LCD jetzt am laufen.
Ich habe da jetzt nur ein Problem. Ich weiß nicht wie ich den Inhalt einer Integer oder Float Variable auf dem Display anzeige. Ich muss ja die int Variable in eine String Variable umwandeln. Hab auch bei Google schon gesucht und ausprobiert nur ich habe noch kein brauchbares Ergebnis erziehlt.
Ich verwende die Lib von Peter Fleury.

MfG PcVirus

jar
19.06.2007, 16:45
itoa ist dein Freund ltoa sollte auch gehen

char s2[mit_genug_platz_für_die_Zahl];

itoa( (L_Com&0x7fff),(char *)s2, 10)

die 10 sagt die Zahlenbasis, hier dezimal
2 für binär
8 für oktal
16 müsste dann hex sein ?
und bei 21 bin ich grad unsicher

PcVirus
19.06.2007, 20:01
Danke funktioniert einwandfrei!

robocat
19.06.2007, 21:32
für floats habe ich nichts passendes gefunden, ftoa ging bei mir nicht und sprintf verbietet sich, weil es zuviel flashspeicher klaut.

ich habe das dann so gelöst:


void display(int value)
{
char buffer[8];
float f=((float)value*5)/1023;
if(f<0)f=0;
itoa((int)f,buffer,10);
lcd_puts(buffer);
lcd_putc(',');
f=(f-(int)f)*1000;
if(f<100)lcd_putc('0');
if(f<10)lcd_putc('0');
itoa((int)f,buffer,10);
lcd_puts(buffer);
return;
}

in diesem fall wird eine kommazahl ausgegeben, die sich aus value berechnet. 0->0,000; 1023->5,000.

besonders elegant ist das ja nicht, und braucht sicher auch eine menge speicher. weiss jemand, wie man das einfacher/besser hinbekommt?

gruesse von der katz

jar
20.06.2007, 07:34
ich habe das dann so gelöst:
...
besonders elegant ist das ja nicht, und braucht sicher auch eine menge speicher. weiss jemand, wie man das einfacher/besser hinbekommt?
gruesse von der katz

weiss nicht ob das eleganter ist, aber weniger Mathe isses

strcpy((char *)UI_str,insert_char((char *)trimm_string(' ',itoa( (ReadChannel(0) * _scaler)/10, (char *)s, 10), 2 ), ',', 1));

// * _scaler gibt die echten Volt ganzahlig hier im Bsp. 500
// :10 weil mir eine Nachkommastelle reicht, gibt also 50
// diese 50 wird nun mit itoa in einen String gewandelt
// und das Komma eingefügt, nach Bedarf auch gerne mit Punkt


char *insert_char(char *s_string, char ins, UBYTE wo)
{ static char _tmp[32]={0};
strncpy(_tmp, s_string, wo);
_tmp[wo]=ins;
_tmp[wo+1]=0;
strcat(_tmp, (char *)(s_string+wo));
//__tmp[3]=0; // nur noch eine Nachkommastelle , wenn 1 Stelle reicht kann man hier Schluss machen
return _tmp;
}

Markusiii
17.07.2007, 04:16
Hallo !

Habe dasselbe Problem, eine int oder eine float
auf einem LCD darzustellen.
Text geht einwandfrei.

Eine Frage dazu :
Was tun, wenn ich kein 'itoa' zur Verfügung habe ?
Wie kann ich diesen Befehl einbinden ?
Ich verwende den IAREditor/Compiler in Standard C.

Danke !

robocat
17.07.2007, 11:36
itoa ist kein standard. wenn sprintf aus platzgründen ausscheidet, muss man sich selbst eine konvertierung basteln.


#include <stdio.h>
#include <conio.h> // nur für getch. kein ansi-standard.

void toascii(int i, char *a)
{
short int k=10000,n,pos=0;

if(i<0) // neg. vorzeichen
{
a[pos++]='-';
i*=-1;
}
else if (i==0) // wenn i=0 ist
{
a[pos++]='0';
a[pos]=0;
return;
}
while(i/k==0) // fuehrende nullen abschneiden
{
k/=10;
}
while(k) // konvertieren
{
n=i/k;
a[pos++]=n+'0';
i-=n*k;
k/=10;
}
a[pos]=0;
return;
}

int main(void)
{
char a[7];
toascii(-37656,a);
printf("%s",a);
getch();
return(0);
}

short ist hier ein 16bit int, das muss man an den controller anpassen. das char-array a muss gross genug sein, dass der int mitsamt vorzeichen und terminierender 0 reinpasst.

der code ist nur so hingeklatscht und nicht auf sicherheit optimiert (das heisst er läuft, aber bei falscher wahl von a,i,k können probleme auftreten). ist nur zum besseren verständnis gedacht.

anstelle von printf muss die textausgabe-funktion fürs LCD hin. sonst könnte man ja gleich mit %d den integer ausgeben.

gruesse von der katz

PCMan
17.07.2007, 22:00
Die Anzeige von Float variablen hab' ich so gelöst:

dtostrf(FLOATV,6,3,CHARV);
llcd_puts(CHARV);

FLOATV ist einstellig+punkt+3Nachkommastellen. Also 5 Stellen auf dem Display. Dann noch Vorzeichen beachten (+/-) und dann kommen 6 Felder auf dem LCD zustande (daher die 6). CHARV musst du dann natürlich mindestens 6 Felder groß machen. Die 3 gibt die Anzahl der Nachkommastellen an.
vG Simon