Buenas! Hace unos dias estuve buscando ayuda para usar la libreria kbd.c del pic c compiler, y no obtuve respuesta alguna, asi que me puse a intentar hacer una libreria mas entendible y que funcione, aunque probablemente no sea optima en cuanto a uso de memoria y eso. Hace poco arranque con esto, asi que no es muy pro que digamos. Aca va, por si a alguien le pasa lo mismo alguna vez. Hay que guardar el archivo con extensión .c en la carpeta de drivers de Pic C, y funca joya.
...
Código:
// Este es un driver para una teclado de 4 filas y 3 columnas, conectado al
//puerto B de un PIC con resistencias de pull up en dicho puerto. La conexion es
//de la siguiente forma: Columna 0: RB1
// Columna 1: RB2
// Columna 2: RB3
// Filas (de la 0 a la 3): RB 4, RB5, RB6 y RB7 respectivamente.
//Se puede utilizar con la interrupcion RB o no. (originalmente se usaba con ella)
//Devuelve un valor de tipo Char.
#use fast_IO(B)
#Byte portb = 0x06 //Direccion del puerto B en un pic 16F877A
char obtener_tecla (void);
int columna(int);
void iniciar_teclado(void);
int f,filas,columnas;
// Layout del teclado:
char DISPLAY1 [3] = {'1', '2' '3'};
char DISPLAY2 [3] = {'4', '5' '6'};
char DISPLAY3 [3] = {'7', '8' '9'};
char DISPLAY4 [3] = {'*', '0' '#'};
void iniciar_teclado (void){ //Configura el TrisB y setea las pullups.
set_tris_B(0xF0); //Debe ser llamada en el main.
port_b_pullups(true);
output_b(0xF0);
}
char obtener_tecla(void){
delay_ms(80); //Antirrebote
for(f=4;f<=7;f++){
if(bit_test(portb,f)==0){
filas=f-3;
columnas=columna(f);
output_b(0xF0);
switch(filas){
case 1:
return(DISPLAY1[columnas]);
break;
case 2:
return(DISPLAY2[columnas]);
break;
case 3:
return(DISPLAY3[columnas]);
break;
case 4:
return(DISPLAY4[columnas]);
break;
}
}
else
f=f;
}
return('N');} //una 'N' se puede usar para probar que no se pulso nada
int columna(int f){
output_b(0x0c);
if(bit_test(portb,f)==0){
return(0);
}
else
output_b(0x0A);
if(bit_test(portb,f)==0){
return(1);
}
else
output_b(0x06);
if(bit_test(portb,f)==0){
return(2);
}}