MAX7219 no PIC16F628A
Alguém já deve ter ficado cotando os pinos do PIC para poder multiplexar os displays de 7 segmentos os quais utilizam muitas saidas, por exemplo, para ligar 4 displays de 7 segmentos são usados nada mais nada menos do que 12 pinos o que é um número considerável de saídas e dependendo do projeto e do PIC utilizado fica impossível de utilizá-los.
Há sim outra forma de resolver isso, existe um circuito integrado que faz a multiplexação dos displays e que pode ligar até 8 display de 7 segmentos este é o MAX7219, o qual também pode multiplexar matrizes de LED.
MAX7219 datasheet
O MAX7219 tem um funcionamento bem simples. segue abaixo um modelo de escrita
Ou seja, enviamos um bit baixo ao pino LOAD , logo após enviamos o comando e o valor que queremos escrever, depois disso enviamos o bit alto para o LOAD.
A tabela 2 do datasheet mostra os comandos do MAX7219. Exemplo:
Queremos definir quantos leds serão utilizados e conforme a tabela 2 o comando é 0x0b então o comado fica assim:
MAX7219_CS = 0;
Soft_SPI_write(0x0b);
Soft_SPI_write(7); // 8 displays, displays de 0 a 7
MAX7219_CS = 1;
Da mesma forma definimos a intensidade do brilho nos displays e se será usado o modo de decodificação.
segue abaixo o diagrama do circuito o qual utilizamos para teste:
Com base nestas informações preciosas que o datasheet nos dá criamos um arquivo com algumas funções as quais nos auxiliam bastante, porém se formos usar apenas uma ou duas é aconselhável copiá-las no próprio programa a fim de não utilizar espaço na memória do PIC principalmente se este estiver pouca memoria.
Funções:
Esta função inicializa o MAX7219 com o RB0 em DIN, RB1 em LOAD, RB2 em CLOCK e RB3 em DOUT, deve ser passado como paramentro a quantidade de display que esta sendo multiplexado.
Esta função envia a letra ao digito especificado, esta letra deve estar entre aspas simples (apóstrofos).
Esta função envia a String aos displays, lembrando que a palavra inicia de trás para a frente, ou seja, se a palavra for maior que o numero de displays aparecerá somente as últimas letras correspondente a quantidade de displays.
Esta função envia o byte ao digito especificado, sendo que o bit mais significativo é o "DP" o segundo mais significativo é o "A" e o menos significativo é o "G", entao para mandar o caractere F ao display 2 devemos escrever MAX7219_putByte(0b01000111,2)
como o nome diz esta função envia aos displays o numero passado como parametro, sendo que começa a escreve-lo da direita para a esquerda e se não completar o total de displays então estes serão completados com zeros, ou seja, se o numero passado for 23 e a quantidade de displays for 4 entao será exibido o numero 0023.
Esta função rola a palavra passada como parametro na velocidade que também será passada como parametro da direita para a esquerda.
E por fim esta função faz o contrário da fução anterior, os parametros que são passados são os mesmos porém a palavra rola da esquerda para a direita.
biblioteca para o MAX7219
Firmware do PIC16F628A e diagrama de ligação
https://www.youtube.com/watch?v=_h1tPErCrkE
galera foi eu mesmo que desenvolvi estas funções, caso alguma não esteja funcionando me avisem que tentaremos arrumar
Há sim outra forma de resolver isso, existe um circuito integrado que faz a multiplexação dos displays e que pode ligar até 8 display de 7 segmentos este é o MAX7219, o qual também pode multiplexar matrizes de LED.
MAX7219 datasheet
O MAX7219 tem um funcionamento bem simples. segue abaixo um modelo de escrita
MAX7219_CS = 0;
Soft_SPI_Write(0x0A);//comando
Soft_SPI_Write(0x08);//valor
MAX7219_CS = 1;
A tabela 2 do datasheet mostra os comandos do MAX7219. Exemplo:
Queremos definir quantos leds serão utilizados e conforme a tabela 2 o comando é 0x0b então o comado fica assim:
MAX7219_CS = 0;
Soft_SPI_write(0x0b);
Soft_SPI_write(7); // 8 displays, displays de 0 a 7
MAX7219_CS = 1;
Da mesma forma definimos a intensidade do brilho nos displays e se será usado o modo de decodificação.
segue abaixo o diagrama do circuito o qual utilizamos para teste:
Funções:
void
MAX7219_Init(
char
displays); --- Ex.:
MAX7219_Init(8
);
Esta função inicializa o MAX7219 com o RB0 em DIN, RB1 em LOAD, RB2 em CLOCK e RB3 em DOUT, deve ser passado como paramentro a quantidade de display que esta sendo multiplexado.
void
MAX7219_putLetra(
char
letra,
char
digito);
--- Ex.:
MAX7219_putLetra('A', 1
);
Esta função envia a letra ao digito especificado, esta letra deve estar entre aspas simples (apóstrofos).
void
MAX7219_putAlfa(
char
*palavra);
--- Ex.: MAX7219_putAlfa("MAX7219"
);
Esta função envia a String aos displays, lembrando que a palavra inicia de trás para a frente, ou seja, se a palavra for maior que o numero de displays aparecerá somente as últimas letras correspondente a quantidade de displays.
void
MAX7219_putByte(
char
byte,
char
digito);
--- Ex.: MAX7219_putByte(
0b01110111, 1);
Esta função envia o byte ao digito especificado, sendo que o bit mais significativo é o "DP" o segundo mais significativo é o "A" e o menos significativo é o "G", entao para mandar o caractere F ao display 2 devemos escrever MAX7219_putByte(0b01000111,2)
void
MAX7219_putNumber(
int
number);
--- Ex.: MAX7219_putNumber(123);como o nome diz esta função envia aos displays o numero passado como parametro, sendo que começa a escreve-lo da direita para a esquerda e se não completar o total de displays então estes serão completados com zeros, ou seja, se o numero passado for 23 e a quantidade de displays for 4 entao será exibido o numero 0023.
void
MAX7219_scrollLeft(
char
*palavra,
int
delay);
--- Ex.: MAX7219_scrollLeft("Senha"
,500
);
Esta função rola a palavra passada como parametro na velocidade que também será passada como parametro da direita para a esquerda.
void
MAX7219_scrollRight(
char
*palavra,
int
delay)
--- Ex.: MAX7219_scrollRight("Senha"
,500
);
E por fim esta função faz o contrário da fução anterior, os parametros que são passados são os mesmos porém a palavra rola da esquerda para a direita.
biblioteca para o MAX7219
Firmware do PIC16F628A e diagrama de ligação
https://www.youtube.com/watch?v=_h1tPErCrkE
galera foi eu mesmo que desenvolvi estas funções, caso alguma não esteja funcionando me avisem que tentaremos arrumar
Comentários
Postar um comentário