C-Code für Konvertierung von Binär nach einzelnen Dezimalstellen

Gast #2121260
Lesenswert?

Hallo leute,

also erst einmal ich bin neu hier und habe auch schon etliche stunden 
das i-net durchsucht.

Controller: ATmega 8
7Segment Anzeige: a bis h an PortD (0-7) / Anzeige 1-3 an PortC (0-2)

Zu meinem Problem,
Ich möchte einen Temperaturwert von 0 - 125 °C an einer 3 stelliegen 7 
Segment Anzeige anzeigen lassen. Ich habe aber nun das Problem das ich 
nicht genau weiß wie ich die Binärzahl in einzelne Dezimalstellen in der 
"Hochsprache C" umwandeln kann. Die richtige Pinausgabe an den Ports mit 
hilfe eines Datenarrays umzuwandeln bekomme ich hin.
Es wäre super wenn mir mal einer den Quelltext für ein C-Code exmaple 
posten würde (habe nur assembler codes gefunden), damit ich mich dort 
reinarbeiten kann.

MfG Dennis
Gast #2121289
Lesenswert?

Wow das ging schnell Christopher,
ersteinmal danke für deine Antwort.

Hab noch ein paar kurze fragen dazu.

num ist meine binärzahl die ich habe, oder?

Und aus buf kann ich dann später die einzelne dezimal stelle 
herausziehen, oder?
Mit      Dezimalstelle0 = buff[0];
Danach steht dann in Dezimalstelle0 meine einer werte.

Wäre echt nochmal dankbar für ne Antwort..
Gast #2121335
Lesenswert?

Vorsicht: '0' ist nicht die Zahl 0, sondern das (ASCII-)Zeichen 0, also 
in Wirklichkeit die Zahl 48. Weil in ASCII alle Dezimalziffern 
hintereinander aufsteigend liegen, kann man eben durch Addition mit 48 
(also '0') das passende ASCII-Zeichen einer Dezimalziffer erhalten.
Gast #2121346
Lesenswert?

Achso,

also für mein 7 segment display einfach die '0' weglassen.

wollte das so machen:

uint8_t num, i;
char buf[3];

for(i = 0; num >= 100; i++, num -= 100);
buf[0] = 0+i;
for(i = 0; num >= 10; i++, num -= 10);
buf[1] = 0+i;
buf[2] = 0+num;

unsigned char display_value[] =
{
   0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};

PORTD = display_value[buf[0]] ;   //für 100er

funktioniert das so?
Gast #2121366
Lesenswert?

Ja, aber natürlich kann man die Additionen auf 0 komplett weglassen, 
also wie gesagt
1
for(i = 0; num >= 100; i++, num -= 100);
2
buf[0] = i;
3
for(i = 0; num >= 10; i++, num -= 10);
4
buf[1] = i;
5
buf[2] = num;
#2123628
Lesenswert?

Hallo Christopher,

netter kurzer Code.

Ich habe das Problem bisher auf ähnliche Art, anstatt der Schleife habe 
ich jedoch Modulo (%) verwendet.

Ich habe beide Varianten compiliert und die Variante mit Modulo war 
einige Bytes kleiner. Ich hätte eher erwartet, das die Schleifenvariante 
weniger Code benötigt, da nicht dividiert werden muß.

Hast jemand eine Erklärung dafür?

Mfg

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