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
|
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