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
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!
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.
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.
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 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
achso, ein ASCII offset muss evtl auch noch eingebracht werden. pumpkin
Achso, hab ganz vergessen zu schreiben das ich winavr benutze.
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!
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.
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
Ja, nette Idee mit dem Schleifenkopf...mir ist aber gerade selbst aufgefallen, das das falsch ist. aus einer 100 würde ne 1 werden :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.