Neste projeto será utilizado o MAX7219 que permite o acionamento de displays de LEDs. Com ele é
possível acionar até 8 displays de 7 segmentos ou uma matriz de LEDs de
8X8. A entrada de dados é feita de forma serial, reduzindo a quantidade
de pinos do microcontrolador. São utilizados apenas 3 pinos para
interface com o microcontrolador, DIN, CLK e CS. O pino DIN é utilizado
para inserir os bits (16 bits), que é sincronizado pelo pino CLK, o
clock de sincronismo definido pelo microcontrolador. O pino CS é
utilizado para transferir os 16 bits inseridos para o display.
A ligação do Módulo MAX 7219 é bem simples, conforme mostrado na figura abaixo:
Após conectar os fios, carregue o código:
1
2
3 /* Este programa permite exibição de uma mensagem com rolagem
horizontal*/
4
5 #
include <avr/pgmspace.h>
6 #
include <TimerOne.h>
7 #
define DataPin 2 // Porta 2 do Arduino ligada ao DIN
8 #
define CSPin 3 // Porta 3 do Arduino ligada ao CS
9 #
define ClockPin 4 // Porta 4 do
Arduino ligada ao CLK
10
11 byte buffer[8];
12 const byte font[][8] PROGMEM =
13
14 {
15 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000},
16 {B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000000, B00000100},
17 {B00001010, B00001010, B00001010, B00000000, B00000000, B00000000, B00000000, B00000000},
18 {B00000000, B00001010, B00011111, B00001010, B00011111, B00001010, B00011111, B00001010},
19 {B00000111, B00001100, B00010100, B00001100, B00000110, B00000101, B00000110, B00011100},
20 {B00011001, B00011010, B00000010, B00000100, B00000100, B00001000, B00001011, B00010011},
21 {B00000110, B00001010, B00010010, B00010100, B00001001, B00010110, B00010110, B00001001},
22 {B00000100, B00000100, B00000100, B00000000, B00000000, B00000000, B00000000, B00000000},
23 {B00000010, B00000100, B00001000, B00001000, B00001000, B00001000, B00000100, B00000010},
24 {B00001000, B00000100, B00000010, B00000010, B00000010, B00000010, B00000100, B00001000},
25 {B00010101, B00001110, B00011111, B00001110, B00010101, B00000000, B00000000, B00000000},
26 {B00000000, B00000000, B00000100, B00000100, B00011111, B00000100, B00000100, B00000000},
27 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000110, B00000100, B00001000},
28 {B00000000, B00000000, B00000000, B00000000, B00001110, B00000000, B00000000, B00000000},
29 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000100},
30 {B00000001, B00000010, B00000010, B00000100, B00000100, B00001000, B00001000, B00010000},
31 {B00001110, B00010001, B00010011, B00010001, B00010101, B00010001, B00010001, B00001110},
32 {B00000100, B00001100, B00010100, B00000100, B00000100, B00000100, B00000100, B00011111},
33 {B00001110, B00010001, B00010001, B00000010, B00000100, B00001000, B00010000, B00011111},
34 {B00001110, B00010001, B00000001, B00001110, B00000001, B00000001, B00010001, B00001110},
35 {B00010000, B00010000, B00010100, B00010100, B00011111, B00000100, B00000100, B00000100},
36 {B00011111, B00010000, B00010000, B00011110, B00000001, B00000001, B00000001, B00011110},
37 {B00000111, B00001000, B00010000, B00011110, B00010001, B00010001, B00010001, B00001110},
38 {B00011111, B00000001, B00000001, B00000001, B00000010, B00000100, B00001000, B00010000},
39 {B00001110, B00010001, B00010001, B00001110, B00010001, B00010001, B00010001, B00001110},
40 {B00001110, B00010001, B00010001, B00001111, B00000001, B00000001, B00000001, B00000001},
41 {B00000000, B00000100, B00000100, B00000000, B00000000, B00000100, B00000100, B00000000},
42 {B00000000, B00000100, B00000100, B00000000, B00000000, B00000100, B00000100, B00001000},
43 {B00000001, B00000010, B00000100, B00001000, B00001000, B00000100, B00000010, B00000001},
44 {B00000000, B00000000, B00000000, B00011110, B00000000, B00011110, B00000000, B00000000},
45 {B00010000, B00001000, B00000100, B00000010, B00000010, B00000100, B00001000, B00010000},
46 {B00001110, B00010001, B00010001, B00000010, B00000100, B00000100, B00000000, B00000100},
47 {B00001110, B00010001, B00010001, B00010101, B00010101, B00010001, B00010001, B00011110},
48 {B00001110, B00010001, B00010001, B00010001, B00011111, B00010001, B00010001, B00010001},
49 {B00011110, B00010001, B00010001, B00011110, B00010001, B00010001, B00010001, B00011110},
50 {B00000111, B00001000, B00010000, B00010000, B00010000, B00010000, B00001000, B00000111},
51 {B00011100, B00010010, B00010001, B00010001, B00010001, B00010001, B00010010, B00011100},
52 {B00011111, B00010000, B00010000, B00011110, B00010000, B00010000, B00010000, B00011111},
53 {B00011111, B00010000, B00010000, B00011110, B00010000, B00010000, B00010000, B00010000},
54 {B00001110, B00010001, B00010000, B00010000, B00010111, B00010001, B00010001, B00001110},
55 {B00010001, B00010001, B00010001, B00011111, B00010001, B00010001, B00010001, B00010001},
56 {B00011111, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00011111},
57 {B00011111, B00000100, B00000100, B00000100, B00000100, B00000100, B00010100, B00001000},
58 {B00010001, B00010010, B00010100, B00011000, B00010100, B00010010, B00010001, B00010001},
59 {B00010000, B00010000, B00010000, B00010000, B00010000, B00010000, B00010000, B00011111},
60 {B00010001, B00011011, B00011111, B00010101, B00010001, B00010001, B00010001, B00010001},
61 {B00010001, B00011001, B00011001, B00010101, B00010101, B00010011, B00010011, B00010001},
62 {B00001110, B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00001110},
63 {B00011110, B00010001, B00010001, B00011110, B00010000, B00010000, B00010000, B00010000},
64 {B00001110, B00010001, B00010001, B00010001, B00010001, B00010101, B00010011, B00001111},
65 {B00011110, B00010001, B00010001, B00011110, B00010100, B00010010, B00010001, B00010001},
66 {B00001110, B00010001, B00010000, B00001000, B00000110, B00000001, B00010001, B00001110},
67 {B00011111, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100},
68 {B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00001110},
69 {B00010001, B00010001, B00010001, B00010001, B00010001, B00010001, B00001010, B00000100},
70 {B00010001, B00010001, B00010001, B00010001, B00010001, B00010101, B00010101, B00001010},
71 {B00010001, B00010001, B00001010, B00000100, B00000100, B00001010, B00010001, B00010001},
72 {B00010001, B00010001, B00001010, B00000100, B00000100, B00000100, B00000100, B00000100},
73 {B00011111, B00000001, B00000010, B00000100, B00001000, B00010000, B00010000, B00011111},
74 {B00001110, B00001000, B00001000, B00001000, B00001000, B00001000, B00001000, B00001110},
75 {B00010000, B00001000, B00001000, B00000100, B00000100, B00000010, B00000010, B00000001},
76 {B00001110, B00000010, B00000010, B00000010, B00000010, B00000010, B00000010, B00001110},
77 {B00000100, B00001010, B00010001, B00000000, B00000000, B00000000, B00000000, B00000000},
78 {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00011111},
79 {B00001000, B00000100, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000},
80 {B00000000, B00000000, B00000000, B00001100, B00010010, B00011110, B00010010, B00011111},
81 {B00000000, B00010000, B00010000, B00010000, B00011110, B00010001, B00010001, B00011110},
82 {B00000000, B00000000, B00000000, B00001110, B00010000, B00010000, B00010000, B00001110},
83 {B00000000, B00000001, B00000001, B00000001, B00001111, B00010001, B00010001, B00001110},
84 {B00000000, B00000000, B00000000, B00011100, B00010010, B00011110, B00010000, B00001110},
85 {B00000000, B00000011, B00000100, B00000100, B00000110, B00000100, B00000100, B00000100},
86 {B00000000, B00001110, B00001010, B00001010, B00001110, B00000010, B00000010, B00001100},
87 {B00000000, B00010000, B00010000, B00010000, B00011100, B00010010, B00010010, B00010010},
88 {B00000000, B00000000, B00000100, B00000000, B00000100, B00000100, B00000100, B00000100},
89 {B00000000, B00000010, B00000000, B00000010, B00000010, B00000010, B00000010, B00001100},
90 {B00000000, B00010000, B00010000, B00010100, B00011000, B00011000, B00010100, B00010000},
91 {B00000000, B00010000, B00010000, B00010000, B00010000, B00010000, B00010000, B00001110},
92 {B00000000, B00000000, B00000000, B00001010, B00010101, B00010001, B00010001, B00010001},
93 {B00000000, B00000000, B00000000, B00010100, B00011010, B00010010, B00010010, B00010010},
94 {B00000000, B00000000, B00000000, B00001100, B00010010, B00010010, B00010010, B00001100},
95 {B00000000, B00001110, B00010001, B00010001, B00001110, B00010000, B00010000, B00010000},
96 {B00000000, B00001110, B00010010, B00010010, B00001110, B00000010, B00000010, B00000001},
97 {B00000000, B00000000, B00000000, B00001010, B00001100, B00001000, B00001000, B00001000},
98 {B00000000, B00000000, B00001110, B00010000, B00001000, B00000100, B00000010, B00011100},
99 {B00000000, B00010000, B00010000, B00011100, B00010000, B00010000, B00010000, B00001100},
100 {B00000000, B00000000, B00000000, B00010010, B00010010, B00010010, B00010010, B00001100},
101 {B00000000, B00000000, B00000000, B00010001, B00010001, B00010001, B00001010, B00000100},
102 {B00000000, B00000000, B00000000, B00010001, B00010001, B00010001, B00010101, B00001010},
103 {B00000000, B00000000, B00000000, B00010001, B00001010, B00000100, B00001010, B00010001},
104 {B00000000, B00000000, B00010001, B00001010, B00000100, B00001000, B00001000, B00010000},
105 {B00000000, B00000000, B00000000, B00011111, B00000010, B00000100, B00001000, B00011111},
106 {B00000010, B00000100, B00000100, B00000100, B00001000, B00000100, B00000100, B00000010},
107 {B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000100},
108 {B00001000, B00000100, B00000100, B00000100, B00000010, B00000100, B00000100, B00001000},
109 {B00000000, B00011001, B00100110, B00000000, B00000000, B00000000, B00000000, B00000000}
110 };
111
112 void clearDisplay();
113 void initMAX7219();
114 void intensity(int intensity);
115 void writeData(byte MSB, byte LSB);
116 void scroll(char myString[], int speed);
117 void screenUpdate();
118
119 void setup()
120 {
121
initMAX7219();
122 Timer1.initialize(10000);
123 Timer1.attachInterrupt(screenUpdate);
124 }
125 void loop()
126 {
127
clearDisplay(); // Limpa a tela
128 scroll(" Mensagem 1
", 100);
129 scroll(" Mensagem 2
", 150);
130 scroll(" Mensagem 3
", 200);
131
132 }
133
134
135
136 void clearDisplay()
137 {
138 for (byte x=0; x<8; x++)
139 {
140
buffer[x] = B00000000;
141 }
142
screenUpdate();
143 }
144
145
146 void initMAX7219()
147 {
148 pinMode(DataPin, OUTPUT);
149 pinMode(CSPin, OUTPUT);
150 pinMode(ClockPin, OUTPUT);
151
clearDisplay();
152
writeData(B00001011, B00000111);
153
writeData(B00001001, B00000000);
154
writeData(B00001100, B00000001);
155
intensity(15);
156 }
157
158
159 void intensity(int intensity)
160 {
161
162
writeData(B00001010, intensity); // B00001010 é o Registrador de Intensidade
(Intensity Register)
163
164 }
165
166
167 void writeData(byte MSB, byte LSB)
168 {
169 byte
mask; // Utilizado como uma máscara de
bits
170
171
digitalWrite(CSPin, LOW);
172
173 for (mask = B10000000; mask > 0; mask >>= 1)
174 {
175
digitalWrite(ClockPin, LOW);
176
177 if (MSB & mask)
178 {
179
digitalWrite(DataPin,HIGH);
180 }
181 else // se o E bit a bit for falso
182 {
183
digitalWrite(DataPin,LOW);
184 }
185
186
digitalWrite(ClockPin, HIGH);
187 }
188
189 for (mask = B10000000; mask>0; mask >>= 1)
190 {
191
digitalWrite(ClockPin, LOW);
192 if (LSB & mask)
193 {
194
digitalWrite(DataPin,HIGH);
195 }
196 else // se o E bit a bit for falso
197 {
198
digitalWrite(DataPin,LOW);
199 }
200
digitalWrite(ClockPin, HIGH);
201 }
202
203
204
digitalWrite(CSPin, HIGH); //
trava os dados
205
digitalWrite(ClockPin, LOW);
206 }
207
208 void scroll(char myString[], int speed)
209 {
210
211 byte
firstChrRow, secondChrRow;
212 byte
ledOutput;
213 byte
chrPointer = 0;
214 byte
Char1, Char2;
215 byte
scrollBit = 0;
216 byte
strLength = 0;
217 unsigned long time;
218 unsigned long counter;
219
220 while (myString[strLength])
221 {
222
strLength++;
223 }
224
225 counter
= millis();
226
227 while (chrPointer < (strLength-1))
228 {
229
time = millis();
230
231 if (time > (counter + speed))
232 {
233
Char1 = myString[chrPointer];
234
Char2 = myString[chrPointer+1];
235
236
for (byte y= 0; y<8; y++)
237
{
238
firstChrRow = pgm_read_byte(&font[Char1 - 32][y]);
239
240
secondChrRow = (pgm_read_byte(&font[Char2 - 32][y])) << 1;
241
242
ledOutput = (firstChrRow << scrollBit) | (secondChrRow >> (8 - scrollBit) );
243 buffer[y] = ledOutput; // Carrega esse padrão de bits na linha apropriada do
buffer de tela.
244
245
}
246
247
scrollBit++;
248
249
if (scrollBit > 6)
250
{
251
scrollBit = 0;
252
chrPointer++;
253
}
254
counter = millis();
255 }
256 }
257 }
258
259 void screenUpdate()
260 {
261
262 for (byte row = 0; row < 8; row++)
263 {
264
writeData(row+1, buffer[row]);
265 }
266 }
267
Após carregado o código, observa-se três mensagens rolando com velocidades distintas(Mensagem 1, Mensagen 2 e Mensagem 3).
Ou se preferir um código alternativo, o qual permite a entrada da velocidade, intensidade de brilho e texto pelo Monitor Serial.
Nenhum comentário:
Postar um comentário