Display matricial de led 5x7, com registrador 74HC595


#1

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[i][j] = matriz[pos][j][i];
}
}
}

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

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

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