#include <16f84a.h> //Modelo de PIC usado para este ejemplo
#fuses XT,NOWDT,NOPROTECT,PUT //Fusibles: Oscilador <= 4Mhz, Perro Guardian Desactivado, Sin proteccion contra lectura, Demora al inicio activada
#use delay (clock=4000000) //Defino cristal 4Mhz
#use standard_io(a)
#use fast_io(b)
#byte port_a=0x05 //Defino puertoA
#byte port_b=0x06 //Defino puertoB
byte Tecla[15]; //Array de 16 bytes. Cada uno contiene la posible tecla pulsada.
byte Cantidad; //Variable que indicara la cantidad de teclas presionadas.
void main(void)
{
byte i,j,Temp; //Defino variables a usar...
set_tris_a (0b00000); //puertoA todo como salida
set_tris_b (0b11110000); //<RB4:RB7> como entradas, <RB3:RB0> como salidas
port_b_pullups(TRUE); //Habilito Weak Pull Ups puerto b
port_a=0; //Inicializo puertoA cero
do{ //loop
port_b=0b00001110; //Fila 1 en bajo
Cantidad=0; //Inicializo Cantidad teclas encontradas=0
for(i=0;i<4;i++){ //Recorro fila x fila
Temp=port_b; //Almaceno valor del puertoB en Temp
if (Temp < 240){ //¿Hay algo presionado?
for(j=4;j>0;j--){ //Si. Busco columna por columna
if(!bit_test(Temp,7)){ //¿Columna con tecla presionada?
Tecla[Cantidad]= i*4+j; //Si.Guardo el numero de tecla presionada en el array.
Cantidad++; //Incremento cantidad de teclas encontradas...
} //Cierro IF
rotate_left(&Temp,1); //Rotacion para seguir con la proxima columna
} //Cierro FOR
} //Cierro IF
rotate_left(&port_b,1); //Rotacion para seguir con la proxima fila
}
if(Cantidad>0) port_a=Tecla[0]; else port_a=0; //Si hay al menos una tecla presionada, mostrarla en puertoA(binario)
}while(TRUE); //Infinitamente reviso el teclado
} //Cierro main