Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

PIC: Display 7 Segmentos com MAX7219

Share:

PIC: Display 7 Segmentos com MAX7219



MAX7219 é um driver para displays de catodo comum, sendo assim utilizados em displays de 7 segmentos, bargraph e matriz de leds 8x8.

O chip oferece dois modos de exibição: "Decode Mode" destina-se aos displays de 7 segmentos e o outro modo, "No-Decode Mode" é perfeito para controlar matriz de LEDs 8x8.

No projeto fiz um relógio digital, utilizando o RTC DS1307. O PIC utilizado é o 12F675.

No código, há três funções para trabalhar com o MAX7219:
void MAX7219_Init() - Inicia a comunicação SPI e configura o chip.
void MAX7219_putByte(char byte, char digito) - Envia um byte para o digito especificado.


void MAX7219_putNumber(char *string) - Escreve o numero no display. O parâmetro recebe uma string no seguinte formato "-1.2802789".Quer dizer que você pode escrever um número de 0 a 9, sinal negativo e ponto flutuante.

Para enviar algum comando, simplesmente você deve resetar o pino CS, e envia o endereço do registro e seu valor, logo após setar o pino CS.

MAX7219_CS = 0;
Soft_SPI_Write(0x0A);//comando
Soft_SPI_Write(0x08);//valor
MAX7219_CS = 1;



DOWNLOAD
Projeto: max7219_7seg.rar

CÓDIGO-FONTE
// Software SPI module connections
sbit SoftSpi_SDI at GP3_bit;
sbit SoftSpi_SDO at GP0_bit;
sbit SoftSpi_CLK at GP2_bit;

sbit SoftSpi_SDI_Direction at TRISIO3_bit;
sbit SoftSpi_SDO_Direction at TRISIO0_bit;
sbit SoftSpi_CLK_Direction at TRISIO2_bit;

//MAX7219
sbit MAX7219_CS at GP1_bit;
sbit MAX7219_CS_Direction at TRISIO1_bit;

//Software I2C module
sbit Soft_I2C_Scl at GP4_bit;
sbit Soft_I2C_Sda at GP5_bit;
sbit Soft_I2C_Scl_Direction at TRISIO4_bit;
sbit Soft_I2C_Sda_Direction at TRISIO5_bit;

//////////////////////////////////////////////
////////Funcões para o RTC DS1307/////////////
//////////////////////////////////////////////
//Define as horas, minutos e segundos
void ds1307_write()
{
Soft_i2c_stop();
Soft_i2c_start();
Soft_i2c_write(0xD0); //escrita
Soft_i2c_write(0x00); //endereço inicial
Soft_i2c_write(0x00);//segundos
Soft_i2c_write(0x00);//minutos
Soft_i2c_write(0x12);//horas
Soft_i2c_stop();
}

//Faz a leitura do RTC
void ds1307_read(char *horas)
{
char sgs, min, hrs;

Soft_i2c_start();
Soft_i2c_write(0xD0); //escrita
Soft_i2c_write(0x00); //endereço inicial
Soft_i2c_Start();
Soft_i2c_write(0xD1); //leitura
sgs = Bcd2Dec(Soft_i2c_read(1));
min = Bcd2Dec(Soft_i2c_read(1));
hrs = Bcd2Dec(Soft_i2c_read(0));
Soft_i2c_stop();

//cria uma string
horas[0] = (hrs/10) + '0';
horas[1] = (hrs%10) + '0';
horas[2] = '-';
horas[3] = (min/10) + '0';
horas[4] = (min%10) + '0';
horas[5] = '-';
horas[6] = (sgs/10) + '0';
horas[7] = (sgs%10) + '0';
}

////////////////////////////////////////////////



///////////////////////////////////////////////
//////////Funções do MAX7219///////////////////
//////////////////////////////////////////////
//Inicia a comunicacao SPI e configura o chip MAX7219
void MAX7219_Init()
{
 MAX7219_CS_Direction = 0;

 Soft_SPI_Init();

 MAX7219_CS = 0;
 Soft_SPI_write(0x09);
 Soft_SPI_write(0xff); //Code B
 MAX7219_CS = 1;

 //Configura a luminosidade do display(0-15)
 MAX7219_CS = 0;
 Soft_SPI_write(0x0a);
 Soft_SPI_write(0x0f);  //maximo
 MAX7219_CS = 1;

 //Configura o numero de displays escaneados(0-7)
 MAX7219_CS = 0;
 Soft_SPI_write(0x0b);
 Soft_SPI_write(0x07);  //scan limit
 MAX7219_CS = 1;

 MAX7219_CS = 0;
 Soft_SPI_write(0x0c);
 Soft_SPI_write(0x01);  //ShutDown off
 MAX7219_CS = 1;

 MAX7219_CS = 0;
 Soft_SPI_write(0x00);
 Soft_SPI_write(0xff);
 MAX7219_CS = 1;
}

//Escreve um numero no display
void MAX7219_putNumber(char *number)
{
  char i=0,dp=0;
  char len = strlen(number);

  MAX7219_CS = 0;
  Soft_SPI_write(0x09);
  Soft_SPI_write(0xff); //CodeB
  MAX7219_CS = 1;

  for(i=8; i > 0; i--)
  {
    MAX7219_CS = 0;
    Soft_SPI_Write(i);

     if(number[len-1]=='.')
      {
      dp = 0x80;
      i++;
      }
     else if(number[len-1]==' ' || number[len-1]==0 || len==0)
      {
      Soft_SPI_Write(0x7f);
      dp = 0;
      MAX7219_CS = 1;
      }
     else if(number[len-1]=='-')
      {
      Soft_SPI_write(10);
      dp = 0;
      MAX7219_CS = 1;
      }
     else
      {
      Soft_SPI_Write((number[len-1] - '0') | dp);
      dp = 0;
      MAX7219_CS = 1;
      }

     if(len > 0) len--;
  }

}

//Envia um byte ao display
void MAX7219_putByte(char byte, char digito)
{
 MAX7219_CS = 0;
 Soft_SPI_write(0x09);
 Soft_SPI_write(0x00); //No CodeB
 MAX7219_CS = 1;

 if(digito > 8 || digito < 1) digito = 1;

 MAX7219_CS = 0;
 Soft_SPI_Write(digito);
 soft_SPI_Write(byte);
 MAX7219_CS = 1;
}

char relogio[9];

void main()
{
///pic12f675///
 CMCON = 0x07;
 ANSEL = 0;
//////////////

MAX7219_Init();
ADC_Init();
Soft_I2C_Init();

ds1307_write();

while(1)
{
 ds1307_read(relogio);
 MAX7219_putNumber(relogio);
 //MAX7219_putNumber("123.567");
 //MAX7219_putNumber("-1.2.3.4.5.6.7.");
 delay_ms(500);
}
}

5 comentários:

  1. parabens pelo post, muito obrigado por dividir conosco seu conhecimento. Não entendi algumas linha do código, em especial esta "void MAX7219_putNumber(char *string) - Escreve o numero no display. O parâmetro recebe uma string no seguinte formato "-1.2802789"" que formato é este??? agradeço a atenção.

    ResponderExcluir
    Respostas
    1. Quer dizer, que vc pode escrever um numero de 0 a 9, sinal de menos e o ponto flutuante.

      Excluir
  2. Cara muito bom este tutorial. Eu estou tentando escrever numa matriz de leds 8x8 com um pic, fazer uma texto rolante com a possibilidade de acrescentar mais matriz depois. Tenho aqui tres modulos com o max7219. Pode esclarecer como programar isso no mikroC... tem muito material na net mas e com arduino....

    ResponderExcluir
  3. Como enviar um caractere em Branco?
    É só enviar espaço ou tem algum valor específico?

    ResponderExcluir