En realidad el Micro X realiza un "barrido", hay 4 pines que son entradas (con pull-up o pull-down ) y 4 que son salidas
Supongamos que las filas sean las salidas y las columnas entradas.
Como no se que pines son que cosa en tu micro, aca vamos a suponer que donde tenes 0V es tu entrada con un pull-down para mantenerlo en 0V.
Todas las demas salidas estan en 5V entonces cuando presiones cualquier boton, si seguis el camino todas las entradas ( la de las 4 filas ) van a pasar a 5V.
¿Entonces como es que detecta cual es?
Ya con esto yo logro detectar que hay algo presionado, la mayoria no hace esto, simplemente genera un barrido.
Primero activo ( 5V ) solo la fila 1. Y observo mis entradas, Si alguna esta en 1 significa que ahi esta el boton presionado. Sino repito lo mismo con la fila 2.
Desactivo Fila 1 y Activo Fila 2. Y observo mis entradas. el mismo caso que antes.
En fin, si quisieras simular un teclado, lo que deberias hacer es:
- primero es detectar cual pin es salida y cual es entrada de tu Micro X.
- segundo ver la velocidad con que se genera ese "barrido" ya que recorda que al detectarse el barrido vos deberias aplicar la salida del PIC sobre las entrads del Micro X
- tercero, en cuestiones de tiempo, uno desconoce que tanto tiempo pasa desde la activacion de la salida a la lectura de los pin del Micro X, por lo tanto tal ves pensar en unicamente hacerlo con el PIC puede ser insensato. Ejemplo, si el Micro X va a 100Mhz y su programa tarda 50ns entre eso, vos deberias usar un micro de mucha mayor velocidad ( el doble o mas ), lo cual lo hace absurdo. Y el coste se dispara rapidamente.
Otra forma de evitar esto, es tratar de crear un sistema por hardware que realize esto. Hasta ahora lo mas simple que se me ocurrio es utilizar un micro con 4 ANDs o NANDs ( 2 entradas ) el cual las 4 salidas del Micro X vayan a este. Y un registro de desplazamiento con tri-state. El cual tendrias que 4 salidas son para las ANDs y 4 salidas para el micro X. De esta forma nosotros damos que salida del Micro X al activarse va a hacer que el registro de desplazamiento deje de estar en tri-state. Lo bueno de esto es que tenes todo el tiempo del mundo para llenar el registro de desplazamiento. Luego activas el latch y listo. tendrias al menos 3 pines hacia el registro de desplazamiento, 2 del SPI + 1 de latch.
Entonces vos con tu PIC manejas el registro de desplazamiento nomas. Suponete que el primer nibble sean las ANDs y manejen fila 4, fila 3, fila 2 y fila 1 respectivamente. Y el otro nibble sean columna 4, columna 3, columna 2 y columna 1 respectivamente. Utilizando el diagrama del teclado que te pase. Si por ejemplo quisiera activar el boton 8. Pondria en el registro de desplazamiento:
0100 (Solo la fila 3 me puede activar el Output Enable del registro de desplazamiento ) + 0010 ( Columna 2 que seria la del 8 ) =
01000010Y ahora todo el "delay" que pueda ocurrir esta dado por la velocidad de las AND/NANDs y del registro de desplazamiento en salir del tri-state
PD: Algunas consideraciones extras hay que tomar con las salidas de las AND (74xx00/74xx08), ejemplo poner un diodo. O tal ves ( no hice la logica ) pero podrias llegar a usar una NAND con open-collector asi pones solo resistencias (74xx03/74xx09 )
PD2: La solucion que se me ocurrio y di es para un uso de un PIC. Podrias utilizar un CPLD, o algun micro que te provea una interfaz configurable para generar una tabla de verdad por ejemplo.