1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 | /*
|
5 | 8x8 DOT MATRIX CC
|
6 | PIN 13 | 3 | 4 | 10 | 5 | 11 | 15 | 16
|
7 | COL 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
|
8 |
|
9 | PIN 9 | 14 | 8 | 12 | 1 | 7 | 2 | 5
|
10 | ROW 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
|
11 | */
|
12 |
|
13 | #define MAX7219_DDR DDRD
|
14 | #define MAX7219_PORT PORTD
|
15 |
|
16 | #define MAX7219_CLK (1<<PIND4) // MAX7219.CLK
|
17 | #define MAX7219_LOAD (1<<PIND3) // MAX7219.LOAD
|
18 | #define MAX7219_DIN (1<<PIND2) // MAX7219.DIN
|
19 |
|
20 | #define NUM_MAX7219 1 // Anzahl MAX7219
|
21 | #define MAX7219_BRIGHTNESS 7 // Helligkeit der MAX7219 beim Init
|
22 |
|
23 | // Register MAX7219
|
24 | #define MAX7219_NO_OP 0x00
|
25 | #define MAX7219_DIGIT_0 0x01
|
26 | #define MAX7219_DIGIT_1 0x02
|
27 | #define MAX7219_DIGIT_2 0x03
|
28 | #define MAX7219_DIGIT_3 0x04
|
29 | #define MAX7219_DIGIT_4 0x05
|
30 | #define MAX7219_DIGIT_5 0x06
|
31 | #define MAX7219_DIGIT_6 0x07
|
32 | #define MAX7219_DIGIT_7 0x08
|
33 | #define MAX7219_DEC_MODE 0x09
|
34 | #define MAX7219_INTENSITY 0x0A
|
35 | #define MAX7219_SCAN_LIMIT 0x0B
|
36 | #define MAX7219_SHUTDOWN 0x0C
|
37 | #define MAX7219_DISP_TEST 0x0F
|
38 |
|
39 | void max7219_init(void);
|
40 | void max7219_fill(uint8_t data);
|
41 | static void max7219_sendByte(uint8_t data);
|
42 | void max7219_send(uint8_t num_max7219, uint8_t reg, uint8_t data);
|
43 |
|
44 | int main(void)
|
45 | {
|
46 | max7219_init();
|
47 | max7219_fill(0x00);
|
48 |
|
49 | while(1)
|
50 | {
|
51 | max7219_send(0, MAX7219_DIGIT_0, 0b10000001);
|
52 | max7219_send(0, MAX7219_DIGIT_1, 0b01000010);
|
53 | max7219_send(0, MAX7219_DIGIT_2, 0b00100100);
|
54 | max7219_send(0, MAX7219_DIGIT_3, 0b00011000);
|
55 | max7219_send(0, MAX7219_DIGIT_4, 0b00011000);
|
56 | max7219_send(0, MAX7219_DIGIT_5, 0b00100100);
|
57 | max7219_send(0, MAX7219_DIGIT_6, 0b01000010);
|
58 | max7219_send(0, MAX7219_DIGIT_7, 0b10000001);
|
59 | _delay_ms(100);
|
60 | }
|
61 | }
|
62 |
|
63 | void max7219_init(void)
|
64 | {
|
65 | MAX7219_DDR |= (MAX7219_CLK | MAX7219_LOAD | MAX7219_DIN);
|
66 |
|
67 | MAX7219_PORT |= (MAX7219_LOAD);
|
68 | MAX7219_PORT &= ~(MAX7219_CLK | MAX7219_DIN);
|
69 |
|
70 | for(uint8_t num_max7219 = 0; num_max7219 < NUM_MAX7219; num_max7219++)
|
71 | {
|
72 | max7219_send(num_max7219, MAX7219_SHUTDOWN, 1);
|
73 | max7219_send(num_max7219, MAX7219_DISP_TEST, 0);
|
74 | max7219_send(num_max7219, MAX7219_DEC_MODE, 0);
|
75 | max7219_send(num_max7219, MAX7219_INTENSITY, MAX7219_BRIGHTNESS);
|
76 | max7219_send(num_max7219, MAX7219_SCAN_LIMIT, 7);
|
77 | }
|
78 | }
|
79 |
|
80 | void max7219_fill(uint8_t data)
|
81 | {
|
82 | for(uint8_t num_max7219 = 0; num_max7219 < NUM_MAX7219; num_max7219++)
|
83 | {
|
84 | for(uint8_t i = 0; i < 8; i++)
|
85 | max7219_send(num_max7219, MAX7219_DIGIT_0 + i, data);
|
86 | }
|
87 | }
|
88 |
|
89 | static void max7219_sendByte(uint8_t data)
|
90 | {
|
91 | int8_t j = 0;
|
92 |
|
93 | for(j = 7; j >= 0; j--)
|
94 | {
|
95 | MAX7219_PORT &= ~MAX7219_CLK;
|
96 |
|
97 | if(data & (1 << j)) MAX7219_PORT |= MAX7219_DIN;
|
98 | else MAX7219_PORT &= ~MAX7219_DIN;
|
99 |
|
100 | MAX7219_PORT |= MAX7219_CLK;
|
101 | }
|
102 | }
|
103 |
|
104 | void max7219_send(uint8_t num_max7219, uint8_t reg, uint8_t data)
|
105 | {
|
106 | uint8_t i = 0;
|
107 |
|
108 | if (num_max7219 < NUM_MAX7219)
|
109 | {
|
110 | MAX7219_PORT &= ~MAX7219_LOAD;
|
111 |
|
112 | for(i = num_max7219; i < (NUM_MAX7219 - 1); i++)
|
113 | {
|
114 | max7219_sendByte(MAX7219_NO_OP); // NO_OP Register
|
115 | max7219_sendByte(MAX7219_NO_OP); // NO_OP Data
|
116 | }
|
117 |
|
118 | max7219_sendByte(reg);
|
119 | max7219_sendByte(data);
|
120 |
|
121 | for(i = 0; i < num_max7219; i++)
|
122 | {
|
123 | max7219_sendByte(MAX7219_NO_OP); // NO_OP Register
|
124 | max7219_sendByte(MAX7219_NO_OP); // NO_OP Data
|
125 | }
|
126 |
|
127 | MAX7219_PORT |= MAX7219_LOAD;
|
128 | }
|
129 | }
|