VEJARANO CERNA AXL JAIME JAVIER
Código MPLAB
list p=16f628a
include [Link]
cblock 0x20
NUM
TECLA
CODIGO
VALOR1
VALOR2
VALOR3
VALOR4
endc
CUENTA EQU 20H
NUM.1 equ b'11101100';b'11011000' ; 7
NUM.2 equ b'10000000';b'00000000' ; 8
NUM.3 equ b'10001000';b'00010000' ; 9
NUM.4 equ b'10001100';b'00011001' ; 4
NUM.5 equ b'10001001';b'00010010' ; 5
NUM.6 equ b'10000001';b'00000010' ; 6
NUM.7 equ b'11101100';b'11011001' ; 1
NUM.8 equ b'10100010';b'01000100' ; 2
NUM.9 equ b'10101000';b'01010000' ; 3
LET.A equ b'10000100' ;b'00001000' ; *
NUM.0 equ b'11000000';b'10000000' ; 0
LET.b equ b'10000001';b'00000011' ; #
org 0x00
goto INICIO
org 0x04
GOTO INTERRUP
INICIO
movlw 0x07 ; Deshabilitar comparadores
bsf STATUS,RP0 ; Cambio a banco 1
clrf TRISA ; Puerto A como salida
BSF TRISA,5
movlw b'11100001' ; Nibble alto del puerto B com
movwf TRISB ; entrada y bajo como salida
bcf OPTION_REG,NOT_RBPU ; Resistencias de pull-up
; habilitadas
bcf STATUS,RP0 ; Cambio a banco 0
;CONFIGURAR INTERRUP
BSF INTCON,GIE
BSF INTCON,INTE ; [Link]. RB0
BSF STATUS,RP0
BCF OPTION_REG,INTEDG; BAJADA
BCF STATUS,RP0
CLRF CUENTA
PRINCIPAL
call TECLADO ; Llamar a rutina de teclado
movwf VALOR1 ; Desplegar numero en puerto A
call TECLADO
movwf VALOR2
call TECLADO
movwf VALOR3
call TECLADO
movwf VALOR4
;csi
COND1 movlw NUM.2
subwf VALOR1,0
btfsc STATUS,Z
goto COND2
goto INCORRECTO
COND2 movlw NUM.9
subwf VALOR2,0
btfsc STATUS,Z
goto COND3
goto INCORRECTO
COND3 movlw NUM.9
subwf VALOR3,0
btfsc STATUS,Z
goto COND4
goto INCORRECTO
COND4 movlw NUM.2
subwf VALOR4,0
btfsc STATUS,Z
goto CORRECTO
goto INCORRECTO
INCORRECTO
btfsc PORTB,0
goto $-1
bsf PORTA,6
;bcf PORTA,4
goto PRINCIPAL
CORRECTO
btfsc PORTB,0
goto $-1
bcf PORTA,6
;bsf PORTA,4
CLRF PORTA
CLRF CUENTA
BSF INTCON,GIE
BSF INTCON,INTE
goto PRINCIPAL
;RUT_RESET
; CLRF PORTA
; CLRF CUENTA
; BSF INTCON,GIE
; BSF INTCON,INTE
INTERRUP
BCF INTCON,1; bajar flag de interrupción
INCF CUENTA,1
MOVLW B'00001111'
ANDWF CUENTA
MOVF CUENTA,0
MOVWF PORTA
bsf PORTA,6
; CUENTA = 0000 0011
SUBLW D'3'
BTFSS STATUS,Z
RETFIE
BSF PORTA,7
BCF INTCON,GIE
BCF INTCON,INTE
RETFIE
;**
;* Rutina que escanea un teclado matricial 3x4 *
;* recorriendo un 0 por cada una de sus filas y *
;* leyendo el estado de cada columna, si la co- *
;* lumna se encuentra con un estado logico alto *
;* no se presiono ninguna tecla, si se encuen- *
;* tra en bajo (0) entonces se detecta la tecla *
;* presionda *
;**
TECLADO
clrf TECLA ; Limpiar variable TECLA
movlw b'00001101' ; Poner un cero en la primer
movwf PORTB ; fila del puerto B (RB0)
CHECA_COL
btfss PORTB,5 ; Si la 1er columna es "0"
goto ANTIRREBOTES ; salta a la rutina ANTIRREBOTES
incf TECLA,f ; Si es "1" incrementa TECLA
btfss PORTB,6 ; Si la 2da columna es "0"
goto ANTIRREBOTES ; salta a la rutina ANTIRREBOTES
incf TECLA,f ; Si es "1" incrementa TECLA
btfss PORTB,7 ; Si la 3er columna es "0"
goto ANTIRREBOTES ; salta a la rutina ANTIRREBOTES
incf TECLA,f ; Si es "1" incrementa TECLA
; Si no se detecto ninguna pulsacion se realiza una comparacion
; entre la variable TECLA y el numero "12", si TECLA es menor que
; 12 el "0" en las filas del puerto B se recorre hacia la izquierda
; hacia la siguiente fila, si TECLA es igual a "12" la rutina del
; TECLADO vuelve a comenzar
movlw d'12'
subwf TECLA,w
btfsc STATUS,Z
goto TECLADO
bsf STATUS,C
rlf PORTB,f
goto CHECA_COL
;***
;* Rutina que elimina los rebotes y ademas decodifica *
;* la tecla pulsada y regresa el valor binario necesa- *
;* para desplegar los numeros de 0 a b en un display *
;* de 7 segmentos conectado al puerto A *
;***
ANTIRREBOTES
B1 btfss PORTB,5
goto B1
B2 btfss PORTB,6
goto B2
B3 btfss PORTB,7
goto B3
movf TECLA,w
call DECOD_TECLA
return
DECOD_TECLA
addwf PCL,f
retlw NUM.1
retlw NUM.2
retlw NUM.3
retlw NUM.4
retlw NUM.5
retlw NUM.6
retlw NUM.7
retlw NUM.8
retlw NUM.9
retlw LET.A
retlw NUM.0
retlw LET.b
end