Hola
Tengo un problema bastante extraño con un teclado matricial de 5 filas x 4 columnas. A continuación os expongo mi problema.
Tengo conectado las 5 filas a los bits RD0,RD1,RD2,RD3 y RD4 de un PIC18f452 y las 4 columnas a los bits RD5,RD6,RD7,RB4 con sus correspondientes resistencias pull-up.
El codigo de mi programa es el siguiente:
void main (void)
{
LCDInicializacion (); // Inicializa el LCD
while(1)
{
unsigned char teclado;
unsigned char auxb,auxtecla;
TRISD = 0xE0; //Configuro las columnas
PORTD = 0x00; como entradas y las filas
TRISBbits.TRISB4 = 1; como salidas.
teclado=PORTD; //Leo lo que recibo en las
teclado=(teclado>>5)&0x0F; entradas para saber
auxb=0x10&PORTB; cuando hay tecla pulsada y
teclado=teclado|(auxb>>1); la guardo en "teclado".
Hasta aqui todo bien detecto que hay tecla pulsada y se en que columna está pero ahora para saber la fila, intercambio las entradas por salidas y viceversa y envio por la salida el valor que tengo en "teclado" .
if(teclado!=0x0F) //Aqui entra cuando detecta tecla
{
TRISD = 0x1F; //Configuro entradas y salidas
PORTD = 0x1F;
PORTD = 0xEF&(teclado<<5) //Envio "teclado"
TRISBbits.TRISB4 = 0;
PORTBbits.RB4 = 0x01&(teclado>>3);
auxtecla = 0x1F&PORTD; //Aqui deberia tener el valor con
el que poder calcular la columna
El problema es que en estas 6 ultimas lineas se vuelve loco, por ejemplo ejecutando paso a paso donde pongo PORTD =0x1F, tembién varia el valor de los bits RD5,RD6 y RD7 y se pone PORTD a 0xFF. En fin auxtecla siempre acaba valiendo 0x00. Alguien me puede ayudar. Se supone que en "auxtecla" deberia tener todo unos menos un cero que me indicaria la fila en la que esta.
//////El resto del programa ya no importa porque de aquí no pasa//////
if(teclado==0x0E) //Columna 1
{
if(auxtecla==0x1E) strcpy(tecla,"tecla F2"
;
if(auxtecla==0x1D) strcpy(tecla,"tecla A2"
;
if(auxtecla==0x1B) strcpy(tecla,"tecla 1"
;
if (auxtecla==0x17) strcpy(tecla,"tecla 4"
;
if(auxtecla==0x0F) strcpy(tecla,"tecla 7"
;
else strcpy(tecla,"tecla *"
;
}
else if(teclado==0x0D) //Columna 2
{
Gracias por adelantado