Forum: Compiler & IDEs String-Formatierung für LCD Anzeige


von Toni (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Im Dateianhang ist ersichtlich, dass ich die int-Variable "..._count"
die die Sekunden, Minuten resp. Stunden zählt mit utoa() in einen
String umwandle, und dann im LCD anzeige.

Wie kann ich nun erreichen, dass führende O (Nullen) angezeigt werden
(z.B. bei Uhrzeit 09:08:01) und damit die Anzeige nicht so aussieht >>
9 :8 :1  ?

Wenns keine "Formatierung" der schlauen Art gibt, werde ich wohl
Sekunden-Einer, Sekunden_Zehner , usw. brauchen müssen.

Ich bin gespannt.

Gruss

Toni

von Jörg Wunsch (Gast)


Lesenswert?

Wenn Du genügend ROM für den Koloß hast, kannst Du natürlich die
printf()-Familie benutzen.

Ansonsten ist es im Falle von jeweils nur zwei Stellen eigentlich noch
einfach: konvertiere ,,zu Fuß'', indem Du sowohl durch 10 dividierst
als auch den Rest der Division benutzt.  Effektiv geht das mit der
Standardfunktion div(), die sich die Tatsache ausnutzt, daß bei einer
ganzzahligen Division der Rest ohnehin immer ermittelt werden muß.
(Die Operatoren / bzw. % greifen intern auf dieselbe Routine zu,
werfen aber entweder den Rest oder den Quotienten weg.)

von Toni (Gast)


Angehängte Dateien:

Lesenswert?

Jörg, vielen Dank

Habs hingekriegt, wie Du im Anhang siehst (im Moment nur für die
Sekunden codiert).

Ich weiss nicht, vielleicht gibt es auch eine Möglichkeit die nur eine
String-Variable braucht, habs aber nicht fertig gebracht !

Ich bin mir auch nicht sicher wie gross die Strings initialisiert
werden müssen, ist die Grösse "lcd_sec_z[3]", ... ok ?
Eigentlich sollten doch ..[2] genügen, Ausgabe ist dann aber plötzlich
um eine Stelle verschoben !

Gruss

Toni

von Toni (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Habe selber eine elegantere Methode mit strcat() und nur einer
zusätzlichen Variablen gefunden.

Toni

von Fritz Ganter (Gast)


Lesenswert?

Es ist die Frage, ob sich der Aufwand auszahlt, weil printf ist
einfacher und braucht im Flash:
vfprintf            1268 bytes
sprintf               70 bytes

Dann einfach mit sprintf(buf,"%02d:02d:02d",h,m,s); und du hast die
Zeit in buf.
Schliesslich hast du ja den ganzen Flash bezahlt, und kannst den nicht
benötigten Teil ja nicht zurückgeben :-)

von Toni (Gast)


Lesenswert?

Vielen Dank Fritz

bin für jeden Tipp dankbar !

Werde es heute mal so versuchen, und schauen wie viel mehr oder weniger
Speicher es braucht.

Gruss

Toni

von Toni (Gast)


Lesenswert?

OK, hier der Unterschied des benötigten Speichers.


1.) mit Funktion sprinf()
=========================
Linking...
Generating Code...
Program memory usage: 2886 bytes, 35.23% full.
Global variables usage: 63 bytes

Uhr_V2 - 0 error(s), 0 warning(s)


2.) hier so wie oben beschrieben (zu Fuss), mit div() und strcat()
==================================================================
Linking...
Generating Code...
Program memory usage: 1380 bytes, 16.85% full.
Global variables usage: 53 bytes

Einfache_Uhr - 0 error(s), 0 warning(s)


Tatsächlich ein Koloss dieses sprintf() !

Gruss
Toni

von Jörg Wunsch (Gast)


Lesenswert?

Klar, aber Du mußt dennoch einen ganzen ROM einsetzen, egal ob Du ihn
nur zu 17 oder zu 35 % fülltst, das war doch Fritz' ganze
Argumentation.  Dafür ist der Quellcode einfach und überschaubar.

Wenn der von Dir für den Test benutzte AVR auch der für das
Produktivsystem ist, würde ich an Deiner Stelle keine Sekunde zögern,
printf() zu nutzen.  Wenn Du das dagegen auf einem möglichst kleinen
AVR in einer 1000er Serie produzieren willst, lohnt sich der Tag
zusätzlicher Aufwand für andere Lösungen natürlich locker.

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.