;CONFIGURACIÓN PIC
@ DEVICE pic16F84A
@ DEVICE WDT_ON
@ DEVICE PWRT_ON
@ DEVICE PROTECT_OFF
@ DEVICE xt_osc
define osc 4
;REGISTROS LCD
Define LCD_DREG PORTB
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5
Symbol Minutos = PORTA.1 ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2 ; AJUSTE SEGUNDOS
symbol Out = PORTB.7 ; SALIDA CONTROL
symbol START = PORTA.3 ; INICIO CONTEO
SYMBOL STOP_ = PORTB.6 ; DETIENE CONTEO
;VARIABLES
Pulsos VAR byte
Mts VAR byte
Sds VAR byte
Delay VAR byte
CLEAR
TRISB = %01000000
TRISA = %00011111
PAUSE 500
Mts = 03
Sds = 00
pulsos = 0
OPTION_REG = %00000101 ; prescaler = 64
On INTERRUPT GOTO ISR ; IR A RUTINA ISR
INTCON = %10100000
;INCIO DEL PROGRAMA
LOOP:
;BOTÓN START
IF START = 0 THEN ; si el boton start es presionado ejecuta lo siguiente
TMR0 = 0 ;Inicializa refgistro TMR0
INTCON = $A0 ;habilita el timer interrupt
gosub Retardo
LCDOUT $FE, 1 ; ESTA ES LA MODIFICACION... LA INSTRUCCION "$FE, 1" LO PUSE ACÁ
ENDIF
;BOTÓN STOP
IF STOP_ = 0 THEN ; si el boton stop es presionado ejecuta lo siguiente
INTCON = 0 ;desabilita el timer
gosub Retardo
ENDIF
;BOTÓN PROGRAMAR LOS MINUTOS
IF Minutos = 0 THEN
Mts = Mts - 1
gosub retardo
ENDIF
;BOTÓN PROGRAMAR LOS SEGUNDOS
if Segundos = 0 then
Sds = Sds - 1
gosub retardo
ENDIF
'*****************************
IF Mts = 60 AND Sds = 60 THEN'
out = 1 '
gosub mensaje_fin '
else '
out = 0 '
gosub retro
gosub MENSAJE1 '
ENDIF '
'*****************************
GOTO LOOP
;ANTIRREBOTE
Retardo:
FOR Delay = 1 To 200
Pause 1
NEXT Delay
RETURN
;EJECUCION DE UN SEGUNDO
DISABLE
ISR:
IF Mts < 0 OR Sds > 0 THEN 'OJO sí se cambia esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif
;TIEMPO
Retro:
pulsos = 0
IF Sds = 0 AND Mts => 0 then
Mts = Mts - 1
Sds = 61
endif
if mts > 60 then mts = 60
if mts = 0 then mts = 0
'ALARMA
IF Mts = 60 AND Sds = 60 THEN
pulsos = pulsos
INTCON = 0 ;desabilita el timer
else
TMR0 = 0 ;Inicializa registro TMR0
INTCON = $A0 ;habilita el timer interrupt
Sds = Sds - 1
endif
return
mensaje1:
; LA INSTRUCCION LCDOUT $FE, 1 TE LA SAQUE DE ACÁ
LCDOUT $FE, 2
Lcdout "Tiempo de espera "
LCDOUT $FE,$C4,DEC2 Mts, ":",DEC2 Sds
LcdOut $fe,$C16, 0
LCDOUT $fe,$40,$00,$0A,$0A,$00,$04,$11,$0E,$00 'aqui tenemos la carita feliz :)
return
mensaje_fin:
; LA INSTRUCCION LCDOUT $FE, 1 TE LA SAQUE DE ACÁ
LCDOUT $FE, 2
Lcdout " <<FINALIZADO>> "
LCDOUT $FE,$C1," PULSE CLEAR"
return
NoUpdate:
INTCON.2 = 0
Resume
ENABLE
END
END