Estoy conectando un teclado 3X4 a PIC16f877a uC en PORTD como:
En la primera mitad del programa C, puse los primeros cuatro pines en Entrada (De LSB-RD0) y otros en Salida y almacené el valor en una variable y en la otra mitad, puse los últimos cuatro pines en Entrada y otros Para enviar y almacenar su valor en otra variable, he llamado a esta función en un bucle continuo para obtener una tecla presionada. El código es el siguiente:
int getKey(void)
{
int toRet = 0;
int firstHalf = 0, secHalf = 0;
TRISD = 15, PORTD = 240;
firstHalf = PORTD;
TRISD = 240, PORTD = 15;
secHalf = PORTD;
switch (-((firstHalf + secHalf)-255))
{
case 20: toRet = 7; break; //1
case 36: toRet = 8; break; //2
case 68: toRet = 9; break; //3
case 18: toRet = 4; break; //4
case 34: toRet = 5; break; //5
case 66: toRet = 6; break; //6
case 17: toRet = 1; break; //7
case 33: toRet = 2; break; //8
case 65: toRet = 3; break; //9
case 40: toRet = 0; break; //0
case 24: toRet = 10; break; //*
case 72: toRet = 11; break; //#
default: toRet = 255; break; //null
}
return toRet;
}
El código funciona bien en el simulador pero no en el hardware, incluso no genera ninguna tecla aleatoria presionada. No estoy usando ninguna resistencia de subida o bajada porque creo que puede perturbar el mecanismo de entrada. ¿Qué debo hacer para resolver este problema?
EDITAR: Después de la respuesta de Abdullah Kahraman, intenté agregar resistencias de 10k ohm en todas las patillas del teclado, pero el problema sigue siendo el mismo. También en la simulación (simulador de Proteus ISIS), el código funciona bien con una advertencia Logic contention detected on net
en la entrada y salida de ambos pines (+ 5V desde uC) en ese momento. No estoy usando ninguna resistencia de tracción en la simulación.