1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 |
|
5 | #define NOOP 0x00
|
6 | #define DIGIT_0 0x01
|
7 | #define DIGIT_1 0x02
|
8 | #define DIGIT_2 0x03
|
9 | #define DIGIT_3 0x04
|
10 | #define DIGIT_4 0x05
|
11 | #define DIGIT_5 0x06
|
12 | #define DEC_MOD 0x09
|
13 | #define INTENS 0x0A
|
14 | #define SCAN_LIM 0x0B
|
15 | #define SHUTDOWN 0x0C
|
16 | #define DSP_TEST 0x0F
|
17 | #define max_load_0 PORTB &=~(1 << PB1)
|
18 | #define max_load_1 PORTB |= (1 << PB1)
|
19 | #define clock_0 PORTB &=~(1 << PB7)
|
20 | #define clock_1 PORTB |= (1 << PB7)
|
21 | #define din_0 PORTB &=~(1 << PB5)
|
22 | #define din_1 PORTB |= (1 << PB5)
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 | // Unterprogramme anmelden
|
30 | void port(void);
|
31 | void max_init(void);
|
32 | void max_uebertragung(char Adr1, char Data1, char Adr2, char Data2);
|
33 |
|
34 | void port(void) // alle Ports deklarieren
|
35 | {
|
36 | DDRA = 0xFF; // Alle Pins des Port A als Ausgang deklarieren
|
37 | DDRA &= ~((1<<PA0)|(1<<PA5)|(1<<PA6)|(1<<PA7)); // Eingänge des Port A deklarieren
|
38 | PORTA |= (1<<PA0); // Interne Pull-Up Widerstände einschalten
|
39 |
|
40 | DDRB = 0xFF; // Alle Pins des Port B als Ausgang deklarieren
|
41 | DDRB &= ~(1<<PB6); // Eingang des Port B deklarieren
|
42 |
|
43 | DDRC = 0xFF; // Alle Pins des Port C als Ausgang deklarieren
|
44 | DDRC &= ~(1<<PC4); // Eingang des Port C deklarieren
|
45 |
|
46 | DDRD = 0xFF; // Alle Pins des Port D als Ausgang deklarieren
|
47 | }
|
48 |
|
49 | int main(void) // Hauptprogramm
|
50 | {
|
51 | port(); // port aufrufen
|
52 | max_init(); // max_init aufrufen
|
53 | }
|
54 |
|
55 |
|
56 |
|
57 | void max_init(void)
|
58 | {
|
59 | // LOAD anfangs auf 1 setzen
|
60 | max_load_1;
|
61 | // clock anfangs auf 1 setzen
|
62 | clock_1;
|
63 |
|
64 | // Shutdown an beide MAX7219 senden
|
65 | max_uebertragung(SHUTDOWN, 0x00, SHUTDOWN, 0x00);
|
66 |
|
67 | // Intensität an beide MAX7219 senden
|
68 | max_uebertragung(INTENS, 0x0F, INTENS, 0x0F);
|
69 |
|
70 | // Decode Mode aus an beide MAX7219 senden
|
71 | max_uebertragung(DEC_MOD, 0x00, DEC_MOD, 0x00);
|
72 |
|
73 | // Scanlimit an beide MAX7219 senden
|
74 | max_uebertragung(SCAN_LIM, 0x05, SCAN_LIM, 0x05);
|
75 |
|
76 | // Shutdown aus an beide MAX7219 senden
|
77 | max_uebertragung(SHUTDOWN, 0x01, SHUTDOWN, 0x01);
|
78 |
|
79 | // Displaytest aus an beide MAX7219 senden
|
80 | max_uebertragung(DSP_TEST, 0x00, DSP_TEST, 0x00);
|
81 |
|
82 | }
|
83 |
|
84 | void max_uebertragung(char Adr1, char Data1, char Adr2, char Data2)
|
85 | {
|
86 | char i, maske;
|
87 |
|
88 | max_load_0;
|
89 | maske = 0x80;
|
90 |
|
91 | for (i=0; i<8; i++)
|
92 | {
|
93 | clock_0;
|
94 | if ((maske & Adr1) !=0)
|
95 | {
|
96 | din_1;
|
97 | }
|
98 | else
|
99 | {
|
100 | din_0;
|
101 | }
|
102 |
|
103 | // Takt erzeugen
|
104 | clock_1;
|
105 | // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
|
106 | maske = maske >> 1;
|
107 | }
|
108 |
|
109 | maske = 0x80;
|
110 |
|
111 | for (i=0; i<8; i++)
|
112 | {
|
113 | clock_0;
|
114 | if ((maske & Data1) !=0)
|
115 | {
|
116 | din_1;
|
117 | }
|
118 | else
|
119 | {
|
120 | din_0;
|
121 | }
|
122 |
|
123 | // Takt erzeugen
|
124 | clock_1;
|
125 | // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
|
126 | maske = maske >> 1;
|
127 | }
|
128 |
|
129 | for (i=0; i<8; i++)
|
130 | {
|
131 | clock_0;
|
132 | if ((maske & Adr2) !=0)
|
133 | {
|
134 | din_1;
|
135 | }
|
136 | else
|
137 | {
|
138 | din_0;
|
139 | }
|
140 |
|
141 | // Takt erzeugen
|
142 | clock_1;
|
143 | // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
|
144 | maske = maske >> 1;
|
145 | }
|
146 |
|
147 | for (i=0; i<8; i++)
|
148 | {
|
149 | clock_0;
|
150 | if ((maske & Data2) !=0)
|
151 | {
|
152 | din_1;
|
153 | }
|
154 | else
|
155 | {
|
156 | din_0;
|
157 | }
|
158 |
|
159 | // Takt erzeugen
|
160 | clock_1;
|
161 | // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
|
162 | maske = maske >> 1;
|
163 | }
|
164 | max_load_1;
|
165 | }
|