Forum: Mikrocontroller und Digitale Elektronik 4 stellige zahl auf lcd anzeigen


von tobias hofer (Gast)


Lesenswert?

hallo

ich habe ein lcd display und möchte auf diesem nun eine
vierstellige zahl von meinem timer darstellen. dafür muss ich die zahl 
in 1'er 10'er 100'er und 1000'er aufteilen.

ich habe folgendes prinzip versucht:

(timerwert%10)/10 ergibt 10'er
(timerwert%100)/100 ergibt 100'er
(timerwert%1000)/1000 ergibt 1000'er

leider hat das ganze bei mir nicht funktioniert.
hat vieleich jemand schon einmal ein ähnliches problem gelöst und könnte 
mir mit ein bisschen c-code auf den richtigen weg helfen?

besten dank gruss tobias

von BernhardT (Gast)


Lesenswert?

Tja, 7 Segmentanzeigen brauchen halt mindestens 7 bit für eine Anzeige 
(digit). Ohne detailierte Angabe deiner Hardware wird dir wohl keiner 
eine vernünftige Antwort geben können.
Nur ein Tip - normalerweise liest man die benötigten Segmentwerte aus 
einer ROM-Tabelle. Das ist eigentlich viel einfacher als es klingt - 
aber bitte gib uns einen Tip für welchen Controller - was für ein 
Compiler - und vor allem welche Segmente an welchen Portpins hängen.
Gruß Bernhard

von Florian Pfanner (Gast)


Lesenswert?

Ich weiß nicht was du mit Module (%) erreichen willst???? - versuch mal

tausend=timerwert/1000;
timerwert=timerwert-tausend;
hundert=timerwert/100;
timerwert=timerwert-hundert;
zehnerwert=timerwert/10;
einerwert=timerwert-zehnerwert;

Müsste gehn - weiß jedoch nicht ob der Compiler rundet (dann würde das 
ganze nicht gehn) oder ob der Compiler einfach die Nachkommastellen 
weglässt???

Einfach mal ausprobieren!

Gruß, Florian

von tobias hofer (Gast)


Lesenswert?

hallo bernhard

also ich habe ein ganz normales lcd display 2zeilen a 16charakter, 
controller hd44.... keine 7-segment anzeige oder sowas.

hallo florian

nehmen wir einmal an der timer hat den wert 4780.
mit deinem allgorythmus wenn richtig gerundet wird:

tausend=timerwert/1000;             4
timerwert=timerwert-tausend;
hundert=timerwert/100;              37
timerwert=timerwert-hundert;
zehnerwert=timerwert/10;            27
einerwert=timerwert-zehnerwert;

ich will ja 1'er 10'er 100'er usw...

gruss tobias

von J.Hollinger (Gast)


Angehängte Dateien:

Lesenswert?

Hi Tobias,

versuch mal den angehängten Source. Die zu schreibende Zahl wird 
zerpflückt und jedes einzelne Zeichen zum Display geschrieben. Der 
meiste Teil dient der Unterdrückung führender Nullen (if Zahl > 9999 
usw.). Kann man natürlich auch weglassen oder eleganter lösen.
Eine andere Alternative ist die "sprintf"-Funktion.

Viel Spass

Jochen

von Florian Pfanner (Gast)


Lesenswert?

@Tobias:
Tut mir leid, kleiner Fehler im Syntax:

[z.b:Timerwert=4780]

tausend=timerwert/1000;
[4=4780/1000]

timerwert=timerwert-(tausend*1000);
[780=4780-(4*1000)]

hundert=timerwert/100;
[7=780/100]

timerwert=timerwert-(hundert*100);
[80=780-(7*100)]

zehnerwert=timerwert/10;
[8=80/10]

einerwert=timerwert-(zehnerwert*10);
[0=80-(8*10)]

In eckigen Klammern sind bsp.-Werte!

Hoffe jetzt stimmts,
Gruß, Florian

von tobias hofer (Gast)


Angehängte Dateien:

Lesenswert?

@florian

genau so habe ich es auch gemacht.

besten dank tobias

von Sascha Weitkunat (Gast)


Lesenswert?

Hast du dir schonmal den Befehl itoa(..) angeguckt? Zu finden in der 
stdlib.h

http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual/group__avr__stdlib.html#a23

von tobias hofer (Gast)


Lesenswert?

ich kenne die fkt. itoa();

leider hat mein compiler keine stdlib.h bibliothek!

wenn mir aber jemand sagen kann wo ich diese stdlib.h find
und wie ich die mit meinem compiler benutzen kann.
wäre das sicher der einfachste weg.

von Sascha Weitkunat (Gast)


Lesenswert?

Welchen Compiler verwendest du denn? Wenn er wirklich keine stdlib.h hat 
schau mal nach dem Sourcecode der itoa(..) Funktion, sollte sicherlich 
auf http://sourceforge.net/ zu finden sein.

von A. Arndt (Gast)


Lesenswert?

Hallo,

bei FASTAVR ist das kein Problem, Du kannst die Zahl so darstellen oder 
kannst das Format festlegen, mit Punkt und Auffüllplatzhaltern bei 
kleinen Zahlen.

Gruss
A. Arndt

von tobias hofer (Gast)


Lesenswert?

ich benutze den wickenhäuser c-compiler.
als prozessor habe ich den ds89c420 von dallas.

von BernhardT (Gast)


Lesenswert?

Hat mich meine Kristallkugel halt getäuscht. Fragen wie die von dir im 
Zusammenhang mit C sind mehr als ungewöhnlich.
Wie hier einige schon erwähnt haben gibt es normalerweise für C 
PrintF,itoa und noch einen Haufen mehr. Sollte dein Compiler nix davon 
unterstützen dann viel Spaß bei der Arbeit, Ich in deinem Fall würde 
dann aber mal ernsthaft einen Wechsel  in Erwägung ziehen (WINAVR ist 
übrigens völlig umsonst:-)
Wenn du dich aber in die Arbeit stürzen willst: um eine einzelne Ziffer 
für einen hd44..  umzuwandweln must du h'30' addieren Hexadezimal 30 ist 
die null 39 = 9. Die 10er, 100er... must du dann schon berechnen. Aber 
ich kann nicht  glauben, das der Compiler da gar nichts kann - und wenn 
doch: für die 51er Familie gibt es nun wirklich genügend Compiler (auch 
teilweise freie).
Gruß Bernhard

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.