Hola saludos, estaba practicando y viendo un poco, y logre hacer nose si una nueva forma de ver el teclado matricial, talvez algo basica, lo adapte de un tutorial que venia en assember, espero les guste, y si pueden corregirme talvez algo pues bienvenido, aca les dejo el código:
/*------------------------------------------------------------------------------------*/
/* Teclado matricial 4x3 4 filas x 3 columas, puede adaptarse fácilmente a uno 4x4 */
/* Diseñado por Rodrigo A. Flores C. Cryn ---- Cbba,26 de agosto de 2006 */
/* */
/* C1 C2 C3---C4 */
/* F1 1 2 3 C *=A */
/* F2 4 5 6 D #=B */
/* F3 7 8 9 E */
/* F4 * 0 # F */
/* La exploración del teclado lo que hace es verificar secuencialmente y en orden */
/* la situación de las columnas 1,2,3 y 4 enviando '0' por la columna que queremos */
/* analizar y '1' al resto, si se encontrara algún pulsador activado, el código */
/* recibido por las filas sería diferente a 1111 que es el valor de reposo */
/* */
/* 4 resistencias pull-up en las entradas RB4 a RB7 */
/*------------------------------------------------------------------------------------*/
#include<16F648A.h>
#FUSES NOWDT // Watch Dog Timer
#FUSES PUT // Power Up Timer
#FUSES NOPROTECT // Code not protected from reading
#FUSES BROWNOUT // Reset when brownout detected
#FUSES NOMCLR // Master Clear pin enabled
#FUSES NOLVP // No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO // Internal RC Osc, no CLKOUT
#FUSES NOCPD // No EE protection
#use delay(clock=4000000,RESTART_WDT)
#byte port_a=0x05
#byte port_b=0x06
// variables
char codigo;
char explorar_teclado() // función que explora todo el teclado
{
port_b=0xfe; // verifica columna 1
codigo=port_b; // guarda valor de puerto b en variable
if(bit_test(port_b,4)==0)
return 1; // si se presiono el uno devuelve 1
if(bit_test(port_b,5)==0)
return 4; // si se presiono el cuatro devuelve 4
if(bit_test(port_b,6)==0)
return 7; // si se presiono el siete devuelve 7
if(bit_test(port_b,7)==0)
return 10; // si se presiono el * devuelve 10 = A
port_b=0xfc; // verifica columna 2
codigo=port_b; // guarda valor de puerto b en variable
if(bit_test(port_b,4)==0)
return 2; // si se presiono el dos devuelve 2
if(bit_test(port_b,5)==0)
return 5; // si se presiono el cinco devuelve 5
if(bit_test(port_b,6)==0)
return 8; // si se presiono el ocho devuelve 8
if(bit_test(port_b,7)==0)
return 0; // si se presiono el cero devuelve 0
port_b=0xfb; // verifica columna 3
codigo=port_b;
if(bit_test(port_b,4)==0)
return 3; // si se presiono el tres devuelve 3
if(bit_test(port_b,5)==0)
return 6; // si se presiono el seis devuelve 6
if(bit_test(port_b,6)==0)
return 9; // si se presiono el nueve devuelve 9
if(bit_test(port_b,7)==0)
return 11; // si se presiono el # devuelve 11 = B
/* si se tiene una matriz 4x4 se aumentará este código
port_b=0xf7; // verifica columna 4
codigo=port_b;
if(bit_test(port_b,4)==0)
return 12; // si se presiono la C devuelve 12 = C
if(bit_test(port_b,5)==0)
return 13; // si se presiono la D devuelve 13 = D
if(bit_test(port_b,6)==0)
return 14; // si se presiono la E devuelve 14 = E
if(bit_test(port_b,7)==0)
return 15; // si se presiono el F devuelve 15 = F
if(port_b==0xf7)
return 15; // podria colocarse una alternativa en caso de qeu no se presione nada
*/ // no hará falta las siguientes dos líneas de código
if(port_b==0xfb)
return 15; // si no se presiono ninguna tecla devuelve 15 = F
}
void main()
{
set_tris_b(0xf0); // define RB0 a RB3 como salidas y RB4 a RB7 como entradas
port_b=0; // inicializa puerto B
set_tris_a(0x00); // define puerto A como todas salidas
port_a=0; // inicializa puerto A
while(true) // bucle de trabajo
{
port_a=explorar_teclado(); // explora si se presiona pulsador en teclado y lo muestra en el puerto A
}
}
tb les dejo la simulacion con proteus 6.9 sp4