26.12.13

Keypad 4x4

El manejo de un teclado matricial es útil debido a que es una de las formas más comunes de interactuar con un uC. Un teclado matricial no es más que un arreglo de pulsadores en forma matricial, ahora usaremos un teclado matricial de 4 filas y 4 columnas.


Al usar un teclado matricial de 4x4 tenemos 16 teclas que controlar, esto lo podemos realizar mediante todo un puerto (8 pines) del uC. El principio de funcionamiento se basa en enviar hacia 4 pines del puerto (los cuatro primeros o los cuatro últimos) una combinación y leer los siguientes 4 pines para ver si hubo algún cambio en la lectura, si no lo hubo nos indica que no se presionó tecla alguna, pero si hubo un cambio hay que rastrear la tecla se presiono mediante un "código".


Para empezar tendremos que configurar la mitad del puerto como salida y la otra mitad como entrada, por ejemplo configuremos "Row" como salida y "Col" como entrada, entonces primero colocamos el valor 1000 en "Row" y luego leemos el valor de "Col", si no existiese ninguna tecla pulsada la lectura que obtenemos en "Col" es 0000 pero si se pulsará por ejemplo la tecla SW1 el valor de la lectura en "Col" sería 1000 y de esta forma podemos obtener el código 10001000 que le correspondería a la tecla SW1.

Usualmente se utiliza la consulta del puerto para realizar la lectura teclado y esta consulta se lleva a cabo en el Programa Principal, pero podemos optimizar esto mediante un timer que se encargará de leer el teclado cada vez que nosotros deseemos, en nuestro caso el timer realizará la lectura del teclado cada 20ms.

Otra mejora que podemos hacer es controlar el keypad mediante una maquina de estado, esto asegurará la corrección de errores por los efecto rebote de las teclas y también dará una mejor eficiencia a nuestro programa de control.

La siguiente maquina de estado la implementaremos en una librería:


El funcionamiento de la librería es la siguiente:

En el archivo Keypad4x4.h tenemos que definir el puerto que utilizaremos:

#define KB_OUT PORTB
#define KB_IN     PINB
#define KB_DDR DDRB

KEYPADinit()
- Se configura el puerto en el cual se conectará el Keypad.

Scan_Keyboard()
- Escanea el puerto en busca de teclas presionadas.

KeyNewAvalible()
- Devuelve True si alguna tecla fue presionada.

ClearKeyNew()
- Habilita la búsqueda de una nueva tecla.





Descargas:
Datasheet ATmega8
Application Note State Machine
Source Code

0 comments:

Post a Comment