Matriz de LEDs 8x8 com MAX 7219

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:

Matriz de LEDs 8x8 com MAX 7219

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