;**********************************
;teporizador en minutos y segundos
;con pic 16f84a
;**********************************
;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
Disp VAR byte
Delay VAR byte
CLEAR
TRISB = %01000000
TRISA = %00011111
PAUSE 500
Mts = 03 'aquí cuadramos el tiempo en que iniciara
Sds = 00
pulsos = 0
OPTION_REG = %00000101 ; prescaler = 64
On INTERRUPT GOTO ISR ; IR A RUTINA ISR
INTCON = %10100000
LCDOUT $FE, 1 ;LIMPIA LCD
;INCIO DEL PROGRAMA
LOOP:
;BOTÓN START
IF START = 0 THEN ; si el boton start es presionado ejecuta lo siguiente
TMR0 = 0 ;Inicializa registro TMR0
INTCON = $A0 ;habilita el timer interrupt
Disp = 1 ; habilita display
Gosub Retardo
ENDIF
;BOTÓN STOP
IF STOP_ = 0 THEN ; si el boton stop es presionado ejecuta lo siguiente
INTCON = 0 ;desabilita el timer
Disp = 1 ; habilita display
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 '*
ENDIF '*
'******************************
IF Disp = 1 THEN
LCDOUT $FE, 1
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 :)
Disp = 0
ENDIF
GOTO LOOP
;ANTIRREBOTE
Retardo:
FOR Delay = 1 To 200
Pause 1
NEXT Delay
Disp = 1
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
Disp = 1 ; habilita display
Sds = Sds - 1
endif
return
mensaje_fin:
LCDOUT $FE, 2
Lcdout " <<FINALIZADO>> "
LCDOUT $FE,$C1," PULSE CLEAR"
return
NoUpdate:
INTCON.2 = 0
Resume
ENABLE
END