Está en la página 1de 8

U

Teclado Matricial con PIC


por Rubn | Jul 26, 2013 | Tutoriales PIC | 9 Comments

Vamos a explicar como conectar un teclado matricial tipo membrana a un microcontrolador PIC mediante
un sencillo ejemplo. El mtodo que proponemos permite conectar a nuestro microcontrolador 16 teclas usando
solamente 8 pines. El cdigo debera ser vlido 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 bsicamente 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 haramos 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 ms
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 lgico bajo a un estado alto.
La siguiente imgen muestra las conexiones del teclado al puerto B del microcontrolador. La imagen muestra el
teclado en reposo (sin teclas oprimidas).

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

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

lgico (estado alto) en los 4 bits ms 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 vindolo grficamente en una
animacin:

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 estn 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 nmero binario.

Programa en C para teclado matricial

El programa es bastante sencillo e implementa todos los procesos que describimos en la teora vista
anteriormente. El cdigo se ha mantenido simple intencionalmente para que se pueda apreciar el funcionamiento
de la manera ms obvia posible. La funcin 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 funcin no
retorna como tal la tecla pulsada, sino una cadena de bits que representan las teclas, es posible detectar cuando
se presiona ms de una tecla de forma simultanea. El cdigo de esta funcin es el siguiente:
/**
* Procesa las entradas del teclado matricial y determina la tecla que esta
* siendo oprimida. Retorna una palabra binaria de 16 bits en la cual los bits
* que se encuentran en estado alto representan teclas oprimidas.
*
* Esta funcin esta diseada para poder detectar cuando se oprimen varias
* teclas sin embargo, debido a limitantes de la forma de conexin del teclado
* matricial, no se deben esperar resultados correctos al oprimir varias teclas
*
* @return Retorna una palabra de 16 bits, cada bit representa una tecla.
*/
uint16_t keypad_read()
{
unsigned char count = 0;
unsigned char bitmask = 0x10;
// Valor de retorno de la funcion keypad_read() entero de 16 bits
uint16_t keys =0;

// Revisamos si alguna de las lineas en la parte baja esta en estado alto


// debido a que se ha cerrado un switch en el teclado.
if( PORTB & 0x0F )
{
// Escaneamos las filas una por una para determinar la tecla oprimida
do
{
// Apagamos todas las filas (parte alta)
PORTB &= 0x0F;
// Seleccionamos solo una como salida (bit del registro tris = 0)
TRISB &= ~bitmask;
// Y colocamos el pin en estado alto
PORTB |= bitmask;
// Esperamos unos cuantos milisegundos y leemos las columnas
delay_ms(100);
// Guardamos las columnas en una variable de 16 bits
keys |= (PORTB & 0x0F);
// Si ya hemos leido 4 columnas, las siguientes instrucciones no son
// necesarias, por lo que salimos del ciclo
if( count == 3 )
break;
// Recorremos la lectura a la izquierda para hacer espacio
keys = keys<<4;
// Recorremos el bitmask de la fila a leer
bitmask = bitmask<<1;
// Incrementar el contador de filas
count ++;
} while(1);
// Mantenemos parte alta = salidas y parte baja = entradas
TRISB = 0x0F;
// Mantenemos los bits mas significativos del puerto en estado alto
PORTB = 0xF0;
return keys;
}
return 0;
}

Detalles de la implementacin
En nuestra implementacin 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 botn, 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 estn diseadas 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 lgica del cdigo 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 cdigo 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 nmero
binario correspondiente a la tecla oprimida mediante leds conectados en el puerto A (nada de pantallas ni cosas
complicadas). Puedes descargar este proyecto a continuacin:

Conclusin

Con la informacin 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 ms a
fondo el funcionamiento del puerto B de los PIC, que incluye varias funciones opcionales como resistencias pull-up
internas e interrupcin por cambio de estado en los pines, ideales para facilitar la conexin de teclados
matriciales.

Tal vez te interese:

Programacin inalmbrica de Arduino por


Bluetooth

Tutorial Arduino con Fotoresistencia LDR

Bluetooth HC-05 y HC-06 Tutorial de


Configuracin

9
Comments

Geek Factory Mxico

Recomendar 4

Share

Login

ordenar por el ms nuevo

nete a la discusin...
hace un
Erik Jcm ao

Podras poner el proyecto de MPLAB, por favor!


Reply Share
hace un
Santiago Ruiz ao

Me podras pasar el programa en ensamblador por favor


Muchas Gracias!!!
Reply Share
hace un
Santiago Ruiz > Santiago Ruiz ao

Si no es mucha molestia me lo podrias mandar a mi correo santisebas0494@hotmail.com


Reply Share
Alfredo hace 2 aos

Hola, muy buen post, solo una duda, cual es el estado de trisb y portb antes de iniciar el bucle do-while
cuando se ejecuta por primera vez?
Reply Share
Alfredo > Alfredo hace 2 aos

no esta en el codigo pero asumo que es trisb = 00001111 y portb= 00001111? o no es


correcto?
Reply Share
David hace 2 aos

Magnfica descripcin del funionamiento de un teclado matricila!


Os recomendare a mis amigos!
Saludos!

Saludos!
Reply Share
renzo hace 3 aos

hola amigo esta bueno tu post;


pero donde esta la segunda parte?
en lenguaje ANSI C
necesito las librerias
espero pronto lo publiques :)
Reply Share
BETTY > renzo hace 3 aos

Me encanto tu post lo utilizo de referencia para mis alumnos es una lindura tu gif. por cierto yo
utilizo la libreria para el teclado pero me encantaria ver paso a paso la tuya ;) suerte y muchas
gracias.
Reply Share
Jesus Ruben > BETTY hace 3 aos

Hola Betty.
Un placer saber que hacemos algo que les resulte de utilidad. Tenemos otra entrada
donde est el cdigo de ejemplo en lenguaje C.
Aqu esta el enlace: http://www.geekfactory.mx/tuto...
Reply Share

Subscribe

Agrega Disqus a tu sitio

Privacidad

Que es Geek Factory?


En Geek Factory seleccionamos los mejores productos de las mejores tiendas a nivel internacional y los traemos
para t directamente. !Ahora no tienes que esperar meses para obtener los productos que requieres en tu
proyecto al mejor precio!
Nuestra misin es acercar la tecnologa a todas las personas interesadas en Mxico. Pero no solo eso... nuestra
misin es ayudarte a que usar la tecnologa resulte ms sencillo.

Lo ms vendido.
Arduino UNO R3
$370.00
HC-SR04 Sensor de distancia ultrasnico
$40.00
Cable Dupont Macho Macho
$45.00
Jumpers para protoboard 65 piezas
$65.00
Servo SG90 Tower Pro Servomotor Micro
$60.00

Sobre nosotros
Cmo comprar?
Quines Somos?
Formas de Pago
Contacto
Distribuidores
Cursos de Arduino en Mxico
Poltica de Privacidad

Afiliados y estadsticas
Afiliados:

Visitantes:

Diseado por Elegant Themes | Desarrollado por WordPress

También podría gustarte