char Tecla, Temp,Temp1,Temp2, Pulsada;
void delay_ms()
{
unsigned char x,y;
x=10000;
while (x)
{
x>>= 0;
x--;
}}
void Lee_Tecla()
{//para las kolumnas
TRISB = 0b11110000;
OPTION.7 = 0; // habilita pull-ups
PORTB = 0;
#asm
comf PORTB,W; // Lee y complementa
movwf Temp1; // Lee y complementa (Columna)
swapf Temp1,f; // Cambia alta por baja
#endasm
Temp=0;
while (!(Temp1 & 0x01)) // cuenta hasta que llegue a un bit set
{
Temp1>>= 1;
Temp++;
}
if (Temp<4) // se ha pulsado
{
Temp2=Temp; // Guardo columna
//para las filas
TRISB = 0b00001111; // ahora la fila
OPTION.7 = 0; // habilita pull-ups
PORTB = 0;
#asm
comf PORTB,W; // Lee y complementa
movwf Temp1; // Lee y complementa (Fila)
#endasm
Temp=0;
while (!(Temp1 & 0x01)) // cuenta hasta que llegue a un bit set
{ Temp1>>=1;
Temp++;
}
if (Temp<4) // Fila correcta
{ Temp1=Temp;
Tecla=(Temp2<<2)+Temp1;
}
else Tecla=0xFF;
}
else Tecla=0xFF;
}
void main()
{
while(1)
{
Lee_Tecla ();
delay_ms ();
}
}