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
1 | uint8_t num, i; |
2 | char buf[3]; |
3 | |
4 | for(i = 0; num >= 100; i++, num -= 100); |
5 | buf[0] = '0'+i; |
6 | for(i = 0; num >= 10; i++, num -= 10); |
7 | buf[1] = '0'+i; |
8 | buf[2] = '0'+num; |
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..
Ja, num ist eine Zahl von 0 bis 255. In buf[0] ist die 100er Stelle, in buf[1] die 10er Stelle und in buf[2] die 1er Stelle. Alles als ASCII character. Ist jetzt nicht bös gemeint, aber kauf dir ein Buch über C oder lies ein paar Tutorials durch. Das ist Grundwissen.
Für die 7 Segment Anzeigen braucht man wohl kaum ASCII sondern direkt die Werte, lass da einfach die Addition auf '0' weg (also "buf[0] = i;" usw.).
Super danke für deine Antwort. Ja werd mir mal noch nen paar tutorials durchlesen müssen. Hast mir aber sehr geholfen, danke Gruß Dennis
@ Andreas, Macht das einen Unterschied ob ich '0'+i mache? Dachte das is nur vom Datentyp abhängig. MfG Dennis
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.
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?
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; |
Super, vielen dank nochmal an euch,das hat mir echt weitergeholfen :). Wäre echt super wenn alle Leute so hilfsbereit wären... MfG Dennis
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
Julian Baugatz schrieb: > Ich hätte eher erwartet, das die Schleifenvariante > weniger Code benötigt, da nicht dividiert werden muß. Ist sie auch. Aber Dein Programm enthält schon eine Division an anderer Stelle und daher wurde der Code für Division/Modulo bereits eingebunden. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.