demo proteus con proton
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings
Device = 16F628A
Config FOSC_HS, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF
;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
Declare Xtal = 4
Declare Optimiser_Level = 3
Declare Bootloader off
Declare Float_Display_Type = Fast
Declare Dead_Code_Remove = 1 ' Remove dead code
Declare Watchdog = Off
Declare Create_Coff On
'Declare Reminders Off
'Declare Hints Off
'Declare Warnings Off
'Declare Auto_Variable_Bank_Cross = On
; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F628A, DISPLAYS DE 7 SEGMENTOS Y BOTONES PARA
; AJUSTE DE HORAS Y MINUTOS
CMCON=7
Symbol Hrs_button = PORTA.0 ; BOTON DE AJUSTE PARA HORAS
Symbol Mins_button = PORTA.1 ; BOTO0N DE AJUSTE PARA MINUTOS
Dim Ticks As Byte ; 61 ticks = 1 sec
Dim Hour As Byte
Dim Minute As Byte
Dim Second As Byte
Dim Disp As Byte ; Disp = 1 to ACTULIZA DISPLAYS
PORTB= 0
TRISB = 0 ; PORTB is SALIDA
TRISA = 3 ; RA0,RA1 SON ENTRADAS
;VARIABLES A DESPLEGAR
Dim hab As Bit
Dim MIN_DER As Byte ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO DERECHO
Dim MIN_IZQ As Byte ;VARIABLE PARA DESPLEGAR EL MINUTO DEL LADO IZQUIERDO
Dim HRS_DER As Byte ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO DERECHO
Dim HRS_IZQ As Byte ;VARIABLE PARA DESPLEGAR LA HORA DEL LADO IZQUIERDO
Dim timer As Word
; INICIALIZAR VARIABLES
Hour = 0
Minute = 0
Second = 0
Ticks = 0
MIN_DER = 0
MIN_IZQ = 0
HRS_DER = 0
HRS_IZQ = 0
OPTION_REG = 1 ; prescaler = 2
On_Hardware_Interrupt GoTo Isr ; IR A RUTINA ISR
INTCON = $A0
;INICIO DEL PROGRAMA
Do
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTÓN HORA CUANDO ES ACCIONADO
If Hrs_button = 0 And timer = 0 Then
timer = 500
Inc Hour
If Hour = 24 Then Hour = 0
EndIf
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
If Mins_button = 0 And timer = 0 Then
timer = 500
Inc Minute
If Minute = 60 Then Minute = 0
EndIf
If hab = 1 Then
PORTB=$0f
Select Case Disp
Case 0
MIN_DER = Dig Minute,0
PORTB=MIN_DER
PORTB=PORTB|$80
Case 1
MIN_IZQ = Dig Minute,1
PORTB=MIN_IZQ
PORTB=PORTB|$40
Case 2
HRS_DER = Dig Hour,0
PORTB=HRS_DER
PORTB=PORTB|$20
Case 3
HRS_IZQ = Dig Hour,1
PORTB=HRS_IZQ
PORTB=PORTB|$10
End Select
Inc Disp
Disp = Disp & 3
hab = 0
EndIf
Loop
;RUTINA PARA EJECUCION DE UN SEGUNDO
Isr:
Context Save
If hab = 0 Then hab = 1
If timer>0 Then Dec timer
Inc Ticks
If Ticks < 61 Then NoUpdate
;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS
Ticks = 0
Inc Second
If Second = 60 Then
Second = 0
Inc Minute
If Minute = 60 Then
Minute = 0
Inc Hour
If Hour = 24 Then
Hour = 0
EndIf
EndIf
EndIf
; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
INTCON.2 = 0
Context Restore
End