Código:
//programa de lectura de un teclado matricial conectado al puerto B.
//se realiza una lectura cada 10ms.
char ADCON0@0x1F; // Registro ADCON0
char ADCON1@0x9F; // Direccion del registro ADCON1
char ADRESL@0x9E;
char ADRESH@0x1E;
char TXSTA@0x98;
char RCSTA@0x18;
char SPBRG@0x99;
char TXREG@0x19;
char RCREG@0x1A;
char Tecla, Temp,Temp1,Temp2, Pulsada;
main()
{
while (1)
{
Lee_Tecla();
delay_ms(10);
}
}
void Lee_Tecla(void)
{
set_tris_b(11110000b);
clear_bit(OPTION_REG,NOT_RBPU); // habilita pull-ups
output_port_b(0);
asm comf PORTB,W; // Lee y complementa
asm movwf _Temp1; // Lee y complementa (Columna)
asm swapf _Temp1,f; // Cambia alta por baja
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
set_tris_b(00001111b); // ahora la fila
clear_bit(OPTION_REG,NOT_RBPU); // habilita pull-ups
output_port_b(0);
asm comf PORTB,W; // Lee y complementa
asm movwf _Temp1; // Lee y complementa (Fila)
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;
}
so nomas...