Teclado Matricial 4x4.





Un teclado matricial es un simple arreglo de botones conectados en filas y colúmnas, de modo que se pueden leer varios botones con el mínimo número de pines requeridos. Un teclado matricial 4x4 solamente ocupa 4 lineas de un puerto para las filas y otras 4 lineas para las colúmnas, de este modo se pueden leer 16 teclas utilizando solamente 8 líneas de un microcontrolador. Si asumimos que todas las columnas y filas inicialmente están en alto (1 lógico), la pulsación de un botón se puede detectar al poner cada fila a en bajo (0 lógico) y checar cada columna en busca de un cero, si ninguna columna está en bajo entonces el 0 de las filas se recorre hacia la siguiente y así secuencialmente.

Un modo simple de detectar la tecla presionada es incrementar una variable con la cuenta de las teclas revisadas, de este modo al detectaruna pulsación el valor de la cuenta será el valor de la tecla presionada. Si al final no se presionó ninguna tecla la variable se pone a cero y la cuenta vuelve a comenzar. El puerto B del microcontrolador 16f628 (así como en el 16f877) viene preparado especialmente para el control de un teclado matricial 4x4. Para tener siempre un valor de 1 lógico en las colúmnas del teclado (parte alta del puerto B del pic) es necesario conectar resistencias de pull-up, sin embargo el puerto B cuenta con resistencias de pull-up integradas, de ese modo es posible trabajar con un teclado matricial sin necesidad de ningún componente externo.

Las resistencias de pull-up del puerto B se habilitan poniendo en 0 el bit NOT_RBPU del registro OPTION_REG.Al método aqui expuesto para detectar la pulsación de una tecla en un teclado matricial se le conoce como muestreo secuencial. Existen otros, sin embargo esté es tal vez el más sencillo. En el siguiente ejemplo cada tecla del teclado matricial tiene un valor de 0 a F, valor que se despliega en un display de 7 segmentos. El el código necesario para leer un teclado matricial con un microcontrolador pic 16f628 es el siguiente.

Programa principal:

Código para leer teclado matricial con un microcontrolador PIC

El programa principal es muy sencillo, simplemente configura el puerto A como salida, la parte baja del puerto B también como salida y la parte alta del puerto B como entrada. Además de configurar los puertos también se habilitan las resistencias de pull-up internas con la línea bcf OPTION_REG,NOT_RBPU. Después de la configuración se llama a una rutina llamada TECLADO encargada de escanear el teclado y regresar el valor de la tecla pulsada para poder desplegar el número correspondiente en un display de 7 segmentos y el programa ahí se queda en un ciclo llamando a la rutina TECLADO y después desplegando y repitiendo lo mismo cíclicamente.La rutina TECLADO escanea el teclado matricial usando el método que ya se mencionó.

Primero se carga un 0 a la primer fila, después se checa columna a columna si hay un cero, en caso de que no se detecte ningún cero, el cero de las filas se recorre y se vuelven a revisar las columnas. Si no se detectó ningún cero significa que no se presionó ninguna tecla y la rutina vuelve a comenzar. Si se detectó un cero significa que se presionó una tecla y en ese momento la salta a la rutina ANTIRREBOTES. Después de eliminar los rebotes se decodifica la tecla pulsada utilizando una tabla como la que se utilizó en el ejemplo del display de 7 segmentos.

Código para identificar tecla en un PIC

Rutina antirrebotes

Existen otros métodos de manejar teclados matriciales, pero creo que ésta es la más sencilla. Para terminar una imágen del circuito:

Esquema de teclado matricial

Descargar el código: Teclado Matricial 4x4.

8 comentarios:

Anónimo dijo...

GRACIAS, HA SIDO DE MUCHA AYUDA, solo falto hacerle pocos ajustes para hacerlo funcionar con el pic16f887.
mi correo por si quieres la configuracion con el 16f887
yo_modesto@hotmail.com

Anónimo dijo...

Lo voy a probar!

Anónimo dijo...

GRACIAS OJALA Y ME PUEDAN COMPARTIR LA INFORMACION CON EL PIC16F887
MI CORREO:
italiano-giovanny84@hotmail.com

ramon12300 dijo...

¡Saludos! a todos, estoy tratando de armar un Temporizador descendente para una insoladora que armé, pero, los que he encontrado y armado hasta ahora, utilizan el PIC16F84(A) y no he podido hacerlo funcionar adecuadamnte, alguien tendrá información sobre alguno que podría funcionarme??
Mi correo es: ramon12300@gmail.com.
Mil gracias por su atención y ayuda...

Anónimo dijo...

amigo que gran ayuda, por casualidad podrias mandarme este codigo con el pic 16f877?
estoy haciendo los ajustes pero hay cosas que no entiendo a ver si me podrias ayudar mi
correo es eiserrapers@hotmail.com gracias

Luis_99_79 dijo...

Podrias explicarme la rutina de codificación?? esa parte no logro entenderla
de antemano gracias

Anónimo dijo...

Muchas gracias !!!
Me ha sido de mucha ayuda :)

MC Milhouse dijo...

oe men tengo este codigo pero cuando presiono un numero solo parpadea y no se kda fijo ....
include "p16f84a.inc"
LIST P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

KEY EQU 0x0C
TEMP EQU 0x0D
COUNT EQU 0x0E

org 0x00 ; Inicio de programa
bsf STATUS,5 ; Inicio configuracion E/S
clrf PORTA ; Puerto A como salida
movlw 0xF0
movwf PORTB
bcf STATUS,5 ; Fin configuracion E/S
bsf PORTA,0
BEGIN: clrf KEY
incf KEY,1
movlw 0x01
movwf PORTB
KEY_V: btfsc PORTB,4 ; Verificar tecla pulsada en columna 1
goto CON2 ; Ir a CON2 si se pulsa tecla
incf KEY,1 ; Incrementar KEY si no se pulsa tecla
btfsc PORTB,5 ; Verificar tecla pulsada en columna 2
goto CON2 ; Ir a CON2 si se pulsa tecla
incf KEY ; Incrementar KEY si no se pulsa tecla
btfsc PORTB,6 ; Verificar tecla pulsada en columna 3
goto CON2 ; Ir a CON2 si se pulsa tecla
incf KEY ; Incrementar KEY si no se pulsa tecla
btfsc PORTB,7 ; Verificar tecla pulsada en columna 4
goto CON2 ; Ir a CON2 si se pulsa tecla
incf KEY ; Incrementar KEY si no se pulsa tecla
movlw 0x11
subwf KEY,0
btfsc STATUS,2 ; Comprueba si llego a ultima tecla
goto CON1
bcf STATUS,0 ; Poner C=0
rlf PORTB,1
goto KEY_V
CON1: clrf KEY
goto DISP
CON2: movf KEY,0
movwf TEMP ; Retiene ultima tecla pulsada
DISP: bsf STATUS,5 ; Inicio configuracion E/S
clrf PORTB ; PortB como salida
bcf STATUS,5 ; Fin configuracion E/S
movf TEMP,0
call CONV
movwf PORTB ; Mostrar tecla pulsada en display
bcf PORTA,0 ; Habilitar display
nop
bsf PORTA,0 ; Deshabilitar display
bsf STATUS,5 ; Inicio configuracion E/S
movlw 0xF0
movwf PORTB
bcf STATUS,5 ; Fin configuracion E/S
goto BEGIN

;Subroutines
CONV: addwf PCL,1 ;Convierte hexadecimal a 7 segmentos
retlw 0x00 ;" "
retlw 0x0C ;1 tecla 1
retlw 0xB6 ;2 tecla 2
retlw 0x9E ;3 tecla 3
retlw 0xE2 ;F tecla 4
retlw 0xCC ;4 tecla 5
retlw 0xDA ;5 tecla 6
retlw 0xFA ;6 tecla 7
retlw 0xF2 ;E tecla 8
retlw 0x0E ;7 tecla 9
retlw 0xFE ;8 tecla 10
retlw 0xDE ;9 tecla 11
retlw 0xBC ;D tecla 12
retlw 0xEE ;A tecla 13
retlw 0x7E ;0 tecla 14
retlw 0xF8 ;B tecla 15
retlw 0x72 ;C tecla 16
retlw 0x00 ;" "
end

Publicar un comentario en la entrada

Utiliza nuestro foro de electronica si tienes dudas no relacionadas con este tema.