miércoles, 2 de marzo de 2011

Teclado Matricial 4x4


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
  

Archivos .ASM y .HEX:

11 comentarios:

  1. Muy bn programa te felicitooo

    ResponderEliminar
  2. podrias adjuntar el archivo de proteus sino es molestia, gracias

    ResponderEliminar
  3. por estar escrito en assembler proteus no lo simula muy bien. La imagen es solo por el esquema de conexion.

    ResponderEliminar
  4. gracias, me ha dado un ejemplo para poder hacer una practica de electronica

    ResponderEliminar
  5. Oe men no me corre bien, los numeros no se kdan fijos parpadean muxo-

    ResponderEliminar
    Respuestas
    1. Prueba jugando con otros valores de resistencia para el teclado, me pasó lo mismo y lo resolví así.

      Eliminar
    2. Y qué resistencias cambiaste para que no parpadeara?

      Eliminar
    3. Que valores modificaste a las resistencias?, el mío sigue parpadeando

      Eliminar
  6. mas fácil de entender, aquí os dejo un código...

    https://userscloud.com/6c3ugzi5wiz3

    y su simulación...

    https://userscloud.com/4npo8ibl4jbq

    ResponderEliminar
  7. Hola:
    Tengo que trabajar con un teclado de 12 botones, como puedo programar y te consulto si me sirve el mismo pic.

    ResponderEliminar