Ach du Schande. Jetzt seh ichs erst.
Was hast du denn da gemacht?
1 | PORTD = 0b00000001;
|
2 | _delay_ms(2500);
|
3 | PORTD = 0b00000010;
|
4 | _delay_ms(2000);
|
5 | PORTD = 0b00000011;
|
6 | _delay_ms(2000);
|
7 | PORTD = 0b00001000;
|
Warum hast du denn die Datenleitungen nicht vernünftig zu deinem Dekoder
gezogen sondern die Bits 2 und 3 vertauscht?
Das war keine gute Idee! Damit verschenkst du dir die Möglichkeit,
einstellige Zahlen einfach auf den Port ausgeben zu können.
Dann muss das jetzt eben ein bischen anders gemacht werden
1 | uint8_t digits[] = { 0b00000000,
|
2 | 0b00000001,
|
3 | 0b00000010,
|
4 | 0b00000011,
|
5 | 0b00001000,
|
6 | 0b00001001,
|
7 | 0b00001010,
|
8 | 0b00001011,
|
9 | 0b00000100,
|
10 | 0b00000101,
|
11 | };
|
12 |
|
13 |
|
14 | int main(void)
|
15 | {
|
16 | uint8_t Counter = 0,
|
17 |
|
18 | DDRD = 0xFF;
|
19 |
|
20 | while(1) {
|
21 | PORTD = digits[ Counter ];
|
22 | _delay_ms(2500);
|
23 |
|
24 | Counter++;
|
25 | if( Counter == 10 )
|
26 | Counter = 0;
|
27 | }
|
28 | }
|
Dieses Umkodieren hättest du dir sparen können, wenn du dafür gesorgt
hättest, das alle Ziffern bit-richtig an den Dekoder angelegt werden.
Dann hätte das Bitmuster einer einstelligen Dezimalzahl schon gepasst.
So hast du diese Chance vertan und im Grunde muss man sagen: ausser das
du nur 4 Leitungen anstelle von 8 benötigst, hast du keinen Vorteil mehr
vom Dekoder. Das Umsetzen der Ziffer in ein Muster, welche von 8 LED
leuchten sollen (eben genau das, was der Dekoder macht), hättest du
genausogut auch mit diesem Array machen können und dir den ganzen
Dekoder sparen können. Dann könntest du zb selbst entscheiden, wie eine
'6' oder eine '9' dargestellt wird, könntest auch Hex-Ziffern hinmalen,
bzw. könntest überhaupt jedes beliebige Muster auf der 7-Segmentanzeige
darstellen. Wie machst du denn bei einer mehrstelligen Anzeige zb die
Ausgabe von negativen Zahlen? Dazu brauchst du ein '-', das du aber vom
Dekoder nicht kriegst.