Display matricial de led 5x7, com registrador 74HC595

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);
}
}
}