;Programa para realizar el apagado y encendido de un LED colocado en el ;Puerto A0 basado en la interrupción externa INT (RB0)
;
list p=16F628A
#INCLUDE <P16F628A.INC>
ERRORLEVEL -302
rota equ 20h ;variable para desplazamiento de display
dig1 equ 21h ;acumulador miles
dig2 equ 22h ;acumulador centenas
dig3 equ 23h ;acumulador decenas
dig4 equ 24h ;acumulador unidades
loops equ 25h ;variables usadas en retardos
loops2 equ 26h
pulso equ 27h
W_TEMP equ 0x28
STATUS_TEMP equ 0x29
PCLATH_TEMP equ 0x2a
org 00h ;Indica al ensamblador la dirección de memoria de
;la sig. instrucción
goto inicio
org 04h
btfss INTCON,1 ;es interrupción RB0?
goto sale ;si no lo es sale
MOVWF W_TEMP ;guardar copia de los registros claves
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH, W
MOVWF PCLATH_TEMP
CLRF PCLATH
bcf INTCON,1
movlw d'250'
call retardo
movf pulso,W
xorlw 0x02
btfss STATUS,Z
incf pulso,F
btfss PORTB,0 ;espera a que se suelte el pulsador
goto $-1
movlw d'250'
call retardo
sale MOVF PCLATH_TEMP,W ;restaurar registros claves
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
retfie
inicio movlw .7
movwf CMCON
bsf STATUS,RP0 ;selecciona el banco de memoria alto
movlw 00h ;configura el puerto a
movwf PORTA ;como salida.
movlw b'00000001' ;configura el Pin RB0 como entrada
movwf PORTB ;el resto como salida.
clrf OPTION_REG ;interr en bajo de RB0
bcf STATUS,RP0 ;selecciona el banco de memoria bajo
movlw b'10010000' ;configura las interrupcion
movwf INTCON ;RB0/INT.
clrf dig1 ;inicializa acumuladores
clrf dig2
clrf dig3
clrf dig4
clrf pulso
;envia ceros a los transistores para apagar
clrf PORTA ;todos los displays digito a mostrar
;pasa el dato a el Puerto A
movf pulso,W
addwf PCL,F
goto $-2
goto empe
goto ciclo
empe call subir ;llama la rutina de incremento
movlw 08h ;iniciar un digito 1 en el registro de rotacion
movwf rota
movlw dig1 ;con el registro selector (fsr) se apunta
movwf FSR ;al primer dato que se va a mostrar
disp ;colocar en cero el dato del display
clrf PORTB ;para apagarlos
movf rota,W ;pasa rotacion del 1 a la variable work
movwf PORTA ;enciende el transistor (display)
movf INDF,W ;lee el dato del registro apuntado por fsr
call tabla ;genera el digito de 7 segmentos
movwf PORTB ;envia el digito al puerto b
movlw 03h ;retardo de 3ms para visualizacion
call retardo
btfsc rota,0 ;controla si terminaron las cuatro rotaciones
goto empe ;si termino, vuelve desde el comienzo
bcf STATUS,C ;carry en cero para no afectar las rotaciones
rrf rota,F ;desplaza el 1 que enciende los displays
incf FSR,F ;incrementa el puntero. Apunta el proximo
goto disp
retardo ;subrutina de retardo
movwf loops ;la variable de trabajo contiene la cant.
top2 movlw d'110' ;de ms a demorar
movwf loops2
top nop
nop
nop
nop
nop
nop
decfsz loops2,F ;controla si termina 1mS
goto top
decfsz loops,F ;controla si termina el retardo completo
goto top2
retlw 0
s1000 ;rutina de incremento x 1000
clrf dig2 ;pone a cero las centenas
incf dig1,F ;incrementa el contador de miles
movf dig1,W ;carga en work el conteo de los miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc STATUS,Z ;si es cero, el flag z queda alto
clrf dig1 ;inicializa los miles
return
s100 ;rutina de incremento x 100
clrf dig3 ;pone a cero las decenas
incf dig2,F ;incrementa el contador de centenas
movf dig2,w ;carga en work el conteo de las centenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc STATUS,Z ;si es cero, el flag z queda alto
call s1000 ;incrementa los miles
return
s10 ;rutina de incremento x 10
clrf dig4 ;pone a cero las unidades
incf dig3,F ;incrementa el contador de decenas
movf dig3,W ;carga en work el conteo de las decenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc STATUS,Z ;si es cero, el flag z queda alto
call s100 ;incrementa las centenas
return
subir ;rutina de incremento
incf dig4,F ;incrementa el contador de unidades
movf dig4,W ;carga en work el conteo de las unidades
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc STATUS,Z ;si es cero, el flag z queda alto
call s10 ;incrementa las decenas
movlw d'250' ;retardo de 100ms
call retardo
return
tabla ;genera los numeros sobre el display
addwf PCL,F ;agrega al cont. programa el valor de work
retlw b'01111111' ;genera el 0
retlw b'00001101' ;genera el 1
retlw b'10110111' ;genera el 2
retlw b'10011111' ;genera el 3
retlw b'11001101' ;genera el 4
retlw b'11011011' ;genera el 5
retlw b'11111001' ;genera el 6
retlw b'00001111' ;genera el 7
retlw b'11111111' ;genera el 8
retlw b'11001111' ;genera el 9
ciclo nop
goto $-1
end