1 | /****************** Portbelegung *******************************************************/
|
2 | #define MAX7219DIN GPIO.F5
|
3 | #define MAX7219LOAD GPIO.F2
|
4 | #define MAX7219CLK GPIO.F4
|
5 |
|
6 | /****************** Funktionsprototypen ************************************************/
|
7 | // Zwei MAX7219 hintereinander (kaskadiert)
|
8 | void MAX7219_INIT2(char Scanlimit, char ShutdownFormat, char DecodeMode, char Intensity);
|
9 | void MAX7219_KOMMANDO2(char Adr1, char Data1, char Adr2, char Data2);
|
10 |
|
11 | // Hilfsunterprogramm
|
12 | void MAX7219_SENDBYTE(char Byte);
|
13 |
|
14 | /****************** Controller initialisieren ******************************************/
|
15 | void INIT(void)
|
16 | {
|
17 | OSCCAL = 0b11111100;
|
18 |
|
19 | // Port konfigurieren
|
20 | TRISIO = 0b00000000; // Richtungsregister Port (0: Ausgang, 1: Eingang)
|
21 | /* ++------------------- Bit 7-6 Reserve
|
22 | +------------------ Bit 5 Port GP5: hier Ausgang (Takt CLK)
|
23 | +----------------- Bit 4 Port GP4: hier Ausgang (Data DIN)
|
24 | +---------------- Bit 3 Port GP3: hier unbenutzt
|
25 | +--------------- Bit 2 Port GP2: hier Ausgang (LOAD)
|
26 | +-------------- Bit 1 Port GP1: hier unbenutzt
|
27 | +------------- Bit 0 Port GP0: hier unbenutzt
|
28 | */
|
29 | }
|
30 |
|
31 | //****************** Unterprogramm Daten ********************
|
32 |
|
33 | void DATEN(void)
|
34 | {
|
35 | char D1_W1 = 0;
|
36 | char D1_W2 = 0;
|
37 | char D1_W3 = 0;
|
38 | char D1_W4 = 0;
|
39 | char D1_W5 = 0;
|
40 | char D1_W6 = 0;
|
41 | char D1_W7 = 0;
|
42 | char D1_W8 = 0;
|
43 |
|
44 | char D2_W1 = 0;
|
45 | char D2_W2 = 0;
|
46 | char D2_W3 = 0;
|
47 | char D2_W4 = 0;
|
48 | char D2_W5 = 0;
|
49 | char D2_W6 = 0;
|
50 | char D2_W7 = 0;
|
51 | char D2_W8 = 0;
|
52 |
|
53 | char SZ;
|
54 | for (SZ=17; SZ>0; SZ--)
|
55 | {
|
56 |
|
57 | // Adressen und Daten an den MAX7219 schicken
|
58 | MAX7219_KOMMANDO2(0x01, D1_W1, 0x01, D2_W1);
|
59 | MAX7219_KOMMANDO2(0x02, D1_W2, 0x02, D2_W2);
|
60 | MAX7219_KOMMANDO2(0x03, D1_W3, 0x03, D2_W3);
|
61 | MAX7219_KOMMANDO2(0x04, D1_W4, 0x04, D2_W4);
|
62 | MAX7219_KOMMANDO2(0x05, D1_W5, 0x05, D2_W5);
|
63 | MAX7219_KOMMANDO2(0x06, D1_W6, 0x06, D2_W6);
|
64 | MAX7219_KOMMANDO2(0x07, D1_W7, 0x07, D2_W7);
|
65 | MAX7219_KOMMANDO2(0x08, D1_W8, 0x08, D2_W8);
|
66 |
|
67 | // Kurz warten
|
68 | Delay_ms(200);
|
69 |
|
70 | // Den Wert 255 eine Spalte weiter nach vorne kopieren.
|
71 | D2_W1 = D2_W2;
|
72 | D2_W2 = D2_W3;
|
73 | D2_W3 = D2_W4;
|
74 | D2_W4 = D2_W5;
|
75 | D2_W5 = D2_W6;
|
76 | D2_W6 = D2_W7;
|
77 | D2_W7 = D2_W8;
|
78 | D2_W8 = D1_W1;
|
79 | D1_W1 = D1_W2;
|
80 | D1_W2 = D1_W3;
|
81 | D1_W3 = D1_W4;
|
82 | D1_W4 = D1_W5;
|
83 | D1_W5 = D1_W6;
|
84 | D1_W6 = D1_W7;
|
85 | D1_W7 = D1_W8;
|
86 | D1_W8 = 255;
|
87 | }
|
88 | }
|
89 |
|
90 | //***************** Hauptprogramm **************************
|
91 | void main(void)
|
92 | {
|
93 | INIT(); // Controller initialisieren
|
94 |
|
95 | MAX7219_INIT2(0x07, 0x01, 0x00, 0x0F); // MAX7219 initialisieren
|
96 | /* +------------------------ Scanlimit: 8 Digits
|
97 | +------------------ Shutdown-Format: Normal Operation
|
98 | +------------ Decode-Mode: No Decode
|
99 | +------ Intensity: Volle Helligkeit
|
100 | */
|
101 | DATEN();
|
102 |
|
103 | while (1)
|
104 | {
|
105 | }
|
106 | }
|
107 |
|
108 | /****************** Unterprogramme fuer zwei MAX7219 (Kaskadiert) **********************/
|
109 |
|
110 | void MAX7219_INIT2(char Scanlimit, char ShutdownFormat, char DecodeMode, char Intensity)
|
111 | {
|
112 | // Scanlimit an beide MAX7219 senden
|
113 | MAX7219_KOMMANDO2(0x0b, Scanlimit, 0x0b, Scanlimit);
|
114 |
|
115 | // Shutdown-Format an beide MAX7219 senden
|
116 | MAX7219_KOMMANDO2(0x0c, ShutdownFormat, 0x0c, ShutdownFormat);
|
117 |
|
118 | // Decode-Mode an beide MAX7219 senden
|
119 | MAX7219_KOMMANDO2(0x09, DecodeMode, 0x09, DecodeMode);
|
120 |
|
121 | // Intensity an beide MAX7219 senden
|
122 | MAX7219_KOMMANDO2(0x0a, Intensity, 0x0a, Intensity);
|
123 | }
|
124 |
|
125 | //-------------------------------------------------------------
|
126 |
|
127 | void MAX7219_KOMMANDO2(char Adr1, char Data1, char Adr2, char Data2)
|
128 | {
|
129 | // Schritt 1: Steuerleitung LOAD loeschen
|
130 | MAX7219LOAD = 0;
|
131 |
|
132 | // Schritt 2: Die Adresse des ersten MAX7219 bitweise senden
|
133 | MAX7219_SENDBYTE(Adr1);
|
134 |
|
135 | // Schritt 3: Die Daten des ersten MAX7219 bitweise senden
|
136 | MAX7219_SENDBYTE(Data1);
|
137 |
|
138 | // Schritt 4: Die Adresse des zweiten MAX7219 bitweise senden
|
139 | MAX7219_SENDBYTE(Adr2);
|
140 |
|
141 | // Schritt 5: Die Daten des zweiten MAX7219 bitweise senden
|
142 | MAX7219_SENDBYTE(Data2);
|
143 |
|
144 | // Schritt 6: Steuerleitung LOAD setzen und ein positive Taktflanke erzeugen
|
145 | MAX7219LOAD = 1;
|
146 | MAX7219CLK = 1;
|
147 | }
|
148 |
|
149 | /****************** Hilfsunterprogramm *************************************************/
|
150 |
|
151 | void MAX7219_SENDBYTE(char Byte)
|
152 | {
|
153 | char i;
|
154 |
|
155 |
|
156 | for (i=8; i>0; i--)
|
157 | {
|
158 | // MSB ausgeben
|
159 | MAX7219DIN = Byte.F7;
|
160 |
|
161 | // Takt erzeugen
|
162 | MAX7219CLK = 1;
|
163 | MAX7219CLK = 0;
|
164 |
|
165 | // Bits verschieben (Bit 6 -> Bit 7, Bit 5 -> Bit 6 usw.)
|
166 | Byte = Byte << 1;
|
167 | }
|
168 | }
|