#include <p16f628a.inc>
CBLOCK 0x20
Contador
AuxStatus
AuxW
Contador3
CONT
CONT2
CONT3
CONT_TMR0
ENDC
org 0
goto Configuracion
org 0x04
Interrupcion:
btfsc PORTB,0
goto Interrupcion
goto Pausa
reanudar
bcf INTCON,GIE ;INHABILITO INTERRUPCIONES GLOBALES
bcf INTCON,INTF ;BAJO EL FLAG DE INTERRUPCION DE RB0
bsf INTCON,GIE ;HABILITO INTERRUPCIONES GLOBALES
movwf AuxW ;GUARDO EL CONTENIDO DE W
movfw STATUS
movwf AuxStatus ;GUARDO EL CONTENIDO DEL STATUS
movwf STATUS
movfw AuxW
retfie
Pausa
btfss PORTB,0
goto PAUSA
goto reanudar
Configuracion:
bsf INTCON,GIE ;HABILITO INTERRUPCIONES GLOBALES
bsf INTCON,INTE ;HABILITO INTERRUPCIONES POR RB0
bsf STATUS,RP0 ;CAMBIO A BANCO 1
movlw .250
movwf CONT_TMR0
clrf TRISB ;SETEA TODOS LOS BITS DEL TRISB EN 0
bsf TRISB,0 ;RB0 COMO ENTRADA
movlw b'01000011'
movwf option_reg
bcf STATUS,RP0 ;CAMBIO A BANCO 0
movlw B'01111110' ;EL DISPLAY INICIA EN 0
movwf PORTB
call Timer0_1seg ;Para mantener el 0 en display por 1segundo
clrf Contador ;INICIALIZO EL CONTADOR EN 0
Inicio:
movlw d'15'
movwf Contador3
incf Contador,1 ;SI FUE PULSADO, SE INCREMENTA EL CONTADOR EN 1
movfw Contador ;SE PASA EL VALOR DE CONTADOR A W
call Display
movwf PORTB
call Timer0_1seg
decfsz Contador3,f
goto $-.6
movlw d'15'
movwf Contador3
decf Contador,1
movfw Contador
call Display
movwf PORTB
call Timer0_1seg
decfsz Contador3,f
goto $-.6
goto Inicio
Display:
addwf PCL,1
retlw B'01111110' ;NUMERO 0
retlw B'00001100' ;NUMERO 1
retlw B'10110110' ;NUMERO 2
retlw B'10011110' ;NUMERO 3
retlw B'11001100' ;NUMERO 4
retlw B'11011010' ;NUMERO 5
retlw B'11111010' ;NUMERO 6
retlw B'00001110' ;NUMERO 7
retlw B'11111110' ;NUMERO 8
retlw B'11011110' ;NUMERO 9
retlw B'11101110' ;LETRA A
retlw B'11111000' ;LETRA B
retlw B'01110010' ;LETRA C
retlw B'10111100' ;LETRA D
retlw B'11110010' ;LETRA E
retlw B'11100010' ;LETRA F
Timer0_1seg
BCF INTCON,T0IE
MOVLW .12 ;Carga el Timer0 con el valor que queremos
MOVWF TMR0
BCF INTCON,T0IF ;Reseteamos el Flag de desbordamiento del TMR0
Timer0_Desbordamiento
BTFSS INTCON,T0IF ;¿Se ha desbordado el TMR0?
GOTO Timer0_Desbordamiento ;Aún no, Repite.
decfsz CONT_TMR0,1 ;Repite 10 veces lo mismo para llegar a 1 segundo.
GOTO Timer0_1seg
RETURN
end