📄 up down conter.bas
字号:
' S.E. Timer, improved version
' author Jure Mikeln, December 2000
' S.E. Timer can countdown from 1-99 seconds
' 1-99 minutes or 1-99 hours
' Timer has 4+1 press buttons, UP, DOWN, MODE, START + RESET
' UP, DOWN set time that we want to count down
' MODE selects the unit (sec., min. or hours) that we want to
' count down. Once we set time, set MODE, we can start countdown
' sequence. After countdown the relay turns on. To restart Timer,
' we must press RESET button.
' In the countdown mode no buttons except RESET are active.
' PCBs for Timer are available from: stik@svet-el.si
' or www.svet-el.si/english
Dim Clock As Byte , Stevec As Byte , Segmenti As Byte , X As Byte , P15 As Bit , P16 As Bit , P17 As Bit
Dim Clock12 As Word , Stevec1 As Bit , Stevec2 As Byte , Mux As Byte , Prikaz As Bit
Dim T1 As Bit , T2 As Bit , T3 As Bit
Dim Clock1 As Byte , Mod1 As Byte
Dim Izracun As Bit , Pomozna_v As Byte , Enice As Byte , Desetice As Byte , Minute As Word , Ure As Word
' SEGMENTS ARE AT P1.1 to P1.7
' P1.6 flashes with respect Timer MODE
' Mod=1=>sec =>P1.6 flashes quickly, Mod=2=>min =>P1.6 flashes slowly,
' Mod=3=>ure =>P1.6 glows constantly
Config Timer0 = Timer , Gate = Internal , Mode = 2
Config Debounce = 10
'Gate = Internal
'Mode = 2 8 bit auto reaload
Enable Interrupts
Enable Timer0
Load Timer0 , 250
Start Timer0
'initial settings
Clock = 0
Stevec = 0
T1 = P3.0 ' UP button
T2 = P3.2 ' DOWN button
T3 = P3.1 ' MODE button
'P3.0 and P3.1 together ' START button, see schematics
P16 = 1
P15 = 0
Mod1 = 1
P3.7 = 0
Reset Segmenti
Minute = 0
Clock12 = 0
Ure = 0
On Timer0 Timer_0_int
'------------------------------------------------------------------
'Main program
Do
T3 = P3.1
T1 = P3.0
T2 = P3.2
If Mod1 = 1 Then
P1.6 = P15
End If 'P1.6 flashes quickly (seconds)
If Mod1 = 2 Then
P1.6 = P16 'P1.6 flashes slowly (minutes)
End If
If Mod1 = 3 Then
P1.6 = 0 'P1.6 glows constantly (hours)
End If
Gosub Tipke
Gosub Izracun1
Loop
End
'------------------------------------------------------------------
'Interrupt routine
Timer_0_int:
Incr Clock12
If Clock12 > 4000 Then
Clock12 = 0
P16 = Not P16 'one second pulse
P17 = Not P17 'seconds indication
End If
Incr Clock
If Clock > 19 Then 'each 5 mS change of MUX-a
Clock = 0
Incr Mux
If Mux > 3 Then
Mux = 0
End If
Prikaz = 1
Incr Clock1
If Clock1 > 29 Then
Clock1 = 0
P15 = Not P15 'LED flashes every 150mSec.
End If
End If
Return
'------------------------------------------------------------------
'Press buttons routine
Tipke:
If Mux > 2 Then 'this prevents turning LED display off when buttons are pressed
Debounce T1 , 0 , Stevec1 , Sub 'UP
Debounce T2 , 0 , Stevec , Sub 'DOWN
Debounce T3 , 0 , Mod , Sub 'MODE
End If
Return
'------------------------------------------------------------------
'Decrement variable Stevec
Stevec:
If Stevec > 0 Then
Decr Stevec
If Stevec = 255 Then
Stevec = 99
End If
End If
Return
'------------------------------------------------------------------
'Increment variable Stevec
Stevec1:
If T3 = 0 Then 'start countdown
Gosub Odstej1 'go to sub for decrementing
Return
End If
Incr Stevec
If Stevec > 99 Then 'prevent Stevec to increment over 99
Stevec = 0
End If
Return
'------------------------------------------------------------------
'MODE select routine
'Mod1=1 seconds, Mod1=2 minutes, Mod1=3 hours
Mod:
Incr Mod1
If Mod1 > 3 Then
Mod1 = 1
End If
Return
'------------------------------------------------------------------
'Routine that calculates tenths & units
Izracun1:
Desetice = Stevec / 10
Pomozna_v = Desetice * 10
Enice = Stevec - Pomozna_v
If Prikaz = 1 Then
Prikaz = 0
P3.4 = 1
P3.5 = 1 'disable display
'disable display
If Mux = 0 Then
Pomozna_v = Enice 'show units
Gosub Prikaz1 'gosub for displaying
P3.5 = 0 'enable transistor for units
End If
If Mux = 1 Then
Pomozna_v = Desetice 'show tenths
Gosub Prikaz1 'gosub for displaying
P3.4 = 0 'enable transistor for tenths
End If
End If
Return
'------------------------------------------------------------------
'Displaying routine
Prikaz1:
Restore Tabela
For X = 0 To 9
Read Segmenti
If X = Pomozna_v Then 'if X = value to display
P1 = Segmenti 'then set this value to Port1
Exit For 'and exit FOR loop
End If
Next
Return
'---- data for LED display ------
Tabela:
Data 96 , 249 , 196 , 208 , 89 , 82 , 66 , 248 , 64 , 80
'------------------------------------------------------------------
'Routine that decrements preset time
Odstej1:
Clock12 = 0 'reset timer variable
P16 = 1
Do
If Stevec > 0 Then 'condition that prevents decr. below zero
Gosub Ure_sub 'gosub hours
Gosub Minute_sub 'gosub minutes
Gosub Sekunde_sub 'gosub seconds
Else
Exit Do 'it does not decrement if Stevec=0
End If
Loop
Return
'------------------------------------------------------------------
'Routine for minutes decrement
Minute_sub:
If Mod1 = 2 Then 'check if Timer is in minutes MODE
Do
P1.6 = P17 'signalization that it's minutes
Min1:
If P16 = 0 Then 'wait until P16 changes it's state (every second)
P16 = Not P16
Incr Minute 'incr Minutes variable
If Minute > 59 Then 'if minutes > 59 then
Minute = 0
Decr Stevec 'decr variable Stevec every 60 sec
If Stevec = 1 Then
Stevec = 60
Mod1 = 1
Return
End If
If Stevec = 0 Then
P3.7 = 1 'turn on relay
P3.4 = 0 'both displays are on
P3.5 = 0
P1 = 96 'display "0" on display
Stop
End If
End If
End If
Gosub Izracun1 'display value of Stevec variable
Loop
End If
Return
'------------------------------------------------------------------
'Routine that decrements preset hours
Ure_sub:
If Mod1 = 3 Then 'check if Timer is in hours MODE
Do
P1.6 = 0 'signalization of Hours MODE
If P16 = 0 Then 'wait until P16 changes it's state (every second)
P16 = Not P16
Incr Ure
If Ure > 3599 Then
Ure = 0
Decr Stevec 'decrement Stevec variable every 3600 seconds
If Stevec = 1 Then 'when Stevec=1,
Stevec = 60 'Set Stevec=60 and decrement minutes
Mod1 = 2 'Set Mod1 to minutes MODE
Return
End If
If Stevec = 0 Then
P3.7 = 1 'turn on relay
P3.4 = 0 'both displays are on
P3.5 = 0
P1 = 96 'display number "0"
Stop
End If
End If
End If
Gosub Izracun1 'display value of Stevec variable
Loop
End If
Return
'------------------------------------------------------------------
'Routine for Seconds decrementing
Sekunde_sub:
Do
If Mod1 = 1 Then
If P16 = 0 Then 'wait until P16 changes it's state (every second)
P16 = Not P16
Decr Stevec 'Decrement variable Stevec for 1
If Stevec = 0 Then
P3.7 = 1 'turn on relay
P3.4 = 0 'both displays are on
P3.5 = 0
P1 = 96 'display number "0"
Stop
End If
End If
End If
Gosub Izracun1 ''display value of Stevec variable
Loop
Return
'------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -