FIG. 5.1.1 Hardware correspondiente al experimento de exploración
de teclado
Para la lectura del teclado debemos tener en cuenta la disposición
de las filas y las columnas como se observa en la FIGURA 5.1.2 con la cual
realizando la operación allí descrita se debe obtener un
número consecutivo de las teclas en la organización aquí
mostrada. Luego, mediante el acceso a una tabla se decodifica la tecla
leída para obtener el patrón final observado en el diagrama
del hardware FIG. 5.1.1.
Ej. Sí se oprimiése la tecla C del teclado ( FIG. 5.1.1),
el código de exploración correspondiente a esta es el 13d
(FIG. 5.1.2) que debe ser representado como el 1100b en las salidas DCBA
( FIG. 5.1.1).
FIG. 5.1.2 Distribución del teclado, numeración en filas y columnas y la fórmula para hallar la tecla oprimida
En este experimento se realiza la emulación del integrado decodificador
de teclado 74C922 en cuanto a su funcionamiento, pero de acuerdo a la configuración
de hardware de la FIG. 5.1.1.
Listado del programa para exploración de teclado:
list p=16f84
#include <p16f84.inc> ;archivo
de encabezado por Microchip®
;
;ESTE PROGRAMA EMULA UN 74C922 DECODIFICADOR
DE TECLADO
;
CONTFIL EQU 0x12 ;Contador
de Filas
CONTCOL EQU 0x13 ;Contador
de Columnas
COLKBD EQU 0x14 ;DATO
EN COLUMNAS
Temp EQU 0x15
R1 EQU 0x16
;Variable para Retardo
R2 EQU 0x17
;Variable para Retardo
R3 EQU 0x18
;Variable para Retardo
R4 EQU 0x19
;Variable para Retardo
COUNT EQU 0x1A
CHAR EQU 0x1B
;Almacenamiento temporal SCAN
AUX EQU 0x1C
;Variable Auxiliar
#define _z STATUS,2
#define _c STATUS,0
#define OE PORTA,4
#define BANK0 bcf STATUS,RP0
#define BANK1 bsf STATUS,RP0
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ORG 0x00
MAIN
BANK1
CLRF TRISA
BANK0
CLRF PORTA
NOP
NOP
Muestre
BCF OE
RUSCAN
CALL SCAN
XORLW 0x00 ;espera
una Tecla
BTFSC _z
GOTO Muestre
MOVWF PORTA
MOVLW .50
MOVWF COUNT
LOOPSCAN
CALL DEL5MS
DECFSZ COUNT,1
GOTO LOOPSCAN
GOTO RUSCAN
;***************************************************************************
DEL5MS
MOVLW .12
MOVWF R1
MOVLW 7
MOVWF R2
MOVLW 1
MOVWF R3
MOVLW 1
MOVWF R4
LOOPDEL5
DECFSZ R1,F
GOTO LOOPDEL5
DECFSZ R2,F
GOTO LOOPDEL5
DECFSZ R3,F
GOTO LOOPDEL5
DECFSZ R4,F
GOTO LOOPDEL5
NOP
RETURN
;***************************************************************
;RETORNA W=00 NO HAY TECLA OPRIMIDA,
;RETORNA W=COD SI TECLA OPRIMIDA.
;**************************************************************
SCAN
BANK1
MOVLW 0x0F
;el puerto que lee teclado <0:3> filas (in)
MOVWF TRISB
BANK0
MOVLW 0x01
MOVWF CONTCOL
MOVLW 0x7F
MOVWF COLKBD
RSTFIL
CLRF CONTFIL ;RESET
CONT FILAS
MOVF COLKBD,W
MOVWF PORTB
;COLOCAR UN CERO EN COLUMNAS
nop
nop
nop
MOVF PORTB,W
;LEER FILAS DE TECLADO
MOVWF AUX
RLF AUX,F
RLF AUX,F
RLF AUX,F
RLF AUX,F
TESTFIL
RLF AUX,F
BTFSS _c
GOTO ACERTADO
INCF CONTFIL,F
MOVF CONTFIL,W
XORLW 0x04
BTFSS _z
GOTO TESTFIL
BSF _c
RRF COLKBD,F ;rotacion
del cero a colocar
INCF CONTCOL,F
MOVF CONTCOL,W
XORLW 0x05
BTFSS _z
GOTO RSTFIL
RETLW 0x00
ACERTADO
MOVF CONTFIL,W
XORLW 0x00
BTFSC _z
GOTO ESCERO
MOVLW 0x00
MUL
ADDLW 0x04
DECFSZ CONTFIL
GOTO MUL
SUMACOL
ADDWF CONTCOL,W
CALL TABKBD
RETURN
TABKBD
addwf PCL,F
retlw 0
;inválido
retlw 0x10
retlw 0x11
retlw 0x12
retlw 0x13
retlw 0x14
retlw 0x15
retlw 0x16
retlw 0x17
retlw 0x18
retlw 0x19
retlw 0x1A
retlw 0x1B
retlw 0x1C
retlw 0x1D
retlw 0x1E
retlw 0x1F
ESCERO
MOVLW 0x00
GOTO SUMACOL
end