PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Integer in String umwandeln????



KüSä
12.12.2008, 10:21
Hallo zusammen

Ich habe ein kleines Problem. Ich bastel gerade mit nem grafiklcd rum. 128x64... ich hab mir jetzt ein paar funktionen zusammengeklöppelt die mir erlauben adressen zu setzt, reseten, linen zu zeichnen und Text auszugeben.

meine Unterfunktion lcd_putchar funktioniert soweit gut.... nur was ist wenn ich eine Zahl ausgeben will??...zB das Resultat einer Rechnung oder ADC's???.....


void lcd_putchar(char f)
{
int fx;
switch(f)
{
default:
for(fx = 0; fx < 6; fx++)
{
lcd_write(font[(f-0x20)][fx]);
output_low(LCD_RW);
output_high(LCD_DI);
lcd_enable();
}
break;
}
}


die Font sitzt in nem Arrey....also der ganze alsci-code....und jeder char besteht aus 6 byte...also 6x8pixel.....

der Switch soll jetzt nicht verwirren...es funktioniert..... nur wie bekomme isch nun eine Integer Zahl so umgewandelt das ich diese als Text an dieses Unterprogramm übergeben kann??... jemand ne idee???


ach ja....ich arbeite mit einem PIC18f452 und CCS Compiler in MPLAB

sast
12.12.2008, 12:59
Wenn, wie du sagst, der gesamte ASCII Zeichensatz ab dezimal 32 im Font-Array liegt dann ist der Dezimalwert der Zahl 0 bei 48 und sollte also im Array an der Stelle 48-32=16 liegen. wenn du der Funktion ein char 49 übergibst muss auf dem Display eine 1 erscheinen.

Hoffe das war verständlich. Ansonsten noch mal nachfragen.

EDIT: Hast du schon mal lcd_putchar('1'); probiert?

sast

KüSä
12.12.2008, 13:04
klar.... das geht jo auch......aber die bringe ich eine Integer varibale (zB int x = 128; decimal) auf die Form eines Strings??? (zb int = String[1][2][8];....gibts da irgend ne moglichkeit ohne viel code??


alles was ich als text übergebe (zB "test") wird auch als text augegeben.....
und lcd_putchar('2'); funktioniert nur bei einzelnen ziffern

sast
12.12.2008, 13:20
Da gibt es jetzt mehrere Möglichkeiten.

zB
1.
int i;
char s[X];
sscanf(s, "%d", &i);

2.
du teilst ganzzahlig durch 10 und machst aus dem Rest ein ASCII Zeichen mit Zeichen=Rest+48, nimmst dann das Ergebnis der Division und teilst wieder durch 10 und so weiter bis die Division 0 ergibt

oder 3. ...

sast

KüSä
16.12.2008, 07:10
in etwa so??

zahl_1 = adres/10;
rest_1 = adres-(10 * zahl_1);
lcd_setaddr(58 );
lcd_putchar(rest_1+48 );
zahl_2 = Zahl_1/10;
rest_2 = Zahl_1-(10 * zahl_2);
lcd_setaddr(52);
lcd_putchar(rest_2+48 );
zahl_3 = Zahl_2/10;
rest_3 = Zahl_2-(10 * zahl_3);
lcd_setaddr(46);
lcd_putchar(rest_3+48 );




das mit sscanf geht mit ccs nicht....also lass ich es vorerst so mit dividiren und rest und so.......ich bastel nur noch n' unterprogramm daraus wo ich startadresse und Zahl übergebe..... besten Dank!!!!!!

thewulf00
16.12.2008, 08:53
Es gibt in der C-Standardlib eine Funktion genannt itoa (Int to Ascii).
Ich mache mir immer eine weitere Funktion:


void lcd_puti(uint8_t zahl)
{
char buffer[8];
itoa(zahl, buffer, 10);
lcd_puts(buffer);
}

sast
16.12.2008, 09:18
in etwa ja, ABER als allererstes würde ich mal rausfinden ob die Zahl ein negatives Vorzeichen hat. Das setzt du dann zum Schluß auf dem LCD vorn an und machst natürlich aus zahl_1 eine positive Zahl vor der Berechnung. Sonst klappt das mit dem +48 nicht so wie du willst. ;-)

sast

EDIT: @thewulf00: das wäre zB Variante 3. Dazu muss itoa aber in küsäs Umgebung auch zur Verfügung stehen.

thewulf00
16.12.2008, 09:47
EDIT: @thewulf00: das wäre zB Variante 3. Dazu muss itoa aber in küsäs Umgebung auch zur Verfügung stehen.
Das gehört zur Standard-Library in C. Wenn er ein ordentliches C verwendet, wird er es haben. (selbst wenn er dazu noch eine header includen muss)

sast
16.12.2008, 10:26
ok

da ist dann auch div() und div_t mit dabei (meine lieblings-ganzzahl-division). Ich rate mal (hab gerade keine Quellen zu atoi) dass die das auch nicht viel anders machen, als bei 2.

sast

thewulf00
16.12.2008, 11:59
Nehme ich auch an.

andi.studi
20.12.2008, 18:12
sicher das ssanf nicht funktioniert, das ist doch eine elementare funktion aus c.
selbst der c18 compiler beherscht diese (der hat nur probleme wenn man float werte mit sscanf verarbeiten will).

Besserwessi
20.12.2008, 20:30
Die Funktion sscanf ist weit weniger elementar als itoa. Vor allem ist das die Funktion für die andere Richtung, also ASCII nach Integer oder was sonst noch. Die richtige Funktion wäre sprintf, aber diese Funktion solle man bein µC wenn möglich vermeiden, denn das git einen ziehmlich langen Code.

wkrug
20.12.2008, 20:56
Ich denke mal, das itoa die richtige Funktion für die gestellte Aufgabe ist.
Wenn es eine long Variable ist, könnte man auch ltoa verwenden müssen.

Die negativen Vorzeichen fang ich auch immer schon vor dem itoa ab.
Gerade wenn man hinterher Kommastellen anzeigen will schaut ein minus Zeichen nach! dem Komma immer besonders lustig aus.


if(ui_variable<0)
{
lcd_putsf('-');
ui_variable=ui_variable*(-1);
}