Forum: Mikrocontroller und Digitale Elektronik wie Integer auf display ausgeben??


von Christian Berger (Gast)


Lesenswert?

Hi,
ich habe folgendes Problem, ich möchte den inhalt einer integer 
Variablen z.B. i auf einem display ausgeben. Habe mir dazu eine Funktion 
putchar geschrieben der ich einen Char übergeben muss um diesen am 
display auszugeben. Ich möchte in meiner main nun die Variable 
sekündlich inkrementieren und dann immer der putchar() übergeben. Aber 
wie mache ich das nun das am Display die Zahlen angezeigt werden?
Normalerweise sieht die übergabe so aus putchar("text") wenn ich nun 
eingebe putchar("i") wir am display nur i ausgegeben und nicht der 
inhalt der variablen, so wie ich es eigentlich gern hätte.

Gruß
Christian

von Oliver Döring (Gast)


Lesenswert?

Das kann so nicht funktionieren. Denn putchar("i") soll doch den String 
"i" ausgeben. Oder wie würdest Du sonst ein "i" an das Display senden?!

Du mußt Deinen Integer erst in einen String umwandeln und diesen dann 
Zeichen für Zeichen putchar() übergeben.

Wie Du das machst, ist abhängig von der verwendeten 
Entwicklungsumgebung. Dazu brauchen wir mehr Infos!

von thkais (Gast)


Lesenswert?

Schau Dir mal die Funktion itoa() an.
Wenn Du es etwas komfortabler haben möchtest, geht auch sprintf(). Das 
ist die printf() -Funktion, nur dass sie in ein Text-Array 
hineinschreibt.

von Sonic (Gast)


Lesenswert?

Wenn du putchar benutzt kannst du 'putchar (i);' benutzen um den Inhalt 
der Variablen i auszugeben. Diese muss vorher natürlich als 'char' 
definiert werden und z.B. mit i = 'U'; gefüttert werden um z.B. ein U 
auszugeben.

von Sonic (Gast)


Lesenswert?

Ach ja, da du ja Zahlen hochzählen willst musst du für jede Ziffer eine 
Variable benutzen (oder ein Array) und die Ziffern im ASCII-Format 
hochzählen. Da die Zahlen 0..9 im ASCII-Code direkt hintereinander 
liegen ist das kein Problem. Also mit i = '0'; angefangen kannst du mit 
i ++; bis '9' hochzählen, dann die nächste Ziffer erhöhen und diese 
wieser auf '0' setzen. Das Funktioniert auch in Assembler prima!

von pumpkin (Gast)


Lesenswert?

von itoa() sollte man auf einem µC abstand nehmen. es gibt mehrere 
gründe, aber der triftigste ist wohl dass die funktion eine ewigkeit 
braucht. ich würde es in etwa so machen (ich gehe hier mal davon aus 
dass dein i unsigned ist):

unsigned int temp_var = i;

for(count = 0; count <=4; count++)   //int ist fünfstellig
{
   putchar((unsigned char)(temp_var % 10));
   temp_var /= 10;
}

den typecast in putchar() sollte man nochmal betrachten, evtl kann es 
dort zu "interessanten" phänomenen kommen (keine lust jetzt darüber 
nachzudenken ; )  ). ausserdem wird der der int von rechts nach links 
ausgegeben.

pumpkin

von pumpkin (Gast)


Lesenswert?

achso, ein ASCII offset muss evtl auch noch eingebracht werden.

pumpkin

von Christian Berger (Gast)


Lesenswert?

Achso, hab ganz vergessen zu schreiben das ich winavr benutze.

von Niels H. (monarch35)


Lesenswert?

Du meinst vermutlich:
putchar((unsigned char)(temp_var % 10)+48);

Zu beachten ist, das hier die Zahl rückwärts ausgegeben wird 
(neunhunderteinundzwanzig -> 129)

Ausserdem würde ich den schleifenkopf ändern: for (; temp_var>0;)

Und zuletzt muss ich dir noch beipflichten: es gibt funktionen in der 
libc, von denen man besser Abstand hält. Zum Einen, weil sie einfach 
zuviel Platz im Speicher fressen, zum anderen, weil sie die stabilität 
durch mögliche Überläufe massiv gefährden:

sprintf, itoa, strcpy.... alles, wo der Funktion nicht übergeben wird, 
wie gross der Quellbuffer oder sogar Zielbuffer eigentlich ist. Eine 
0-Terminierung ist dafür kein zuverlässiger Indikator!

von Sonic (Gast)


Lesenswert?

Hmm.. hat er nicht geschrieben das er eine eigene Putchar-Funktion 
geschrieben hat? Ist ein wenig verwirrend, da's sowas unter dem Namen 
schon gibt! Aber ich gehe davon aus, dass das eine Funktion ist, mit der 
die Cursorposition und das zu schreibende Byte ans Display geschickt 
wird, oder liege ich da falsch? Falls das so ist kannst du meine Version 
von oben benutzen, frisst wenig Speicher und ist einfach.

von pumpkin (Gast)


Lesenswert?

um die reihenfolge umzukehren könnte man beispielsweise einen char-array 
anlegen und "rückwärts" befüttern um ihn anschließend per putchar() 
rauszuschieben. aber da ist der kreativität keine grenze gesetzt  ; )
das mit dem schleifenkopf ist bei dir schon besser wenn der int immer 
wesentlich weniger als 5 stellen haben - auf jeden fall ne nette idee, 
werd ich mir merken.

pumpkin

von Niels H. (monarch35)


Lesenswert?

Ja, nette Idee mit dem Schleifenkopf...mir ist aber gerade selbst 
aufgefallen, das das falsch ist.

aus einer 100 würde ne 1 werden :)

von pumpkin (Gast)


Lesenswert?

nö, wieso?

pumpkin

von Niels H. (monarch35)


Lesenswert?

och nüx....:)

sorry, hab mich verlaufen :)

von pumpkin (Gast)


Lesenswert?

gehirnknoten?  ; )        ok, genug lame....back to topic.

pumpkin

von Eckhard (Gast)


Lesenswert?

Hallo,

ich habe das folgendemasse gelöst.

/*********************************************************************** 
******/
/* LCD_putn - prints a unsigned integer number to LCD 
*/
/*********************************************************************** 
******/

void LCD_putn( unsigned int n )
{
    unsigned char i = 0;
    unsigned char buf[5];       //integers need at most 5 digits

    do                          //fill the buffer iteratively...
    {
        buf[i++] = '0' + n % 10;
        n = n / 10;
    } while (n != 0);


    while( i > 0)               //...and print it backwards
    {
        LCD_putchar( buf[ --i ] );
    }
}

LCD_putchar ist dann durch die entsprechende Funtion zu ersetzen die ein 
Zeichen auf dem LCD ausgibt.

Eckhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.