mikrocontroller.net

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


Autor: Toni (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Toni (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Toni (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Toni

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.