Ir ao conteúdo
  • Cadastre-se
Tarcisio Zewe Duarte

Arduino Display matricial de led 5x7, com registrador 74HC595 Microcontroladores

Recommended Posts

Bom dia pessoal, estou tendo um problema em um código que estou desenvolvendo para um contador de display matricial de leds, com cinco displays 5x7 para contar de 0 à 999. Um breve resumo do programa: Ele pega a função “millis” , divide por 1000, e depois grava este valor na variavel inteira “numero”. depois ele executa um laço “for”, onde pega esta variavel, divide por outra variavel inteira “fator”, e divide o resultado desta operação por “BASE”, a qual foi definida no inicio do programa por como sendo 10, e atribui este resultado a uma variável denominada “valor”. E ainda dentro deste laço “for”, ele compara por meio da condição “if” numero correpondente aos cinco digitos do display, e chama uma função para que transfere em um array do tipo “byte” chamado “led”, o caractere correspondente, dos caracteres correspondentes gravados no array do tipo “char matriz”. Despois uma outra função é chamada para pegar cada array “led” e transferir para o um array maior do tipo char 40x7 denominado “máscara” , com a sua devida posição de acordo com a contagem, e por último uma função é chamada para enviar os dados deste ultimo array 40x7 para cinco circuitos integrados 74HC595 registradores de deslocamento, os quais mandam a informação de suas saidas para as colunas dos cinco displays 5x7. Esta mesma função gera ainda os pulsos de clock e reset para um circuito integrado 4017, o qal faz a contagem das linhas e completa a multiplexagem dos display. Ao compilar este código, ele compila normalmente e não aparece nenhum erro. só que os cinco displays simplesmente não acendem. Não se trata de um problema de hardware, pois testei os cinco displays em um outro programa e eles funcionaram normalmente, igualmente com os circuitos integrados 74HC595. Ja o circuito integrado 4017 retirei de um outo circuito que havia montado e também esta funcionando normalmente. Abaixo segue em anexo o código, se alguem tiver tempo de analisar e me ajudar, agradeço:

#define ZERO {B01110000,B10001000,B10011000,B10101000,B11001000,B10001000,B01110000}
#define UM {B00100000,B01100000,B00100000,B00100000,B00100000,B00100000,B01110000}
#define DOIS {B01110000,B10001000,B00001000,B00010000,B00100000,B01000000,B11111000}
#define TRES {B01110000,B10001000,B00001000,B01110000,B00001000,B10001000,B01110000}
#define QUATRO {B00010000,B00110000,B01010000,B10010000,B11111000,B00010000,B00010000}
#define CINCO {B11111000,B10000000,B11110000,B00001000,B00001000,B10001000,B01110000}
#define SEIS {B00110000,B01000000,B10000000,B11110000,B10001000,B10001000,B01110000}
#define SETE {B11111000,B00001000,B00001000,B00010000,B00100000,B00100000,B00100000}
#define OITO {B01110000,B10001000,B10001000,B01110000,B10001000,B10001000,B01110000}
#define NOVE {B01110000,B10001000,B10001000,B01111000,B00001000,B00010000,B01100000}
#define ESPACO {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}

int latchPin = 10;
int clockPin = 13;
int dataPin = 11;
int clock = 9;
int Reset = 8;

const int numCaracteres = 10;
char matriz[numCaracteres][7][8] = {ZERO, UM, DOIS, TRES, QUATRO, CINCO, SEIS, SETE, OITO, NOVE};
byte led0[8][7];
byte led1[8][7] = {ESPACO};
byte led2[8][7];
byte led3[8][7] = {ESPACO};
byte led4[8][7];// columns x rows
char mascara[40][7];
int num_digitos = 3;
int BASE = 10;

void setup() {
Serial.begin(9600);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(Reset, OUTPUT);
digitalWrite(Reset, HIGH);
digitalWrite(Reset, LOW);
}

void loop() {

int numero = millis() / 1000;

int fator = 1;
for (int digito = num_digitos - 1; digito >= 0; digito = digito - 1)
{
int valor = (numero / fator) % BASE;

Serial.println(valor);

if (digito == 2) {
selecionaMatriz_2(valor);
}
if (digito == 1) {
selecionaMatriz_1(valor);
}
if (digito == 0) {
selecionaMatriz_0(valor);
}
fator = fator * BASE;
}

alocaDigito ();

for (int i = 0; i < 2000; i++)
{
escreveMatriz();
}
}
void selecionaMatriz_2(int pos)
{
Serial.println(pos);
for (int i = 0; i <= 7; i++)
{
for (int j = 0; j <= 6; j++)
{
led0[j] = matriz[pos][j];
}
}
}

void selecionaMatriz_1(int pos)
{
for (int i = 0; i <= 7; i++)
{
for (int j = 0; j <= 6; j++)
{
led2[j] = matriz[pos][j];
}
}
}

void selecionaMatriz_0(int pos)
{
for (int i = 0; i <= 7; i++)
{
for (int j = 0; j <= 6; j++)
{
led4[j] = matriz[pos][j];
}
}
}

void alocaDigito () {
for (int j = 0; j <= 6; j++) {
for (int i = 0; i <= 7; i++) {
mascara[j] = led0[j];
}
}
for (int j = 0; j <= 6; j++) {
for (int i = 8; i <= 15; i++) {
mascara[j] = led1[i - 8][j];
}
}
for (int j = 0; j <= 6; j++) {
for (int i = 16; i <= 23; i++) {
mascara[j] = led2[i - 16][j];
}
}
for (int j = 0; j <= 6; j++) {
for (int i = 24; i <= 31; i++) {
mascara[j] = led3[i - 24][j];
}
}
for (int j = 0; j <= 6; j++) {
for (int i = 32; i <= 39; i++) {
mascara[j] = led4[i - 32][j];
}
}
}

void escreveMatriz()
{
for (int m = 0; m <= 6; m++) {
for (int n = 0; n <= 39; n++) {
mascara[n][m] = ~mascara[n][m];
}
}
for (int linha = 0; linha <= 6; linha++) {
digitalWrite(clock, LOW);
digitalWrite(latchPin, LOW);
for (int coluna = 0; coluna <= 39; coluna++) {
digitalWrite(clockPin, LOW);
if (mascara[coluna][linha] == 1) {
digitalWrite(dataPin, HIGH);
}
else {
digitalWrite(dataPin, LOW);
}
digitalWrite(clockPin, HIGH);
}
digitalWrite(clockPin, LOW);
digitalWrite(latchPin, HIGH);
digitalWrite(clock, HIGH);
if (linha == 6) {
digitalWrite(Reset, HIGH);
digitalWrite(Reset, LOW);
}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

uffff... quase perdi o fôlego pra ler. ... kk

Vou te ajudar de forma indireta. Baixe o anexo. Tem o projeto completo com fonte e simulação do proteus. Só falta você achar ruim porque não tem o .pcb né...

É em c e pro pic mas facim adaptar pra virtualmente qualquer mc.

Use o .hex ... ou melhor o .cof pra rodar no proteus. Fiz há muitos (e muitos) anos pra um amigo de outro forum.

 

Inspire-se no fonte mas principalmente na mensagem subliminar do Fonte.

Pode não lhe ser totalmente inútil

@Tarcisio Zewe Duarte

matrizdeleds.zip

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode também,tentar usar o MAX7219,conforme Isadora Ferraz me indicou.

Fica bem simples o Hardware código,apenas vai ter que usar uma parte do SPI do micro.

Eu também ia fazer por Varredura,mas deixei esta técnica para desenvolver uma saída VGA.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×