TECLADO.ASM
Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal. El teclado hexadecimal se supone conectado a la puerta B y su disposición es la siguiente:
RB0 RB1 RB2 RB3
TECLA CODIGO
----- --------------
|---|---|---|---| 0 01111101 = 0x7D
RB4 --> | 1 | 2 | 3 | F | 1 11101110 = 0xEE
|---|---|---|---| 2 11101101 = 0xED
RB5 --> | 4 | 5 | 6 | E | 3 11101011 = 0xEB
|---|---|---|---| 4 11011110 = 0xDE
RB6 --> | 7 | 8 | 9 | D | 5 11011101 = 0xDD
|---|---|---|---| 6 11011011 = 0xDB
RB7 --> | A | 0 | B | C | 7 10111110 = 0xBE
|---|---|---|---| 8 10111101 = 0xBD
9 10111011 = 0xBB
A 01111110 = 0x7E
B 01111011 = 0x7B
C 01110111 = 0x77
D 10110111 = 0xB7
E 11010111 = 0xD7
F 11100111 = 0xE7
cblock Key_var ;Reserva de memoria para las variables
Tecla ;Para devolver el código de la tecla
Key_1 ;Nº de columnas a explorar
Key_2 ;Temporal de código
Key_Delay_1 ;Variables de temporización
Key_Delay_2
endc
**********************************************************************
Rutina de exploración del teclado. La variable "Tecla" retorna con el código de la tecla pulsada o el código 0x80 si no se pulsa ninguna.
Key_Scan: bsf STATUS,RP0 ;Selecciona página 1
movlw b"00001111"
movwf PORTB ;RB7-RB4 salidas, RB3-RB0 entradas
bsf OPTION_REG,NOT_RBPU ;Activa cargas pull-up
bcf STATUS,RP0 ;Selecciona página 0
movlw 4
movwf Key_1 ;Nº de columnas a explorar
movlw b"01111111"
movwf Tecla ;Columna a activar
Key_Scan_1: movf Tecla,W
movwf PORTB ;Activa columna
nop
movf PORTB,W
movwf Key_2
subwf Tecla,W ;Lee las filas
btfss STATUS,Z ;¿ Hay alguna pulsada ?
goto Key_Scan_2 ;No hay ninguna pulsada
bsf STATUS,C ;No hay ninguna en esa columna
rrf Tecla,F ;Selecciona siguiente columna
decfsz Key_1,F
goto Key_Scan_1
movlw 0x80 ;Retorna código 0x80 (no hay pulsación)
movwf Tecla
return
Key_Scan_2: movlw .100 ;Bucle de temporización de unos 20mS
movwf Key_Delay_1 ;para evitar el rebote al pulsar
Key_Scan_3: clrf Key_Delay_2
Clrwdt
Key_Scan_4: decfsz Key_Delay_2,F
goto Key_Scan_4
decfsz Key_Delay_1,F
goto Key_Scan_3
movf Tecla,W ;Tras la temporización se lee nuevamente
movwf PORTB ;si la tecla es la misma. Así se evitan
;los rebotes
nop
movf PORTB,W
subwf Key_2,W
btfss STATUS,Z ;Es la misma ??
goto Key_Scan_1 ;No, seguir con la exploración
movf Key_2,W ;Si guardar en variable de salida "Tecla"
movwf Tecla
return
**********************************************************************
Convierte el código de la tecla que haya en la variable "Tecla" a Hexadecimal(0-F). El resultado se devuelve en la variable "Tecla".
Key_Tabla movf Key_1,W ;Calcula desplazamiento sobre
addwf PCL,F ;sobre la tabla
retlw 0x7d ;0
retlw 0xee ;1
retlw 0xed ;2
retlw 0xeb ;3
retlw 0xde ;4
retlw 0xdd ;5
retlw 0xdb ;6
retlw 0xbe ;7
retlw 0xbd ;8
retlw 0xbb ;9
retlw 0x7e ;A
retlw 0x7b ;B
retlw 0x77 ;C
retlw 0xb7 ;D
retlw 0xd7 ;E
retlw 0xe7 ;F
Key_BCD: movf Tecla,W
movwf Key_2 ;Almacena el código temporalmente
clrf Key_1 ;Contador BCD a 0
Key_BCD_2 call Key_Tabla ;Busca código en la tabla
subwf Key_2,W ;Compara con el de la tecla
btfsc STATUS,Z ;Coincide ??
goto Key_BCD_1 ;Si
incf Key_1,F ;No, incrementa contador BCD
goto Key_BCD_2
Key_BCD_1 movf Key_1,W
movwf Tecla ;Carga BCD en la variable de salida
return