leitura de teclado matricial 4x3

galera tem alguma coisa errada nesta rotina pra ler o teclado matricial 4x3 porque acontece o seguinte problemas:
se eu apertar o numero 3 primeiro o programa trava
se press qualquer tecla da linha do ex 4 5 6 e em seguida press o numero 3 aparece o 6
se press qualquer tecla da linha do ex 7 8 9 e em seguida press o numero 3 aparece o 9
ou seja o problema esta na tecla 3 ja revisei tudo e nao achei nada desconfio desta rotina achada na net q deve desviar pra outro local e travar o pic
char const TECLAS[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
struct teclado_map {
boolean unused;
boolean coluna1;
boolean coluna2;
boolean coluna3;
boolean linha1;
boolean linha2;
boolean linha3;
boolean linha4;
int data : 8;
} teclado;
#byte teclado = 6
RB_isr() {
char aux, linha, coluna = 0;
ch = '\0';
if (!teclado.linha1 && !teclado.linha2 && !teclado.linha3 && !teclado.linha4)
return;
disable_interrupts(INT_RB);
for (aux=1; aux<4; aux++) {
coluna = aux;
teclado.coluna1 = 0;
teclado.coluna2 = 0;
teclado.coluna3 = 0;
if (aux == 1)
teclado.coluna1 = 1;
else
if (aux == 2)
teclado.coluna2 = 1;
else
teclado.coluna3 = 1;
if (teclado.linha1) {
linha = 1;
break;
}
if (teclado.linha2) {
linha = 2;
break;
}
if (teclado.linha3) {
linha = 3;
break;
}
if (teclado.linha4) {
linha = 4;
break;
}
}
ch = TECLAS[linha-1][coluna-1];
enable_interrupts(INT_RB);
return;
valeu pela obs o teclado é 4x3 e nao 7x8(da onde tirei isso)
se eu apertar o numero 3 primeiro o programa trava
se press qualquer tecla da linha do ex 4 5 6 e em seguida press o numero 3 aparece o 6
se press qualquer tecla da linha do ex 7 8 9 e em seguida press o numero 3 aparece o 9
ou seja o problema esta na tecla 3 ja revisei tudo e nao achei nada desconfio desta rotina achada na net q deve desviar pra outro local e travar o pic
char const TECLAS[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
struct teclado_map {
boolean unused;
boolean coluna1;
boolean coluna2;
boolean coluna3;
boolean linha1;
boolean linha2;
boolean linha3;
boolean linha4;
int data : 8;
} teclado;
#byte teclado = 6
RB_isr() {
char aux, linha, coluna = 0;
ch = '\0';
if (!teclado.linha1 && !teclado.linha2 && !teclado.linha3 && !teclado.linha4)
return;
disable_interrupts(INT_RB);
for (aux=1; aux<4; aux++) {
coluna = aux;
teclado.coluna1 = 0;
teclado.coluna2 = 0;
teclado.coluna3 = 0;
if (aux == 1)
teclado.coluna1 = 1;
else
if (aux == 2)
teclado.coluna2 = 1;
else
teclado.coluna3 = 1;
if (teclado.linha1) {
linha = 1;
break;
}
if (teclado.linha2) {
linha = 2;
break;
}
if (teclado.linha3) {
linha = 3;
break;
}
if (teclado.linha4) {
linha = 4;
break;
}
}
ch = TECLAS[linha-1][coluna-1];
enable_interrupts(INT_RB);
return;
valeu pela obs o teclado é 4x3 e nao 7x8(da onde tirei isso)