Es un dispositivo de entrada que consiste en un arreglo matricial de 16 teclas (pulsadores). Dispone de un conector SIL (Single In Line) de 8 pines: 4 filas y 4 columnas. La interconexión de los pulsadores es como se muestra en la imagen:
Cuando se presiona una tecla se conecta una fila con una columna. La manera de averiguar la tecla presionada consiste en enviar un nivel lógico a una de las filas (diferente al nivel de las filas restantes) y buscar la columna por la que se recibe el mismo nivel lógico. De esta manera se obtiene la fila y columna al igual que en una matriz.
El diagrama de conexión típico al PIC16F84A es el siguiente:
Las resistencias de 1K son necesarias para evitar hacer un cortocircuito accidental si se comparten los mismos pines del PIC con otro periférico, como por ejemplo un Display o un LCD.
Las resistencias de 10K son necesarias para asegurar el nivel lógico 0 en las entradas del PIC.
Algoritmo de búsqueda:
- Los pines RB0-RB3 se configuran como Salidas. Los pines RB4-RB7 se configuran como Entradas.
- Las filas del teclado se conectan a los pines RB0-RB3 y las columnas a los pines RB4-RB7.
- Se envía “0” a todas las filas.
- Se envía “1” a la primera fila.
- Se verifica el nivel lógico en cada una de las columnas. Si se pulsó una tecla de la primera fila se obtendrá un “1” en la columna correspondiente.
- Si no se encuentra un “1” (no se pulsó tecla en la primera fila) se envía un “1” a la siguiente fila (a las filas restantes se envía “0”).
- Se verifican las columnas en busca del nivel lógico “1”.
- El procedimiento continúa hasta completar las 4 filas.
- Conociendo la fila por la que se envió “1” y conociendo la columna por la que se recibe “1” se puede conocer la tecla pulsada.
Programa para PIC16F84A
El programa lee la tecla pulsada en un teclado matricial 4x4 y simultáneamente muestra la última tecla pulsada en un display de 7 segmentos. Se Adjunta dos programas de estructura diferente que cumplen la misma tarea.
Diagrama de Conexión:
Prueba:
Programa en Assembler:
;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para control de teclado matricial 4x4
;Adicionalmente muestra la tecla pulsada en un display
;Para teclado: Salida: RB0-RB3
; Entradas: RB4-RB7
;Para Display: Salidas: RB1-RB7 (7 segmentos)
; RA0 (Habilitacion catodo comun)
;---------------------------------------------------------
include "p16f84a.inc"
LIST P=16f84a
__CONFIG _WDT_OFF & _XT_OSC
KEY EQU 0x0C
DISP EQU 0x0D
COUNT EQU 0x0E
org 0x00 ; Inicio de programa
BEGIN: 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
KEY_V: bcf STATUS,5; Fin configuracion E/S
clrf PORTB
bsf PORTB,0 ; Enviar bit 1 a la primera fila
VERIF1: btfss PORTB,4 ; Verificar tecla pulsada en columna 1
goto VERIF2
movlw 0x01 ; Si se pulsa tecla KEY=KEY+1
addwf KEY,1
goto CON2 ; Terminar verificacion
VERIF2: btfss PORTB,5 ; Verificar tecla pulsada en columna 2
goto VERIF3
movlw 0x02 ; Si se pulsa tecla KEY=KEY+2
addwf KEY,1
goto CON2 ; Terminar verificacion
VERIF3: btfss PORTB,6 ; Verificar tecla pulsada en columna 3
goto VERIF4
movlw 0x03 ; Si se pulsa tecla KEY=KEY+3
addwf KEY,1
goto CON2 ; Terminar verificacion
VERIF4: btfss PORTB,7 ; Verificar tecla pulsada en columna 4
goto CON1
movlw 0x04 ; Si se pulsa tecla KEY=KEY+4
addwf KEY,1
goto CON2 ; Terminar verificacion
CON1: incf COUNT,1 ; COUNT almacena filas ya verificadas
movlw 0x04
subwf COUNT,0
btfss STATUS,2
goto CON3
clrf KEY ; Si COUNT=4 (todas las filas verificadas)
clrf COUNT ; borrar COUNT y BORRAR KEY
goto DISPL
CON3: rlf PORTB ; Envia bit 1 a la siguiente fila
movlw 0x04 ; Si no se detecta tecla pulsada en una fila
addwf KEY,1 ; KEY=KEY+4
goto VERIF1
CON2: movf KEY,0 ; KEY almacena la tecla pulsada (1-16 decimal)
movwf DISP
clrf KEY
clrf COUNT
DISPL: bsf STATUS,5; Inicio configuracion E/S
clrf PORTB ; PortB como salida
bcf STATUS,5; Fin configuracion E/S
movf DISP,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 ; RB0-RB3 salidas y RB4-RB7 entradas
movwf PORTB ; Fin configuracion E/S
goto KEY_V
;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
end ; Fin de programa
Muy bn programa te felicitooo
ResponderEliminarBuen aporte.
ResponderEliminarpodrias adjuntar el archivo de proteus sino es molestia, gracias
ResponderEliminarpor estar escrito en assembler proteus no lo simula muy bien. La imagen es solo por el esquema de conexion.
ResponderEliminargracias, me ha dado un ejemplo para poder hacer una practica de electronica
ResponderEliminarOe men no me corre bien, los numeros no se kdan fijos parpadean muxo-
ResponderEliminarPrueba jugando con otros valores de resistencia para el teclado, me pasó lo mismo y lo resolví así.
EliminarY qué resistencias cambiaste para que no parpadeara?
EliminarQue valores modificaste a las resistencias?, el mío sigue parpadeando
Eliminarmas fácil de entender, aquí os dejo un código...
ResponderEliminarhttps://userscloud.com/6c3ugzi5wiz3
y su simulación...
https://userscloud.com/4npo8ibl4jbq
Hola:
ResponderEliminarTengo que trabajar con un teclado de 12 botones, como puedo programar y te consulto si me sirve el mismo pic.