#include <p16f628a.inc>
Contador equ 0x20
AuxStatus equ 0x21
AuxW equ 0x22
Contador3 equ 0x24
NumInter equ 0x25
Banderas equ 0x26
;Bits de bandera
Direccion equ 0x1
Habilitado equ 0x2
Otromas equ 0x4
org 0x00
goto Configuracion
org 0x04
Interrupcion:
; Aca poner el codigo de guardado de contexto ( W, STATUS), Buscar codigo en datasheet, buscar por W_TEMP
MOVLW 0x00 ;Cargo el timer de nuevo
MOVWF TMR0
BCF INTCON, TMR0IF ;Borro flag del timer
BTFSS Banderas, Habilitado ; Habilitado el contador? Sino salgo
GOTO Salir_Int
INCF NumInter, F ;Incremento la cantidad de interrupciones, para saber cuando cambiar el valor del display
MOVF NumInter, W ; Comparo con el valor correcto, si es igual muestro el valor.
XORLW 0x00 ; ACA PONER LA CANTIDAD DE INTERRUPCIONES
BTFSS STATUS, Z
GOTO Salir_Int ; En caso de que todavia no paso el segundo salgo.
CLRF NumInter ; Pongo a 0 para el proximo segundo.
MOVF Contador, W ; Y muestro el numero
ANDLW 0x0F ; Proteccion, limito cualquier cosa a un maximo de 0xF
CALL Display
MOVWF PORTB
BTFSS Banderas, Direccion ; Ascendente = 1, descendente = 0
GOTO Cuenta_Descendente
Cuenta_Ascendente:
INCF Contador, F ;Incremento, reviso si se paso de 15, si es asi entonces cambio de direccion
MOVF Contador, W
XORLW 0x10
BTFSS STATUS, Z
GOTO Salir_Int
BCF Banderas, Direccion ; Al pasarse de 0xF quedaria con 0x10, el mismo DECF que sigue lo deja en 0xF
Cuenta_Descendente:
DECF Contador, F ; Decremento, cuando pasa de 0x00 a 0xFF lo detecto y lo pongo a 0x00 de vuelta, tambien cambio direccion
MOVF Contador, W
XORLW 0xFF
BTFSS STATUS, Z
GOTO Salir_Int
CLRF Contador
BSF Banderas, Direccion
Salir_Int:
;Aca poner el codigo de restauracion de contexto ( W y STATUS )
retfie
Configuracion:
;Banco 1
BANKSEL TRISB
MOVLW 0x01
MOVWF TRISB
;Banco 0
BANKSEL PORTB
;Configurar el Timer aca y activar el TMR0IE de INTCON
; Preparacion de todos los registros antes de comenzar
CLRF Contador ; INICIALIZO EL CONTADOR EN 0
BSF Banderas, Direccion ; Direccion Ascendente
BCF Banderas, Habilitado ; No habilitado
; Como paso final activo las interrupciones
bsf INTCON,GIE ; HABILITO INTERRUPCIONES GLOBALES
Inicio:
BTFSS PORTB, 0 ; Presiona
GOTO $-1
CALL Delay_10ms ; Un delay por un antirebote
BTFSC PORTB, 0 ; Espero que suelte
GOTO $-1
MOVLW Habilitado ; Cargo el bit
XORWF Banderas, F ; Invierto ese bit nomas
GOTO Inicio
Display:
addwf PCL, F
retlw B'10000000' ;NUMERO 0
retlw B'11110010' ;NUMERO 1
retlw B'01001000' ;NUMERO 2
retlw B'01100000' ;NUMERO 3
retlw B'00110010' ;NUMERO 4
retlw B'00100100' ;NUMERO 5
retlw B'00000100' ;NUMERO 6
retlw B'11110000' ;NUMERO 7
retlw B'00000000' ;NUMERO 8
retlw B'00100000' ;NUMERO 9
retlw B'00010000' ;LETRA A
retlw B'00000110' ;LETRA B
retlw B'10001100' ;LETRA C
retlw B'01000010' ;LETRA D
retlw B'00001100' ;LETRA E
retlw B'00011100' ;LETRA F
end