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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.