Integer Zahl möglichst effizient auf Display ausgeben

#3162103
Lesenswert?

Hallo C-Gemeinde,

ich möchte einen Integer Wert möglichst effizient auf einem LCD 
ausgeben. Zum Thema "Zahl bearbeiten" habe ich auch schon viel gelesen, 
leider weiss ich nicht genau wie effizient die einzelnen Methoden 
(Division (Modulo), itoa etc.) sind.
Es handelt sich dabei z.B. um einen Wert von "25123456" (Temperatur) der 
auf dem Display "25.12" anzeigen soll. Die Display Ausgabe erfolgt ohne 
Bearbeitung der Zahlen mit sprintf wie folgt:

char data[10];
sprintf(data,"%i",value);
LCD_Print(data, ...);

Eine Möglichkeit wäre den Wert mittels itoa in einen String zu wandeln 
und dann das Komma an ensprechender Stelle einzufügen, dass würde dann 
etwa so aussehen:

char data[10];
itoa(value, data, 10);
char string[10];
string[0] = data[0];
string[1] = data[1];
string[2] = '.';
string[3] = data[2];
string[4] = data[3];
string[5] = '\0';
char str[10];
sprintf(str,"%s",string);
LCD_Print(data, ...);


Ich bin mir sicher Ihr kennt da noch elegantere Methoden. Ist es evtl. 
sinnvoller einen cast und Division (mit Modulo) durchzuführen? Mir geht 
es um eine möglichst effiziente Lösung, da die Schaltung unteranderem 
auch per Batterie versorgt wird.

Danke schon mal für eure Inputs!
#3162172
Lesenswert?

@peda:
Mit Effizienz dachte ich eigendlich an die Anzahl Rechenschritte und 
auch Rechenoperationen (z.B. Division), die der Prozessor benötigt. Je 
aufwändiger die Berechnung desto mehr Leistung benötigt der uP.
Flash Speicher ist genügend vorhanden.

@prx:
Danke funktioniert soweit. Kannte die Funktion ldiv nicht.
Moderator #3162204
Lesenswert?

Wie schnell ändert sich die Temperatur? Sicher nicht sehr schnell.
Deswegen muss die Temperatur auf dem Display auch nicht im
Millisekundentakt aktualisiert werden, sondern es reicht vielleicht ein
Update alle 10 s aus. Die dazu benötigte mittlere elektrische Leistung
dürfte auch bei einem schlecht gewählten Algorithmus je nach Größe und
Typ der Batterie in der Größenordnung der Selbstentladung derselben
liegen.
#3163432
Lesenswert?

Chris S. schrieb:
1
 char data[10];
2
 itoa(value, data, 10);
3
 char string[10];
4
 string[0] = data[0];
5
 string[1] = data[1];
6
 string[2] = '.';
7
 string[3] = data[2];
8
 string[4] = data[3];
9
 string[5] = '\0';
10
 char str[10];
11
 sprintf(str,"%s",string);
12
 LCD_Print(data, ...);

Zum optimieren erstmal überlegen, warum das ganze so umständlich ist:
das ganze String-hin-und-herkopieren, das unnötige sprintf dazu usw, 
machst du nur, damit deine LCD_Print methode einen String als Parameter 
bekommt.
Was macht LCD_Print? Den String zeichenweise ans Display schicken. Das 
kannst du auch selber.
Also: statt LCD_Print direkt zeichenweise ausgeben. Spart den ganzen 
Hickhack.
1
 char data[10];
2
 itoa(value, data, 10);
3
 LCD_PrintChar(data[0]);
4
 LCD_PrintChar(data[1]);
5
 LCD_PrintChar(',');
6
 LCD_PrintChar(data[2]);
7
 LCD_PrintChar(data[3]);

(Bonus-Aufgabe: Temperaturen < 10° richtig anzeigen, "<space>5,67")

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren