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:
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.
Existen otros métodos de manejar teclados matriciales, pero creo que ésta es la más sencilla. Para terminar una imágen del circuito:
Descargar el código: Teclado Matricial 4x4.
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.
Existen otros métodos de manejar teclados matriciales, pero creo que ésta es la más sencilla. Para terminar una imágen del circuito:
Descargar el código: Teclado Matricial 4x4.
GRACIAS, HA SIDO DE MUCHA AYUDA, solo falto hacerle pocos ajustes para hacerlo funcionar con el pic16f887.
ResponderEliminarmi correo por si quieres la configuracion con el 16f887
yo_modesto@hotmail.com
Padre quisiera ver el código del pico 16f887 mi nombres es Ibrahim y este es mi correo ibrahimevangelioeterno@gmail.com
EliminarLo voy a probar!
ResponderEliminarGRACIAS OJALA Y ME PUEDAN COMPARTIR LA INFORMACION CON EL PIC16F887
ResponderEliminarMI CORREO:
italiano-giovanny84@hotmail.com
¡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??
ResponderEliminarMi correo es: ramon12300@gmail.com.
Mil gracias por su atención y ayuda...
amigo que gran ayuda, por casualidad podrias mandarme este codigo con el pic 16f877?
ResponderEliminarestoy haciendo los ajustes pero hay cosas que no entiendo a ver si me podrias ayudar mi
correo es eiserrapers@hotmail.com gracias
Podrias explicarme la rutina de codificación?? esa parte no logro entenderla
ResponderEliminarde antemano gracias
Muchas gracias !!!
ResponderEliminarMe ha sido de mucha ayuda :)
oe men tengo este codigo pero cuando presiono un numero solo parpadea y no se kda fijo ....
ResponderEliminarinclude "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
gracias :33
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarhola,intenté pasar el código para un pic16f877a y no me marca error en el source code,pero no prender el display :( . Puedes decirme que podría ser en una respuesta por correo
ResponderEliminarhernandez.rene@uabc.edu.mx
¿Cómo se llaman las filas de nuestro teclado?
ResponderEliminarDisculpa quisiera saber como se realizaría para el caso donde se agregan mas displays
ResponderEliminarDe antemano gracias por la explicación de este programa
no me anda lo tengo que hacer un teclado matricial de 4 x 4 con el pic 16f627a o 16f628a y no me anda con el codigo de esta pagina
ResponderEliminarHola, gracias por el aporte..se puede hacer para el pic 16F873?
ResponderEliminarPara quienes usan PIC16F887, las unicas modificaciones que realice fueron las siguientes:
ResponderEliminarSacar las lineas de seteo del registro CMCON, y luego setear el puerto B como I/O digital a partir del registro ANSELH.
;movlw 0x07 ; Deshabilitar comparadores
;movwf CMCON ; analogicos
BANKSEL ANSELH
CLRF ANSELH
Luego restaría acceder a los bancos correspondientes para las demás configuraciones, como ser:
BANKSEL TRISB
Alguien podría por favor enviarme el código para el 16f877A, no logro hacer que funcione, no sé en que me equivoco
ResponderEliminarmi correo es karen.enco@gmail.com
Si alguien tiene la configuracion para el PIC16F877a, me la podria pasar por favor, la verdad soy nuevo en esto y este mismo ejemplo con el pic antes dicho
ResponderEliminarmi corrreo luisluffy17.ll@gmail.com
Utiliza nuestro foro de electronica si tienes dudas no relacionadas con este tema.