22 julho 2013

Controlando display 7 segmentos com o Max7219

Continuando o assunto display 7 segmentos, abordado no meu post anterior, hoje vou controlar o display 7 segmentos usando o CI MAX7219, fabricado pela Maxim.

Arduino - CI Max7219 - Display 7 segmentos


O Max7219 é um CI driver display, isto é, um controlador feito especialmente para trabalhar com displays, tanto os de 7 segmentos, como as matrizes de led. Ele trabalha com displays de catodo comum e a comunicação com o Arduino utiliza apenas 3 portas da placa (veja que no exemplo do post anterior, eu usei 8 portas).

Além disso, com um único chip MAX7219 é possível controlar até 8 displays de 7 segmentos utilizando as mesmas 3 portas do Arduino. Outra vantagem é o uso de apenas um resistor para todos os segmentos, entre os pinos 19 e 18, conforme mostra o datasheet do CI :


A montagem do circuito requer atenção para não danificar o CI. Repare que o "chanfro" fica do lado esquerdo, logo o pino 1 fica à esquerda, abaixo do CI. Observe a pinagem do Max7219 :


Ligamos os pinos SEG A, SEG B,etc. , aos pinos do display, segmentos A, B, C, etc. Como neste exemplo temos apenas 1 display, vamos ligar o comum - pino 8 - ao pino DIG 0 do CI. Siga a tabela abaixo :




Para o programa exemplo, vamos utilizar a biblioteca LedControl, que você pode encontrar aqui, ou nesse link :

http://www.wayoda.org/arduino/downloads/LedControl.zip

Instalada a biblioteca, carregue o seguinte programa no Arduino :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Programa : Contador display 7 segmentos usando CI Max7219
// Alteracoes / comentarios  : Arduino e Cia
// Baseado no programa exemplo da biblioteca LedControl

#include "LedControl.h" //Carrega a biblioteca LedControl

// Pino 4 do Arduino ao pino 1 (DIN) do CI
// Pino 5 do Arduino ao pino 13 (CLK) do CI
// Pino 6 do Arduino ao pino 12 (LOAD) do CI
// Ultimo parametro se refere a qtde de MAX7219 no circuito

LedControl lc=LedControl(4,5,6,1); 

boolean pontodecimal;  //Armazena o estado do ponto decimal (Lig/Desl)

void setup() 
{ 
  // Inicializa o Max7219
  lc.shutdown(0,false); // Habilita o display 
  // Define o nivel de luminosidade (0 minimo, 15  maximo)
  lc.setIntensity(0,10); 
  lc.clearDisplay(0); // Apaga o display
  Serial.begin(9600); // Inicializa a serial
  pontodecimal = true;  //Define o ponto decimal como LIGADO
} 

void loop() 
{ 
  for(int i=0; i < 10 ; i++)  //Loop variando valor de i de 0 a 9
  { 
    lc.setDigit(0,0,i,pontodecimal);  //Mostra o valor de i no display 
    Serial.println(i);
    pontodecimal = !pontodecimal; //Inverte o estado do ponto decimal
    delay(1000);  //Aguarda 1 segundo e mostra o próximo valor
  } 
delay(1000);  //Aguarda 1 segundo e reinicia a contagem
}

Este programa configura as portas a serem utilizadas com os pinos DIN, CLK e LOAD do CI, inicializa o display e mostra os valores de 0 a 9 por meio de um loop. Como costumo fazer, mostro também o valor no monitor serial, para fins de acompanhamento e análise caso ocorra algum problema na ligação do circuito.

No próximo artigo, vamos utilizar este circuito como base, e mostrar como utilizar esse CI para controlar 2 (ou mais) displays.

Atualizado : Controlando 2 displays de 7 segmentos com o Max7219

Até a próxima !



2 comentários:

  1. Boa tarde, leio e releio, mas até agora não consegui fazer com que um loop não intefira noutra porta, ou seja, coloco (programo) a porta 13 para piscar e a porta 8 para gerar um tom em determinado momento, mas quando entra o tom, o led para de piscar....desculpe mas não sou programador, por isso a dúvida.

    ResponderExcluir
  2. Boa tarde Ronaldo !

    Provavelmente o seu programa precise de algum ajuste. Se preferir, use o formulário de contato e eu vejo no que posso te ajudar. Abraço e obrigado pela visita !

    ResponderExcluir