Hallo an alle!
Ich möchte mit meinem ATMega8 vier 7 Segment Displays hochzählen lassen.
Also von 0-9999.
Leider bin ich bisher darin echt nicht bewandert und möchte, bevor ich
selber meinen Code schreibe, zunächst einmal an einem Beispielcode
nachvollziehen können wie das Ganze abläuft.
Folgendes habe ich dabei gefunden:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | #define F_CPU 8000000
|
6 |
|
7 | int damn [10] = {~(0x3F), ~(0x06), ~(0x5B), ~(0x4F), ~(0x66), ~(0x6D), ~(0x7D), ~(0x07), ~(0x7F), ~(0x6F)};
|
8 |
|
9 | volatile uint16_t x = 0;
|
10 | volatile uint16_t y = 0;
|
11 |
|
12 | void seven_write(uint16_t i_digit)
|
13 | {
|
14 | PORTD = damn[i_digit];
|
15 | }
|
16 |
|
17 | int main(void)
|
18 | {
|
19 | DDRB |= (1 << PB0);
|
20 | DDRC |= 0x1E;
|
21 | DDRD |= 0x7F;
|
22 |
|
23 | PORTD = 0x7F; //alle PORT Pins als output
|
24 | PORTC = 0x7F;
|
25 |
|
26 | TIMSK |= (1 << TOIE0);
|
27 | TCCR0 |= (1 << CS01) | (1 << CS00);
|
28 |
|
29 | TCCR1B |= (1 << WGM12) | (1 << CS10) | (1 << CS11); //für multiplexing
|
30 | OCR1A = 15625;
|
31 | TIMSK |= (1 << OCIE1A);
|
32 |
|
33 | sei();
|
34 |
|
35 | while (1)
|
36 | {
|
37 | }
|
38 | }
|
39 |
|
40 | ISR (TIMER0_OVF_vect)
|
41 | {
|
42 | PORTC &= ~(1 << (y+4));
|
43 | y ^= 1;
|
44 |
|
45 | if (y == 0)
|
46 | {
|
47 | seven_write(x%10);
|
48 | }
|
49 | else
|
50 | {
|
51 | seven_write(x/10%10);
|
52 | }
|
53 |
|
54 | PORTC |= (1 << (y+4));
|
55 | }
|
56 |
|
57 | ISR (TIMER1_COMPA_vect)
|
58 | {
|
59 | x++;
|
60 | }
|
Wenn ich mir das so anschaue, dann vermute ich, dass hier nur eine
Segmentanzeige angesteuert wird. Aber mir erschließt sich noch nicht
ganz, wie ich das zu vier Segmentanzeigen erweitern kann.
Bitte seid etwas gnädig. Ich habe mir auch schon diverse Tutorials dazu
durchgelesen, jedoch erschließt sich mir das Thema so noch nicht zu
100%.
LG :)