Vamos a explicar como conectar un teclado matricial tipo membrana a un microcontrolador PIC mediante un sencillo ejemplo. El método que proponemos permite conectar a nuestro microcontrolador 16 teclas usando solamente 8 pines. El código debería ser válido para cualquier microcontrolador, incluso de otras marcas, aunque siempre habrá que revisarlo y posiblemente realizar algunas adaptaciones si se migra a otra plataforma, sin embargo, el algoritmo permanece igual con cualquier microcontrolador.

El ejemplo se realizó para un PIC16F88, aunque como ya hemos mencionado, es compatible básicamente con cualquier microcontrolador PIC. Debido a que el programa utiliza todos los bits del puerto B en nuestro microcontrolador,  pensamos que tal vez sea buena idea utilizar un PIC con buena cantidad de pines como un PIC16F877 o un PIC18F4550, por mencionar un par de ejemplos de micros populares. Para este ejemplo, utilizamos XC8 y MPLAB X como entorno de desarrollo.

En nuestra portada mostramos el equipo que hemos utilizado para probar el teclado matricial, incluido el PIC16F88 en una tarjeta entrenadora y el PICKit 3 como programador/depurador.

¿Como funciona un teclado matricial?

El principio de funcionamiento es sencillo y es similar a lo que haríamos para multiplexar leds o dipslays de 7 segmentos. El programa configura el puerto B del PIC de la siguiente forma:  RB4 a RB7 funcionan como salidas y la otra mitad (RB0-RB3) como entradas. Las filas (horizontal) del teclado matricial se conectan a los bits más significativos que funcionan como salidas, mientras que las columnas (vertical) se conectan a los bits menos significativos del puerto que funcionan como entradas con resistencias pull-down. Cualquier tecla que se oprima en una columna causará que uno de los bits menos significativos del puerto (RB0 – RB3) cambie de un estado lógico bajo a un estado alto.

La siguiente imágen muestra las conexiones del teclado al puerto B del microcontrolador. La imagen muestra el teclado en reposo (sin teclas oprimidas).

teclado_matricial_4x4_funcionamiento

¿Que pasa cuando se oprime una tecla en un teclado matricial?… la corriente puede fluir a través del switch y el voltaje de los pines conectados a las filas del teclado (5 V o nivel alto) aparece ahora también en alguno de los pines RB0 a RB3 según la columna en la que se encuentra la tecla oprimida. La siguiente imagen ilustra lo que sucede al oprimir una tecla: al oprimir el botón 6 provocamos un cambio en el PIN RB2 que ahora recibe un 1 o estado alto. Sabemos entonces que se ha pulsado un botón en la segunda columna y se muestra como un nivel lógico alto aparece en los bits menos significativos del puerto B, especificamente en RB2.

teclado_matricial_4x4_tecla_oprimida

De esta manera el microcontrolador sabe que se ha oprimido una tecla al detectar un cambio de nivel en los bits menos significativos. Hasta el momento, se sabe que se ha oprimido una tecla en alguna columna (dependiendo del bit activo RB3 a RB0), sin embargo, no sabemos en cual fila. Para resolver en que fila se oprimió una tecla, hay que realizar un proceso de escaneo del teclado. En este proceso, colocaremos en secuencia un 1 lógico (estado alto) en los 4 bits más significativos del puerto y leeremos el estado de los 4 bits menos significativos. Sigamos con el ejemplo en el que se ha oprimido la tecla 6 pero ahora viéndolo gráficamente en una animación:

Animación del funcionamiento del teclado matricial

El microcontrolador escanea en forma sucesiva los pines de salida, mientras lee las entradas en la parte baja del puerto, de manera que puede detectar que teclas están oprimidas en cada fila. Ahora solo falta escribir nuestro codigo en C que implemente los procedimientos mencionados anteriormente y nos devuelva un valor de la tecla oprimida, por ejemplo, mediante un número binario.

Programa en C para teclado matricial

El programa es bastante sencillo e implementa todos los procesos que describimos en la teoría vista anteriormente. El código se ha mantenido simple intencionalmente para que se pueda apreciar el funcionamiento de la manera más obvia posible. La función keypad_read() es la encargada de realizar la mayor parte de las tareas para determinar que tecla ha sido pulsada. El valor que retorna es una palabra de 16 bits en la cual, cada uno de los bits representa una tecla, en donde un bit en estado alto representa una tecla oprimida. Como la función no retorna como tal la tecla pulsada, sino una cadena de bits que representan las teclas, es posible detectar cuando se presiona más de una tecla de forma simultanea. El código de esta función es el siguiente:

Detalles de la implementación

En nuestra implementación del hardware, todos los pines tienen conectada una resistencia “pull-down”, por lo que se mantienen en estado bajo (0) cuandoel teclado esta en reposo. Cuando se presiona un botón, el estado del pin cambia a estado alto (1). Esto puede hacerse de manera inversa, utilizando las resistencias “pull-up” incluidas internamente en el puerto B de muchos PIC que están diseñadas para este tipo de aplicaciones. En nuestro caso, la tarjeta que utilizamos tiene resistencias pull-down previamente conectadas en los pines, por lo que decidimos aprovecharlas.

Es un buen ejercicio invertir la lógica del código para permitir que este funcione con resistencias “pull-up”, por lo que te recomendamos que realices al menos este ejercicio.

Proyecto de MPLAB con teclado matricial

Para probar el código anterior, hemos desarrollado un ejemplo completo que puede abrirse con MPLAB X y grabarse directamente sobre un PIC16F88. El programa esta configurado para una velocidad de reloj de 4 Mhz y utiliza el puerto B completo para conectar el teclado. Para mantener las cosas simples, mostramos el número binario correspondiente a la tecla oprimida mediante leds conectados en el puerto A (nada de pantallas ni cosas complicadas). Puedes descargar este proyecto a continuación:

Conclusión

Con la información que tenemos hasta este momento, ya podemos darnos una idea de como funciona un teclado matricial y podemos comenzar a incluirlo en nuestros proyectos. Nos queda de tarea estudiar más a fondo el funcionamiento del puerto B de los PIC, que incluye varias funciones opcionales como resistencias pull-up internas e interrupción por cambio de estado en los pines, ideales para facilitar la conexión de teclados matriciales.