no_pulsa: //si no hay tecla pulsada
envia_alto(columna[i_col]);//enviamos alto a la col(cambiar segun hardware)
if (recibe_bajo(fila[i_fil])) //si es cero se pulsó una tecla(segun hardware)
return(codigo_tecla[cont_tecla]);//retornamos el valor de la tecla pulsada
envia_bajo(columna[i_col]);//enviamos un bajo a la columna para limpiar
//es al contrario del primer pulso enviado
++cont_tecla; //incrementa contador de la tecla, determina el valor en codigo_tecla[cont_tecla]
++i_col; //incrementa la col a revisar
if (i_col==5){ //si se revisaron las 5 col incrementa la fila y volvemes a col cero
i_col=0;
++i_fil;
}
if (i_fil==5){ //se se revisaron las 5 filas salimos de subrutina
envia_bajo(columna[i_col]);//bajo para limpiar puerto
//es al contrario del primer pulso enviado
return(' ');//si no hay tecla pulsada returnamos ' '
}
goto no_pulsa; //si no se an revisado las 4 col y 4 filas volvemos a no pulsa
}
Yo lo haria asi:
for(i_col=0;i_col<5;i_col++)
{
envia_alto(columna[i_col]);//enviamos alto a la col(cambiar segun hardware)
for(i_fil=0;i_fil<5;i_fil++)
{
if (recibe_bajo(fila[i_fil])) //si es cero se pulsó una tecla(segun hardware)
{
envia_bajo(columna[i_col]);//bajo para limpiar puerto
return(codigo_tecla[i_fil][i_col]);//retornamos el valor de la tecla pulsada
}
}
envia_bajo(columna[i_col]);//bajo para limpiar puerto
}
return('/0');
Es decir activo la columna y me fijo en todas las filas. Asi para todas las columnas. Finalmente Si encuentra algo desactiva esa columna y sale con el resultado, si paso por todas las columnas y no encontro nada, entonces devuelvo un string vacio
Y para que sea mas facil cambiaria el indice del array
Antes: int codigo_tecla[25]
Ahora:
int codigo_tecla[5][5]={ '1','2','3','A','H', //distibucion de simbolos en teclado
'4','5','6','B','L', //se cambia segun distribucion en el mismo
'7','8','9','C','K', //empezando por cero codigo_tecla[0]=1
'*','0','#','D','M',
'W','S','I','V','C' };//los numeros no se colocan como caracteres
es para hacer:
codigo_tecla[i_fil][i_col]
si no hubiera tenido que hacer:
codigo_tecla[(i_fil*5)+i_col]
Aunque no estoy muy seguro, se que se puede direccionar un array[5][5] haciendo array[j], pero no se si puedo lograrlo al revés, en un array[25] hacer array[J][k]. Me parece que no se puede. Por eso lo cambie
EDIT:
Una cosa mas:
delay_ms(200); //retardo para evitar rebotes
No tiene sentido... deberias quitarlo. Explico por que no tiene sentido, este programa se ejecutaría cuando vos hagas correr el programa y no cuando se presione la tecla.
De la forma que haces el barrido me parece ineficiente
Errores que encontre en tu codigo:
- No desactivas la columna al retornar, esto hace que cuando entres de nuevo y si hubo una coincidencia en la 3era columna, este activada la 3era y la 1era, no desactivandose nunca. Un simple envia_bajo(columna[i_col]) lo hubiera solucionado
- Cuando llega a 'W' es decir fila 5 columna 1, sale diciendo que no existe ningun valor, ni siquiera revisa los otros valores de esa fila, eso por tener mal la condicion del if, este: if (i_fil==5), el cual deberia estar dentro del otro if ( el de las columnas ) o agregarle la condicion: if (i_fil==5&&i_col==5)