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); } }
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.
ResponderExcluirQuer dizer, que vc pode escrever um numero de 0 a 9, sinal de menos e o ponto flutuante.
ExcluirCara 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....
ResponderExcluirvc ja conseguiu?
ExcluirComo enviar um caractere em Branco?
ResponderExcluirÉ só enviar espaço ou tem algum valor específico?