Codigo:
list p=16F84A
;*
;* Temporizador insoladora
;* por Daniel González
;*
;*
;* Mapa de memoria
;*
TMR0 EQU 01
OPTION_REG EQU 01
PCL EQU 02
STATUS EQU 03
PORTA EQU 05
PORTB EQU 06
INTCON EQU 0B
REG18 EQU 0C
SEG EQU 0D
SEGX10 EQU 0E
MIN EQU 0F
REG1 EQU 10
REG2 EQU 11
REG11 EQU 12
REG12 EQU 13
REG13 EQU 14
REG14 EQU 18
REG15 EQU 17
OLDACUM EQU 15
NEWSTATUS EQU 16
RELE EQU 19
RP0 EQU 5
W EQU 0
F EQU 1
Z EQU 2
#DEFINE BANCO0 BCF STATUS,RP0
#DEFINE BANCO1 BSF STATUS,RP0
;*
;* Comienzo del programa
;*
ORG 00
RESET
GOTO INICIO
;*
;* Comienzo de la Int
;*
ORG 04 ; Comienzo de la interrupción
GOTO INT
;*
;* Inicio
;*
INICIO
;*
;* Configuracion de puertos
;*
BANCO1
MOVLW b"11000"
MOVWF PORTA
MOVLW b"00000000"
MOVWF PORTB ; Entradas ra3 y ra4,
; resto salidas
;*
;* Configuración de las interrupciones
;*
BANCO0
BSF INTCON,7 ; Habilita las int. globalmente
BANCO1
MOVLW b"00000111"
MOVWF OPTION_REG
; TMR0 rate como 1:256
; PS asignado a TMR0
; Reloj interno (ciclos de instruccion)
BANCO0
;*
;* Programa Principal
;*
CLRF PORTA ; Prepara y limpia PORTA
CLRF PORTB ; Prepara y limpia PORTB
MOVLW b"10000000"
MOVWF RELE
MOVLW .18
MOVWF REG18 ; REG18=18
MOVLW .0
MOVWF MIN ; MIN = 0
MOVLW .0
MOVWF SEGX10
MOVLW .0
MOVWF SEG ; Carga en todos los reg
; de tiempo el valor 0
;*
;* Selector de tiempo
;*
MINTAG CALL RETARDO50
CALL LIBRE
MOVF MIN,W
CALL DISP
MOVWF PORTB
BSF PORTA,2 ; Enciende el display min
NOP
BUCLE1 BTFSC PORTA,3 ; Si ra3=0 salta
GOTO MIN1
BTFSC PORTA,4 ; Si ra4=0 salta
GOTO SEGX10TAG
GOTO BUCLE1
SEGX10TAG BCF PORTA,2 ; Apaga el display min
CALL RETARDO50
CALL LIBRE
MOVF SEGX10,W
CALL DISP
MOVWF PORTB
BSF PORTA,1 ; Enciende el display segx10
NOP
BUCLE2 BTFSC PORTA,3 ; Si ra3=0 salta
GOTO SEGX101
BTFSC PORTA,4 ; Si ra4=0 salta
GOTO SEGTAG
GOTO BUCLE2
SEGTAG BCF PORTA,1 ; Apaga el display segx10
CALL RETARDO50
CALL LIBRE
MOVF SEG,W
CALL DISP
MOVWF PORTB
BSF PORTA,0 ; Enciende el display seg
NOP
BUCLE3 BTFSC PORTA,3 ; Si ra3=0 salta
GOTO SEG1
BTFSC PORTA,4 ; Si ra4=0 salta
GOTO MULTIPLEX
GOTO BUCLE3
MULTIPLEX CALL RETARDO50
CALL LIBRE
GOTO GO1
;*
;* Incremento de tiempo
;*
MIN1 MOVLW .9
SUBWF MIN,W
BTFSC STATUS,Z ; si MIN=9 no salta
GOTO CLRMIN
INCF MIN
CALL RETARDO50
GOTO MINTAG
SEGX101 MOVLW .5
SUBWF SEGX10,W
BTFSC STATUS,Z ; si SEGX10=9 no salta
GOTO CLRSEGX10
INCF SEGX10
CALL RETARDO50
GOTO SEGX10TAG
SEG1 MOVLW .9
SUBWF SEG,W
BTFSC STATUS,Z ; si MIN=9 no salta
GOTO CLRSEG
INCF SEG
CALL RETARDO50
GOTO SEGTAG
;*
;* Limpia tiempos cuando son 9
;*
CLRMIN CLRF MIN
CALL RETARDO50
GOTO MINTAG
CLRSEGX10 CLRF SEGX10
CALL RETARDO50
GOTO SEGX10TAG
CLRSEG CLRF SEG
CALL RETARDO50
GOTO SEGTAG
;*
;* Multiplexado y cuenta atrás
;*
GO1 BTFSC PORTA,4 ; Si ra4 es 0 salta
GOTO CORRE
BCF PORTA,1 ; Apaga disp segx10
BCF PORTA,2 ; Apaga disp min
MOVF SEG, W
CALL DISP
MOVWF PORTB
BSF PORTA,0 ; Enciende disp seg
CALL RETARDO3
BCF PORTA,0 ; Apaga disp seg
BCF PORTA,2 ; Apaga disp min
MOVF SEGX10,W
CALL DISP ; Llama a disp
MOVWF PORTB
BSF PORTA,1 ; Enciende disp segx10
CALL RETARDO3
BCF PORTA,0 ; Apaga disp seg
BCF PORTA,1 ; Apaga disp segx10
MOVF MIN, W
CALL DISP
MOVWF PORTB
BSF PORTA,2 ; Enciende disp min
CALL RETARDO3
GOTO GO1
CORRE
MOVLW .39
MOVWF TMR0
BSF INTCON, 5 ; Hab. int overflow TMR0
BSF PORTB,7 ; Activa relé
GO2 BCF PORTA,1 ; Apaga disp segx10
BCF PORTA,2 ; Apaga disp min
MOVF SEG ,W
CALL DISP
BTFSC INTCON,5 ; Si la int desb. TMR0 = 0 salta
ADDWF RELE,W
MOVWF PORTB
BSF PORTA, 0 ; Enciende disp seg
CALL RETARDO3
BCF PORTA,0 ; Apaga disp seg
BCF PORTA,2 ; Apaga disp min
MOVF SEGX10, W
CALL DISP
BTFSC INTCON,5 ; Si la int desb. TMR0 = 0 salta
ADDWF RELE,W
MOVWF PORTB
BSF PORTA,1 ; Enciende disp segx10
CALL RETARDO3
BCF PORTA,0 ; Apaga disp seg
BCF PORTA,1 ; Apaga disp segx10
MOVF MIN, W
CALL DISP
BTFSC INTCON,5 ; Si la int desb. TMR0 = 0 salta
ADDWF RELE,W
MOVWF PORTB
BSF PORTA,2 ; Enciende disp min
CALL RETARDO3
GOTO GO2
;*
;* Tabla de digitos para el display
;*
DISP ADDWF PCL,F
RETLW b"01111101" ; Dígito 0
RETLW b"01000001" ; Dígito 1
RETLW b"00111011" ; Dígito 2
RETLW b"01011011" ; Dígito 3
RETLW b"01000111" ; Dígito 4
RETLW b"01011110" ; Dígito 5
RETLW b"01111110" ; Dígito 6
RETLW b"01001001" ; Dígito 7
RETLW b"01111111" ; Dígito 8
RETLW b"01001111" ; Dígito 9
;*
;* Interrupcion por desbordamiento
;* en el TMR0
;*
INT
BCF INTCON,5 ; Deshab. int overflow TMR0
BCF INTCON,2 ; Pongo a 0 el flag de TMR0
MOVWF OLDACUM
MOVF STATUS, W
BANCO0
MOVWF NEWSTATUS
DECFSZ REG18,F
GOTO GO3
MOVLW .0
ADDWF SEG,F
BTFSC STATUS, Z ; Comprueba si se activo
; el flag Z, si SEG no era 0 salta
GOTO SEG0 ; Salta a SEG0
DECF SEG,F
MOVLW .18
MOVWF REG18
GOTO GO3
SEG0 MOVLW .0
ADDWF SEGX10
BTFSC STATUS, Z ; Comprueba si se activo
; el flag Z, si SEGx10 no era 0 salta
GOTO SEG0X10
MOVLW .18
MOVWF REG18
MOVLW .9
MOVWF SEG
DECF SEGX10,F
GOTO GO3
SEG0X10 MOVLW .0
ADDWF MIN
BTFSC STATUS,Z ; Comprueba si se activo
; el flag Z, si MIN no era 0 salta
GOTO MIN0
MOVLW .18
MOVWF REG18
MOVLW .5
MOVWF SEGX10
MOVLW .9
MOVWF SEG
DECF MIN, F
GOTO GO3
MIN0 MOVLW .0
ADDWF SEGX10,W
BTFSS STATUS,Z ; Comprueba si SEGX10 tambien es 0
GOTO GO3
MOVLW .0
ADDWF SEG,W
BTFSS STATUS,Z ; Comprueba su SEG tambien es 0
GOTO GO3
GOTO VUELVE
GO3 MOVLW .39
MOVWF TMR0
MOVF NEWSTATUS,W
MOVWF STATUS
SWAPF OLDACUM,F
SWAPF OLDACUM,W
BSF INTCON,5 ; Hab. int overflow TMR0
NOP
VUELVE RETFIE ; Regresa de la int
;*
;* Libre Porta
;*
LIBRE BTFSC PORTA,3
GOTO LIBRE
BTFSC PORTA,4
GOTO LIBRE
RETURN
;*
;* Retardo de 50 mseg
;*
RETARDO50 movlw .55 ; 1 set number of repetitions (B)
movwf REG12 ; 1 |
PLoop1B movlw .181 ; 1 set number of repetitions (A)
movwf REG11 ; 1 |
PLoop2B clrwdt ; 1 clear watchdog
PDelL1B goto PDelL2B ; 2 cycles delay
PDelL2B
decfsz REG11, 1 ; 1 + (1) is the time over? (A)
goto PLoop2B ; 2 no, loop
decfsz REG12, 1 ; 1 + (1) is the time over? (B)
goto PLoop1B ; 2 no, loop
PDelL3B goto PDelL4B ; 2 cycles delay
PDelL4B clrwdt ; 1 cycle delay
return ; 2+2 Done
;*
;* Retardo 0.3 mseg
;*
RETARDO3 movlw .1 ; 1 set number of repetitions (B)
movwf REG1 ; 1 |
PLoop11 movlw .73 ; 1 set number of repetitions (A)
movwf REG2 ; 1 |
PLoop22 clrwdt ; 1 clear watchdog
decfsz REG2,1 ; 1 + (1) is the time over? (A)
goto PLoop22 ; 2 no, loop
decfsz REG1,1 ; 1 + (1) is the time over? (B)
goto PLoop11 ; 2 no, loop
PDelL11 goto PDelL22 ; 2 cycles delay
PDelL22 clrwdt ; 1 cycle delay
return ; 2+2 Done
;*
;* END
;*
END