TECLADO 4X4 CON PIC16F628


El manejo del teclado es básico, para muchos proyectos, y de ahí la importancia de saber manejarlo.

Un teclado de 4x4 tiene el siguiente esquema

Para que nosotros podamos leer que tecla se presiono, debemos hacer un barrido en las columnas C1 - C4 y ver la respuestas en L1 - L4 de acuerdo al resultado, podremos saber que tecla se presiono. para eso usaremos la siguiente tabla

C1 - C4 L1-L4 TECLA
1110 0111 0x01
  1011 0x02
  1101 0x03
  1110 0x0A
1101 0111 0x04
  1011 0x05
  1101 0x06
  1110 0x0B
1011 0111 0x07
  1011 0x08
  1101 0x09
  1110 0x0C
0111 0111 0x0E
  1011 0x00
  1101 0x0F
  1110 0x0D

Ahora, vamos a aplicarlo en un ejemplo: Vamos a hacer un bucle, en el cual mandamos, el valor C1-C4  respectivo y vemos L1-L4 que nos devuelve, y de acuerdo al valor q nos de, lo enviaremos al puerto A, y este se visualizara en un display del tipo BCD.

Ahora, para mayor facilidad, y para poder usar el mismo código siempre, vamos a crear una librería, llamada teclado.inc, que contendrá las variables y rutinas que usaremos en el Programa. Estas son teclado.inc que usa las siguientes macros.

donde: 
        cblock
                TECLA ; variable que contendrá el valor de la tecla presionada
                flag_tecla; Indica '1' si se presiono tecla, en caso contrario es '0'
        endc


Rutina de Configuración de Teclado, Configura RB7-RB4 como Out y RB3-RB0 como in
CONFIGURA_TECLADO
    bsf STATUS,RP0    ; Paso al banco1
    bcf STATUS,RP1    ; 

    movlw b'00001111'
    movwf TRISB
    bcf OPTION_REG,7 ;Activo Pull Up para no tener que alimentar externamente. Esto

                                     ;Nos asegura que si no hay nada conectado al puerto B la entrada sea '1'
    bcf STATUS,RP0
return

Rutinas de Lectura de Teclado:
LEO_TECLADO
    mov TECLA,0
    clrf flag_tecla
L1_C0
    ;Ponemos la Primera Linea
    mov PORTB,b'01110000'
    movfw PORTB
    andlw 0x0F
    movwf TECLA
    compara TECLA,b'1110'
    jnz L1_C1 ;Si no es igual
    mov TECLA,0x0E;'*'
    jmp press_tecla
L1_C1
    compara TECLA,b'1101'
    jnz L1_C2 ;Si no es igual
    mov TECLA,0;'0'
    jmp press_tecla
L1_C2
    compara TECLA,b'1011'
    jnz L1_C3 ;Si no es igual
    mov TECLA,0xF;'*'
    jmp press_tecla
L1_C3
    compara TECLA,b'0111'
    jnz L2_C0 ;Si no es igual
    mov TECLA,0xD;'*'
    jmp press_tecla

.... Hacemos lo Mismo para  L2, L3 y L4
L4_C3
    compara TECLA,b'0111'
    jnz fin_teclado;si no es igual
    mov TECLA,0x0A;'*'
    jmp press_tecla
fin_teclado
    return
press_tecla
    mov flag_tecla,1
return


Ahora, el Programa que maneje al Ckto lo he llamado tecla628.asm, y nos genera el archivo tecla628.hex, que puede ser simulado fácilmente el Proteus-ISIS, y los archivos de simulación los encuentras Aquí. También voy a usar la libreria retardos.inc, que son retardos, que genere usando el programa Pic-Delay, donde mediante macros tengo definidas algunos retardos : ret10ms, ...,ret50ms,ret100ms,...,ret500ms,...,ret1seg
Donde :

                        LIST P=16F628
                        RADIX HEX
#include <P16F628.INC> ;Se incluye la definición de los registros
    cblock 0x20 ; Indico donde empieza bloque de variables
    endc

#include <macros.inc>; Librerias de macros
;Este Programa, va ha contener los datos del Teclado
;Teniendo q este esta en el PORTB
;PORTB=[L4][L3][L2][L1][C3][C2][C1][C0]
;TRISB= 0 0 0 0 1 1 1 1

ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO
ORG 0x05

;Incluyo librerias de Teclado
;Aqui hay 2 variables, TECLA y flag_tecla
;TECLA=> tecla Pressionada
;flag_tecla => Indica si se presiono Tecla
#include <teclado.inc>

;Incluye Distintos Retardos por Software
;ret10ms ret20ms ret30ms ret40ms
;ret50ms ret100ms ret200ms ret250ms
;ret500ms ret1seg
#include <retardos.inc>

INICIO
        ;Cabe resaltar que antes de usar un PIC16F628
        ;Por tener este entradas Analógicas para el comparador
        ;Debe especificarse de que tipo van usarse las entradas
        ;Al iniciar el Programa. Por Default estan en Analogicas
        movlw 7               
        movwf CMCON ;PORTA =Entradas Digitales

        bsf STATUS,RP0 ; Paso al Banco 1
        bcf STATUS,RP1
        clrf PORTA
        clrf VRCON ;A/D Voltaje de Referencia Desabilitado
        bcf STATUS,RP0 ;Regreso al Banco 0

        call CONFIGURA_TECLADO
repite
        call LEO_TECLADO
        compara flag_tecla,0
        jz repite
        movr PORTA,TECLA
        ret1seg
        goto repite 
END

Espero que les haya sido de utilidad

Yoel Ocmin
http://proyectosfie.tk 
UNMSM- Lima Perú 2005

martes, 12 de abril de 2005