;Configuración del PIC 16F84A
STATUS EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
TRISA EQU 0x85
TRISB EQU 0x86
;Variables para el programa
PDel0 EQU 0x0C
PDel1 EQU 0x0D
RESULT EQU 0x0E
CONTCL EQU 0x0F
CLAVES EQU 0x10
;Inicialización de puertos del PIC 16F84A
bsf STATUS, 5 ;Banco 1
clrf TRISA ;Todo el perto A OUT
movlw 0x0F
movwf TRISB ;0,1,2,3=IN 4,5,6,7=OUT
bcf STATUS, 5 ;Banco 0
;Vaciar puertos
clrf PORTA
clrf PORTB
;Inicializar vaiable para el programa
movlw B'00011111'
movwf CONTCL
INTERR
movlw 0xF0 ;Activar el RB para INT
movwf PORTB
btfsc PORTB,0 ;Para recibir señal: esta subrrutina
goto SCANTEC ; se encarga de llamar al decodificador
btfsc PORTB,1 ; de caracteres si detecta alguna
goto SCANTEC ; tecla presionada.
btfsc PORTB,2
goto SCANTEC
btfsc PORTB,3
goto SCANTEC
goto INTERR
UNINT
btfsc PORTB,0 ;Para ninguna señal: esta subrrutina
goto UNINT ; se encarga de asegurarse que ya no
btfsc PORTB,1 ; haya ninguna tecla apretada para
goto UNINT ; continuar con el programa. Si no se
btfsc PORTB,2 ; usara, el programa leería miles de
goto UNINT ; veces el mismo caracter, pero
btfsc PORTB,3 ; normalmente se quiere leerlo una
goto UNINT ; sola vez.
return
SCANTEC ;Subrutina que asigna valores para
clrf PORTB ; cada tecla diferente del teclado.
call DEMORA ;Llamar a Antirrebote de teclado (50ms)
clrw ;Vaciar Work
bsf PORTB,4 ;Activar primera fila
btfsc PORTB,0 ;Si RB0 = 1, entonces
movlw 0x01 ;el resultado será = 1
btfsc PORTB,1 ;Si RB1 = 1, entonces
movlw 0x02 ;el resultado será = 2
btfsc PORTB,2 ; ...
movlw 0x03
btfsc PORTB,3
movlw 0x0C
call UNINT
bcf PORTB,4 ;Desactivar primera fila
bsf PORTB,5 ;Activar segunda fila
btfsc PORTB,0 ;Leer y asignar valores
movlw 0x04
btfsc PORTB,1
movlw 0x05
btfsc PORTB,2
movlw 0x06
btfsc PORTB,3
movlw 0x0D
call UNINT
bcf PORTB,5 ;Desactivar segunda fila
bsf PORTB,6 ;Activar tercera fila
btfsc PORTB,0 ;Leer y asignar valores
movlw 0x07
btfsc PORTB,1
movlw 0x08
btfsc PORTB,2
movlw 0x09
btfsc PORTB,3
movlw 0x0E
call UNINT
bcf PORTB,6 ;Desactivar tercera fila
bsf PORTB,7 ;Activar cuarta fila
btfsc PORTB,0 ;Leer y asignar valores
movlw 0x0A
btfsc PORTB,1
movlw 0x00
btfsc PORTB,2
movlw 0x0B
btfsc PORTB,3
movlw 0x0F
call UNINT
bcf PORTB,7 ;Desactivar cuarta fila
movwf RESULT ;Mover valor final a RESULT
;Demora de 50ms a 4Mhz para antirrebote de botones del teclado
DEMORA movlw .55 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
return ; 2+2 Fin.
END
;El teclado matricial está conectado de la sgte forma:
; PORTB,4 PORTB,5 PORTB,6 PORTB,7
;PORTB,0 1 2 3 C
;POERB,1 4 5 6 D
;PORTB,2 7 8 9 E
;PORTB,3 A 0 B F
;Está claro que el puerto B es capaz de hacer interrupciones
;justamente para ser usadas en un teclado matricial. Aquí
;no se usan. Puede tener algunas ventajas. Además, en este
;programa, uno puede asignar valores arbitrarios a cada tecla
;del teclado, y eso es útil, ya que no cualquier teclado
;matricial tiene los números en el mismo órden que el que uso
;aquí.