Startseite › Foren › LED-Nixie-Clock › No-nonsense-LedNixie
- Dieses Thema hat 2 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 5 Jahre, 9 Monaten von Martin de Widt.
-
AutorBeiträge
-
15. August 2018 um 20:13 #1352Martin de WidtTeilnehmer
Hello fellow forum users,
I have been fooling around with Ledbasic lately in an attempt to master this new Basic dialect.
I have created a program for the Cronios-1 LedNixie clock.
I have left out all fancy effects. It’s just a configurable clock with time and date display. No eye popping busy effects whatsoever.
I added an option to unattendedly correct the time at 3.15 in the night with -99 to +99 seconds.
It’s version 0.99 and I do not claim that this program is flawless.
If you want … try it out. Comments are welcome of course.### L60 CGRB P1 S2 M92 F80
‚********************************************************************************
‚SIMPLE NO-FANCY-STUFF LED-NIXIE CLOCK/CALENDAR BY MARTIN DE WIDT – V.0.99
‚********************************************************************************
‚VARIABLE USAGE:
‚A=DISPLAY MODE N=TEMPORARY
‚B=BRIGHTNESS USER O=TEMPORARY
‚C=TEMPORARY P=TEMPORARY
‚D=TEMPORARY Q=TEMPORARY
‚E=CALCULATED BRIGHTNESS R=TEMPORARY
‚F=TIME DISPLAY COLOUR USER S=TEMPORARY
‚G=DATE DISPLAY COLOUR USER T=START DIGIT OF DISPLAY
‚H=TEMPORARY U=TEMPORARY
‚I=TEMPORARY V=TEMPORARY
‚J=TEMPORARY W=VALUE TO DISPLAY
‚K=TEMPORARY X=ENCODER KEY VALUE
‚L=LAST KNOWN ENCODER VALUE Y=ENCODER CURRENT VALUE
‚M=TEMPORARY Z=BLANK THE DISPLAY SWITCH
‚********************************************************************************
‚EEPROM SETTINGS (DEFAULTS IN LAST BRACKETS:
‚1: BRIGHTNESS (0=AUTO, 1..9 USER)(5)
‚2: PREFERRED COLOUR FOR TIME DISPLAY (0..9 SEE SETTINGS FOR COLOURS)(2=ORANGE)
‚3: PREFERRED COLOUR FOR DATE DISPLAY (0..9 SEE SETTINGS FOR COLOURS)(7=BLUE)
‚4: AUTOMATIC DATE DISPLAY EVERY MINUTE AT XX.XX.45 (0=NO / 1=YES)(1=ON)
‚5: HOURLY CHIME (0=NO / 1=YES)(0=OFF)
‚6: TIME CORRECTION IN SECONDS PER 24 HOURS (00..99)(0)
‚7: TIME CORRECTION -/+ (0=CLOCK BACKWARD / 1=CLOCK FORWARD)(0)
‚
‚AT STARTUP OF THE CLOCK THE SOFTWARE VERSION WILL BE DISPLAYED FOR SOME SECONDS.
‚DURING THE VERSION DISPLAY KEEPING THE ENCODER KEY PRESSED UNTIL A BEEP-BEEP
‚SIGNAL WILL RESET ALL EEPROM VALUES TO THEIR DEFAULTS.
‚********************************************************************************
‚SETTINGS MENU:
‚0: BACK TO TIME DISPLAY (THE ONLY WAY OUT !)
‚1: SET THE TIME – SHORT PRESS DISPLAYS THE TIME – EVERY NEXT SHORT PRESS CYCLES
‚ THROUGH HOURS – MINUTES – SECONDS – MENU OPTION 1. ROTATE TO CHANGE
‚ LONG PRESS SAVES THE DISPLAYED TIME.
‚2: SET THE DATE – SHORT PRESS DISPLAYS THE DATE – EVERY NEXT SHORT PRESS CYCLES
‚ THROUGH DAY – MONTH – YEAR – MENU OPTION 2. ROTATE TO CHANGE
‚ LONG PRESS SAVES THE DISPLAYED DATE.
‚3: BRIGHTNESS LEVEL – SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO CHANGE.
‚ LONG PRESS SAVES THE DISPLAYED SETTING. 0=AUTO, 1=DIM … 9=BRIGHT
‚4: PREFERRED COLOUR FOR TIME DISPLAY – SHORT PRESS DISPLAYS CURRENT SETTING.
‚ ROTATE TO CHANGE. LONG PRESS SAVES THE DISPLAYED SETTING.
‚ 0=WHITE, 1=RED, 2=ORANGE, 3=YELLOW, 4=GREEN, 5=AQUA
‚ 6=CYAN, 7=BLUE, 8=MAGENTA, 9=RAINBOWING COLOURS
‚5: PREFERRED COLOUR FOR DATE DISPLAY – SHORT PRESS DISPLAYS CURRENT SETTING.
‚ ROTATE TO CHANGE. LONG PRESS SAVES THE DISPLAYED SETTING.
‚ 0=WHITE, 1=RED, 2=ORANGE, 3=YELLOW, 4=GREEN, 5=AQUA
‚ 6=CYAN, 7=BLUE, 8=MAGENTA, 9=RAINBOWING COLOURS
‚6: AUTOMATIC DATE DISPLAY – SHORT PRESS DISPLAYS CURRENT SETTING.
‚ ROTATE TO CHANGE. LONG PRESS SAVES DISPLAYED SETTING.
‚7: HOURLY CHIME – SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO CHANGE.
‚ LONG PRESS SAVES DISPLAYED SETTING. 0=NO, 1=YES
‚8: DAILY TIME CORRECTION – SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO
‚ CHANGE. LONG PRESS SAVES DISPLAYED SETTING. 0…99 SECONDS/24 HOURS
‚9: DAILY TIME CORRECTION +/-. SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO
‚ CHANGE. LONG PRESS SAVES DISPLAYED SETTING. 0=CLOCK BACKWARD, 1=CLOCK FORWARD‚SETTINGS MENU IS INVOKED BY LONG PRESS DURING TIME OR DATE DISPLAY.
‚********************************************************************************‚********************************************************************************
‚DATA FOR DIGIT ORDER
‚********************************************************************************
10:
data 5,0,6,1,7,2,8,3,9,4‚********************************************************************************
‚DATA FOR COLOUR INDEX H-VALUE
‚********************************************************************************
20:
data 0,5,30,120,150,180,240,300100:
‚********************************************************************************
‚INITIALIZE CLOCK
‚********************************************************************************
gosub 32000 ‚INITIALIZATION
gosub 26000 ‚LOAD IHSV INDEX
gosub 25000 ‚DISPLAY VERSION NUMBER‚********************************************************************************
‚MAIN PROGRAM LOOP
‚********************************************************************************
200: ‚DISPLAY THE TIME
IO.setenc(f,9,0) ‚ENCODER ON 0..9 PRESET TIME COLOUR
a=0 ‚MODE TIME DISPLAY
c=0 ‚NOT IN CONFIG MODE
x=0 ‚ENCODER KEYPRESS RESET
gosub 20000 ‚DISPLAY THE TIME
if j=0 and k=0 then gosub 22400 ‚SOUND THE CHIME AT xx.00.00
if i=3 and j=15 and k=0 then gosub 9000 ‚CHECK IF THE TIME NEEDS CORRECTION AT 3:15
if k=45 then gosub 8000 ‚CHECK IF THE DATE SHOULD DISPLAY
if k%30=0 and b=0 then gosub 26000 ‚IF AUTO BRIGHTNESS ON RECALC EVERY 30 SECS
if x=0 goto 200 ‚NO KEYPRESS
if x=1 goto 300 ‚SHORT KEYPRESS – CHANGE TO DATE DISPLAY
u=1 ‚ENCODER PRESET ON 1
if x=2 goto 10000 ‚LONG KEYPRESS – GOTO CONFIGURATION300: ‚DISPLAY THE DATE
IO.setenc(g,9,0) ‚ENCODER ON 0..9 PRESET DATE COLOUR
a=1 ‚MODE DATE DISPLAY
c=0 ‚NOT IN CONFIG MODE
x=0 ‚ENCODER KEYPRESS RESET
gosub 21000 ‚DISPLAY THE DATE
if x=0 goto 300 ‚NO KEYPRESS
if x=1 goto 200 ‚SHORT KEYPRESS – GOTO TIME DISPLAY
u=1 ‚ENCODER PRESET ON 2
if x=2 goto 10000 ‚LONG KEYPRESS = GOTO CONFIGURATION‚********************************************************************************
‚CHECK IF DATE NEEDS TO BE DISPLAYED
‚********************************************************************************
8000:
if (IO.eeread(4))=0 then return ‚CONFIG SAYS NO SO RETURN
a=1 ‚MODE DATE DISPLAY
c=4 ‚TO INDICATE ONE TIME DATE DISPLAY
x=0 ‚ENCODER KEYPRESS RESET
gosub 21000 ‚DISPLAY THE DATE
delay 3000 ‚FOR THREE SECONDS
a=0 ‚MODE TIME DISPLAY
c=0 ‚NOT IN CONFIG MODE
return ‚EXIT‚********************************************************************************
‚CHECK IF TIME NEEDS TO BE CORRECTED AT 03:15
‚********************************************************************************
9000:
if (IO.eeread(15))=1 then goto 9500 ‚IN CASE NEG.CORRECTION HAS JUST BEEN DONE
h=(IO.eeread(6)) ‚NUMBER OF SECS/24 HRS TO CORRECT
if h=0 then return ‚0 MEANS NO CORRECTION NECESSARY
z=(IO.eeread(7)) ‚SIGN 0=MINUS / 1=PLUS
if z=0 goto 9100 ‚IF MINUS CORRECTION SKIP
k=k+h ‚BECOMES MAX. 99
if k>59 then j=j+1 ‚IF MORE THAN 60 SECS INCREASE MINUTE
if k>59 then k=k-60 ‚IF MORE THAN 60 SECS SUBTRACT THE 60 SECS
IO.setrtc(2,i) ‚WRITE HOURS TO RTC
IO.setrtc(1,j) ‚WRITE MINUTES TO RTC
IO.setrtc(0,k) ‚WRITE SECONDS TO RTC
return ‚DONE
9100:
k=k-h ‚SUBTRACT CORRECTION SECONDS FROM CURRENT
if k<-60 then j=j-2 else j=j-1 ‚IF > 1 MIN. CORRECT MINUTES BY 2 ELSE BY 1
if k<-60 then k=k+60 ‚AND BRING SECONDS BETWEEN 0 AND 59
k=60+k ‚CALCULATE NEW SECONDS VALUE
IO.setrtc(2,i) ‚WRITE HOURS TO RTC
IO.setrtc(1,j) ‚WRITE MINUTES TO RTC
IO.setrtc(0,k) ‚WRITE SECONDS TO RTC
IO.eewrite(15,1) ‚TEMP. FLAG THAT CORRECTION HAS BEEN DONE
return ‚DONE
9500:
IO.eewrite(15,0) ‚REMOVE TEMP.VAR INDICATOR CORRECTION DONE
delay 1000 ‚PAUSE A SECOND SO 03:15:00 CAN’T REAPPEAR
return ‚DONE‚********************************************************************************
‚CONFIGURATION MENU AFTER LONG PRESS DURING TIME / DATE DISPLAY
‚********************************************************************************
10000: ‚DISPLAY MENU CHOICE 0..9 AS 1ST DIGIT
c=0 ‚NOT (YET) IN CONFIG MODE HERE
x=0 ‚ENCODER KEY RESET
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=0 ‚1ST DIGIT
v=0 ‚ENCODER MIN. VALUE
w=9 ‚ENCODER MAX. VALUE
z=1 ‚BLANK THE DISPLAY
gosub 30000 ‚READ AND DISPLAY ENCODER
if y=0 goto 200 ‚BACK TO TIME DISPLAY
if y=1 goto 11000 ‚ÇONFIG TIME
if y=2 goto 12000 ‚CONFIG DATE
if y=3 goto 13000 ‚CONFIG USER BRIGHTNESS LEVEL
if y=4 goto 14000 ‚CONFIG PREFERRED COLOUR FOR TIME DISPLAY
if y=5 goto 15000 ‚CONFIG PREFERRED COLOUR FOR DATE DISPLAY
if y=6 goto 16000 ‚CONFIG AUTOMATIC DATE DISPLAY
if y=7 goto 17000 ‚CONFIG HOURLY CHIME
if y=8 goto 18000 ‚CONFIG DAILY SECONDS TIME CORRECTION
if y=9 goto 19000 ‚CONFIG DAILY SECONDS CORRECTION +/-‚*******************************************************************************
‚CONFIG ITEM 1 – SET THE TIME
‚*******************************************************************************
11000:
IO.setenc(f,9,0) ‚ENCODER FROM 0..9 PRESET DATE COLOUR
a=0 ‚DISPLAY TIME MODE
x=0 ‚RESET ENCODER KEY
gosub 20000 ‚DISPLAY CURRENT TIME
c=1 ‚IN CONFIG MODE
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=0 ‚1ST DIGIT
u=i ‚ENCODER PRESET VALUE (HOURS)
v=0 ‚ENCODER MIN. VALUE
w=23 ‚ENCODER MAX. VALUE
z=0 ‚DON’T BLANK THE DISPLAY
l=i ‚LAST ENCODER VALUE (HOURS)
gosub 30000 ‚READ AND EVALUATE ENCODER
i=y ‚SET HOURS TO ENCODER VALUE
gosub 20000 ‚REDISPLAY THE TIME
if x=2 goto 11900 ‚LONG KEYPRESS
t=2 ‚3RD DIGIT
u=j ‚ENCODER PRESET VALUE (MINUTES)
w=59 ‚ENCODER MAX. VALUE
l=j ‚LAST ENCODER VALUE (MINUTES)
gosub 30000 ‚READ AND EVALUATE ENCODER
j=y ‚SET MINUTES TO ENCODER VALUE
gosub 20000 ‚REDISPLAY THE TIME
if x=2 goto 11900 ‚LONG KEYPRESS
t=4 ‚5TH DIGIT
u=k ‚ENCODER PRESET VALUE (SECONDS)
w=59 ‚ENCODER MAX. VALUE
l=k ‚LAST ENCODER VALUE (SECONDS)
gosub 30000 ‚READ AND EVALUATE ENCODER
k=y ‚SET SECONDS TO ENCODER VALUE
gosub 20000 ‚REDISPLAY THE TIME
if x=2 goto 11900 ‚LONG KEYPRESS
u=1 ‚ENCODER PRESET BACK TO 1
goto 10000 ‚SHORT KEYPRESS SO BACK TO MENU11900: ‚LONG KEYPRESS SO SAVE THE SET TIME
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
IO.setrtc(2,i) ‚SET RTC HOURS
IO.setrtc(1,j) ‚SET RTC MINUTES
IO.setrtc(0,k) ‚SET RTC SECONDS
u=1 ‚ENCODER PRESET BACK TO 1
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 2 – SET THE DATE
‚********************************************************************************
12000:
IO.setenc(g,9,0) ‚ENCODER FROM 0..9 PRESET DATE COLOUR
a=1 ‚MODE DATE DISPLAY
x=0 ‚RESET ENCODER KEY
gosub 21000 ‚DISPLAY CURRENT DATE
12100: ‚RE-ENTRY POINT IN CASE OF FAULTY DATE
c=1 ‚IN CONFIG MODE
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=0 ‚1ST DIGIT
u=i ‚ENCODER PRESET VALUE (DAY)
v=1 ‚ENCODER MIN. VALUE
w=31 ‚ENCODER MAX. VALUE
z=0 ‚DON’T BLANK THE DISPLAY
l=i ‚LAST ENCODER VALUE (DAY)
gosub 30000 ‚READ AND EVALUATE ENCODER
i=y ‚SET DAY TO ENCODER VALUE
gosub 21000 ‚REDISPLAY THE DATE
if x=2 goto 12900 ‚LONG KEYPRESS
t=2 ‚3RD DIGIT
u=j ‚ENCODER PRESET VALUE (MONTH)
w=12 ‚ENCODER MAX. VALUE
l=j ‚LAST ENCODER VALUE (MONTH)
gosub 30000 ‚READ AND EVALUATE ENCODER
j=y ‚SET MONTH TO ENCODER VALUE
gosub 21000 ‚REDISPLAY THE DATE
if x=2 goto 12900 ‚LONG KEYPRESS
t=4 ‚5TH DIGIT
u=k ‚ENCODER PRESET VALUE (YEAR)
w=99 ‚ENCODER MAX. VALUE
l=k ‚LAST ENCODER VALUE (YEAR)
gosub 30000 ‚READ AND EVALUATE ENCODER
k=y ‚SET YEAR TO ENCODER VALUE
gosub 21000 ‚REDISPLAY THE DATE
if x=2 goto 12900 ‚LONG KEYPRESS
u=2 ‚ENCODER PRESET BACK TO 2
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚SHORT KEYPRESS SO BACK TO MENU12900: ‚LONG KEYPRESS SO SAVE THE SET DATE
p=0 ‚TEMP.CHECK VAR. FOR DATE CORRECTNESS
h=k%4 ‚YEAR MODULUS 4 FOR LEAP YEAR CHECK
if h=0 and j=2 and i>29 then p=1 ‚LEAP YEAR AND FEBRUARI DAYS >29
if h<>0 and j=2 and i>28 then p=1 ‚NO LEAP YEAR AND FEBRUARI DAYS >28
if i>30 and j=4 then p=1 ’31 APRIL
if i>30 and j=6 then p=1 ’31 JUNE
if i>30 and j=9 then p=1 ’31 SEP
if i>30 and j=11 then p=1 ’31 NOV
if p=0 goto 12950 ‚IF NO P-FLAG SET DATE IS OK
gosub 22200 ‚LONG LOW BEEP TO INDICATE FAULTY DATE
goto 12100 ‚BACK TO RE-ENTRYPOINT, TRY AGAIN
12950:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
k=k+2000 ‚RESTORE FULL DATE INCL. CENTURY
IO.setrtc(3,i) ‚SET RTC DAY
IO.setrtc(4,j) ‚SET RTC MONTH
IO.setrtc(5,k) ‚SET RTC YEAR
u=2 ‚ENCODER PRESET BACK TO 2
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 3 – SET THE BRIGHTNESS LEVEL
‚********************************************************************************
13000:
IO.eewrite(11,b) ‚SAVE CURRENT BRIGHTNESS SETTING
a=3 ‚USED TEMP. TO INDICATE BRIGHTNESS CONFIG
c=1 ‚IN CONFIG MODE
x=0 ‚ENCODER KEY RESET
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=5 ‚6TH DIGIT
u=b ‚ENCODER PRESET VALUE
v=0 ‚ENCODER MIN. VALUE
w=9 ‚ENCODER MAX. VALUE
z=0 ‚DON’T BLANK DISPLAY
l=u ‚LAST ENCODER VALUE
gosub 30000 ‚READ AND EVALUATE ENCODER
if x=2 goto 13900 ‚LONG KEYPRESS SO GOTO SAVE
u=3 ‚ENCODER PRESET BACK TO 3
a=0 ‚DISPLAY MODE BACK TO TIME
b=(IO.eeread(11)) ‚RESTORE ORIGINAL BRIGHTNESS (NO SAVE)
gosub 26000 ‚REFILL IHSV INDEX WITH CORRECT BRIGHTNESS
goto 10000 ‚BACK TO MENU
13900:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
u=3 ‚ENDODER PRESET BACK TO 3
a=0 ‚DISPLAY MODE BACK TO TIME
IO.eewrite(1,b) ‚WRITE BACK BRIGHTNESS SETTING
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 4 – SET THE PREFERRED COLOUR FOR TIME DISPLAY
‚********************************************************************************
14000:
IO.eewrite(12,f) ‚SAVE CURRENT COLOUR TEMPORARILY
IO.setenc(f,9,0) ‚SET ENCODER 0..9 PRESET CURRENT COLOUR
a=0 ‚DISPLAY MODE TIME
x=0 ‚RESET ENCODER KEY
c=0 ‚PRETEND NOT TO BE IN CONFIG MODE
14100:
gosub 20000 ‚DISPLAY CURRENT TIME
if x=0 goto 14100 ‚NO KEYPRESS SO LOOP
if x=2 goto 14900 ‚LONG KEYPRESS SO SAVE
f=(IO.eeread(12)) ‚RESTORE ORIGINAL COLOUR (NO SAVE)
u=4 ‚ENCODER PRESET BACK TO 4
goto 10000 ‚BACK TO MENU
14900:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
u=4 ‚ENCODER PRESET BACK TO 4
IO.eewrite(2,f) ‚WRITE BACK TIME COLOUR
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 5 – SET THE PREFERRED COLOUR FOR DATE DISPLAY
‚********************************************************************************
15000:
IO.eewrite(13,g) ‚SAVE CURRENT COLOUR TEMPORARILY
IO.setenc(g,9,0) ‚SET ENCODER 0..9 PRESET CURRENT COLOUR
a=1 ‚DISPLAY MODE DATE
x=0 ‚RESET ENCODER KEY
c=0 ‚PRETEND NOT TO BE IN CONFIG MODE
15100:
gosub 21000 ‚DISPLAY CURRENT DATE
if x=0 goto 15100 ‚NO KEYPRESS SO LOOP
if x=2 goto 15900 ‚LONG KEYPRESS SO SAVE
g=(IO.eeread(13)) ‚RESTORE ORIGINAL COLOUR (NO SAVE)
u=5 ‚ENCODER PRESET BACK TO 5
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU
15900:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
u=5 ‚ENCODER PRESET BACK TO 5
IO.eewrite(3,g) ‚WRITE BACK DATE COLOUR
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 6 – SET AUTOMATIC DATE DISPLAY 0=NO / 1=YES
‚********************************************************************************
16000:
c=1 ‚IN CONFIG MODE
x=0 ‚ENCODER KEY RESET
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=5 ‚SIXTH DIGIT
u=d ‚ENCODER PRESET VALUE
v=0 ‚ENCODER MINIMUM VALUE
w=1 ‚ENCODER MAX. VALUE
z=0 ‚DON’T BLANK THE DISPLAY
l=d ‚LAST ENCODER VALUE
gosub 30000 ‚READ AND EVALUATE ENCODER
if x=2 goto 16900 ‚LONG KEYPRESS SO SAVE
u=6 ‚ENCODER PRESET BACK TO 6
goto 10000 ‚BACK TO MENU
16900:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
u=6 ‚ENCODER PRESET BACK TO 6
IO.eewrite(4,y) ‚WRITE BACK AUTO DATE DISPLAY
d=y ‚SET USER CONFIG VAR.
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 7 – SET HOURLY CHIME 0=NO / 1=YES
‚********************************************************************************
17000:
c=1 ‚IN CONFIG MODE
x=0 ‚ENCODER KEY RESET
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=5 ‚SIXTH DIGIT
u=(IO.eeread(5)) ‚ENCODER PRESET VALUE
v=0 ‚ENCODER MINIMUM VALUE
w=1 ‚ENCODER MAX. VALUE
z=0 ‚DON’T BLANK THE DISPLAY
l=u ‚LAST ENCODER VALUE
gosub 30000 ‚READ AND EVALUATE ENCODER
if x=2 goto 17900 ‚LONG KEYPRESS SO SAVE
u=7 ‚ENCODER PRESET BACK TO 7
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU
17900:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
u=7 ‚ENCODER PRESET BACK TO 7
IO.eewrite(5,y) ‚WRITE BACK HOURLY CHIME SETTING
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 8 – SET DAILY TIME CORRECTION 0..99 SECONDS
‚********************************************************************************
18000:
IO.eewrite(14,(IO.eeread(6))) ‚TEMPORARY SAVE CURRENT SETTING
c=1 ‚IN CONFIG MODE
x=0 ‚ENCODER KEY RESET
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=4 ‚FIFTH DIGIT
u=(IO.eeread(6)) ‚ENCODER PRESET VALUE
v=0 ‚ENCODER MINIMUM VALUE
w=99 ‚ENCODER MAX. VALUE
z=0 ‚DON’T BLANK THE DISPLAY
l=u ‚LAST ENCODER VALUE
gosub 30000 ‚READ AND EVALUATE ENCODER
if x=2 goto 18900 ‚LONG KEYPRESS SO SAVE
u=8 ‚ENCODER PRESET BACK TO 8
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU
18900:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
u=8 ‚ENCODER PRESET BACK TO 8
a=0 ‚TIME DISPLAY MODE
IO.eewrite(6,y) ‚WRITE BACK DAILY TIME CORRECTION SECONDS
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚CONFIG ITEM 9 – SET DAILY TIME CORRECTION SIGN 0=MINUS / 1=PLUS
‚********************************************************************************
19000:
c=1 ‚IN CONFIG MODE
x=0 ‚ENCODER KEY RESET
r=1 ‚BLINK DISPLAY
s=7 ‚COLOUR BLUE
t=5 ‚SIXTH DIGIT
u=(IO.eeread(7)) ‚ENCODER PRESET VALUE
v=0 ‚ENCODER MINIMUM VALUE
w=1 ‚ENCODER MAX. VALUE
z=0 ‚DON’T BLANK THE DISPLAY
l=u ‚LAST ENCODER VALUE
gosub 30000 ‚READ AND EVALUATE ENCODER
if x=2 goto 19900 ‚LONG KEYPRESS SO SAVE
u=9 ‚ENCODER PRESET BACK TO 9
a=0 ‚TIME DISPLAY MODE
goto 10000 ‚BACK TO MENU
19900:
gosub 22000 ‚THREE SHORT BEEPS TO ACKNOWLEDGE SAVE
u=9 ‚ENCODER PRESET BACK TO 9
a=0 ‚TIME DISPLAY MODE
IO.eewrite(7,y) ‚WRITE BACK TIME CORRECTION SIGN
goto 10000 ‚BACK TO MENU‚********************************************************************************
‚DISPLAY THE FULL TIME
‚********************************************************************************
20000:
if c=1 goto 20010 ‚IF IN CONFIG MODE DON’T RE-READ THE TIME
i=IO.getrtc(2) ‚GET HOURS FROM RTC
j=IO.getrtc(1) ‚GET MINUTES FROM RTC
k=IO.getrtc(0) ‚GET SECONDS FROM RTC
20010:
t=0 ‚FIRST DIGIT
w=i/10 ‚TENS OF HOURS
gosub 28000 ‚DISPLAY THIS
t=1 ‚SECOND DIGIT
w=i%10 ‚ONES OF HOURS
gosub 28000 ‚DISPLAY THIS
t=2 ‚THIRD DIGIT
w=j/10 ‚TENS OF MINUTES
gosub 28000 ‚DISPLAY THIS
t=3 ‚FOURTH DIGIT
w=j%10 ‚ONES OF MINUTES
gosub 28000 ‚DISPLAY THIS
t=4 ‚FIFTH DIGIT
w=k/10 ‚TENS OF SECONDS
gosub 28000 ‚DISPLAY THIS
t=5 ‚SIXTH DIGIT
w=k%10 ‚ONES OF SECONDS
gosub 28000 ‚DISPLAY THIS
return‚********************************************************************************
‚DISPLAY THE FULL DATE
‚********************************************************************************
21000:
if c=1 goto 21010 ‚IF IN CONFIG MODE DON’T RE-READ THE TIME
i=IO.getrtc(3) ‚GET DAY FROM RTC
j=IO.getrtc(4) ‚GET MONTH FROM RTC
k=IO.getrtc(5) ‚GET YEAR FROM RTC
k=k%100 ‚GET RID OF CENTURY
21010:
t=0 ‚FIRST DIGIT
w=i/10 ‚TENS OF DAY
gosub 28000 ‚DISPLAY THIS
t=1 ‚SECOND DIGIT
w=i%10 ‚ONES OF DAY
gosub 28000 ‚DISPLAY THIS
t=2 ‚THIRD DIGIT
w=j/10 ‚TENS OF MONTH
gosub 28000 ‚DISPLAY THIS
t=3 ‚FOURTH DIGIT
w=j%10 ‚ONES OF MONTH
gosub 28000 ‚DISPLAY THIS
t=4 ‚FIFTH DIGIT
w=k/10 ‚TENS OF YEAR
gosub 28000 ‚DISPLAY THIS
t=5 ‚SIXTH DIGIT
w=k%10 ‚ONES OF YEAR
gosub 28000 ‚DISPLAY THIS
return‚********************************************************************************
‚THREE SHORT ACKNOWLEDGMENT BEEPS
‚********************************************************************************
22000:
for q=1 to 3 ‚THREE TIMES
IO.beep(26) ‚LOW BEEP
delay 50 ‚FOR 50 ms
IO.beep(0) ‚BEEP OFF
delay 50 ‚FOR 50 ms
next q ‚LOOP
return ‚EXIT‚********************************************************************************
‚ONE LONG LOW FREQUENCY BEEP TO INDICATE ERROR ENTRY
‚********************************************************************************
22200:
IO.beep(300) ‚LONG HIGH BEEP
delay 500 ‚FOR 0,5 SECONDS
IO.beep(0) ‚BEEP OFF
return‚********************************************************************************
‚CHIME MELODY
‚********************************************************************************
22400:
IO.beep(659) ‚PLAYES BIG BEN MELODY
delay 650
IO.beep(523)
delay 650
IO.beep(587)
delay 650
IO.beep(392)
delay 900
IO.beep(0)
delay 400
IO.beep(392)
delay 650
IO.beep(597)
delay 650
IO.beep(659)
delay 650
IO.beep(523)
delay(1000)
IO.beep(0)
return‚********************************************************************************
‚DISPLAY VERSION
‚********************************************************************************
25000:
LED.blackout() ‚DISPLAY OFF
LED.iled(7,15) ‚0
LED.iled(7,34) ‚9
LED.iled(7,44) ‚9
LED.show() ‚DISPLAY ON
delay 2000 ‚2 SECONDS TO PRESS THE KEY
j=IO.getkey() ‚CHECK FOR KEYPRESS
if j>0 gosub 32050 else return ‚KEY PRESSED SO RESET EEPROM
IO.beep(1) ‚BEEP-BEEP THAT INDICATES EEPROM RESET
delay 75
IO.beep(29)
delay 100
IO.beep(0) ‚BEEP OFF
return ‚DONE‚********************************************************************************
‚FILL THE IHSV-INDEX
‚0=WHITE, 1=RED, 2=ORANGE, 3=YELLOW, 4=GREEN, 5=AQUA
‚6=CYAN, 7=BLUE, 8=MAGENTA, 9=RAINBOW EFFECT
‚********************************************************************************
26000:
gosub 27500 ‚CALCULATE BRIGHTNESS (V-VALUE OF HSV)
LED.ihsv(0, 0, 0, 128) ‚WHITE
for j = 1 to 8 ‚INDEX 1..8 (9 RESERVED FOR RAINBOw)
i = read 20, j-1 ‚READ COLOUR H-VALUE
LED.ihsv(j, i, 255, e) ‚SET COLOUR ARRAY
next j ‚LOOP
return ‚EXIT‚********************************************************************************
‚CALCULATE V-VALUE FOR HSV COLOR IN CASE OF AUTO BRIGHTNESS
‚RETURNS E AS V-VALUE
‚********************************************************************************
27500:
if b > 0 then goto 27600 ‚IF NOT AUTO BRIGHTNESS SKIP
e = IO.getldr()+10 ‚READ LDR VALUE WITH MIN. OF TEN
return ‚DONE27600:
e = b*26+10 ‚GOES FROM 36 TO 244 DEPENDING ON SETTING
return ‚DONE‚********************************************************************************
‚DISPLAY ROUTINE FOR TIME/DATE ETC.
‚RETURNS X=KEY ENCODER VALUE (1=SHORT/2=LONG), Y=ENCODER VALUE
‚ON ENTRY PARAMETERS T,W MUST BE SET
‚T=DIGIT (0..5), W=VALUE TO DISPLAY (0..9)
‚********************************************************************************
28000:
if a=0 then l=f else l=g
if c=1 or c=4 goto 29050 ‚IF IN CONFIG MODE NO ENCODER EVALUATION
y=IO.getenc() ‚GET WHEEL VALUE
if y=l then goto 28100 ‚IF EQUAL TO LAST KNOWN VALUE SKIP
if a=0 then f=y else g=y ‚WHEEL TURNED, SET NEW COLOUR FOR TIME/DATE
l=y ‚SET LAST KNOWN WHEEL VALUE
goto 2900028100:
q=IO.getkey() ‚READ ENCODER KEY
if q=0 goto 29000 ‚NO KEYPRESS AND SKIP
o=0 ‚INITIALIZE TEMP.COUNTER28200:
q=IO.keystate() ‚READ ENCODER KEYSTATE
if q=0 then x=1 ‚SHORT KEYPRESS SET X TO 1
if q=0 goto 29000 ‚AND SKIP
delay 10 ’10 ms DELAY
o=o+1 ‚INCREASE TEMP.COUNTER
if o<30 goto 28200 ‚NOT YET 300 ms ? THEN SKIP BACK
x=2 ‚LONG KEYPRESS SET X TO 229000:
if x=0 goto 29050 ‚X STILL ZERO (NO KEYPRESSES)’THEN SKIP ON
return ‚KEY WAS PRESSED SO RETURN29050:
for q=0 to 9 ‚LOOP 10 TIMES
LED.lrgb(t*10+q,0,0,0) ‚SET APPROPRIATE LED TO BLACK
next q ‚LOOP
if l<>9 goto 29060 ‚IF COLOUR IS NOT „RAINBOW“ SKIP ON
n=(m+(8*(50-(t*10))))%360 ‚CALCULATE SEMI-RANDOM COLOUR H-VALUE
LED.ihsv(9, n, 255, e) ‚SET THIS COLOUR IN COLOUR ARRAY 929060:
o=read 10,w ‚READ APPROPRIATE LED INDEX
LED.iled(l,t*10+o) ‚SET THIS LED TO COLOUR ‚L‘
LED.show() ‚SHOW DISPLAY
m=m+1 ‚INCREASE TEMP.COUNTER M
if m>32000 then m=0 ‚PREVENT OVERFLOW
return‚********************************************************************************
‚ENCODER/DISPLAY ROUTINE FOR CONFIGURATION
‚RETURNS X=KEY ENCODER VALUE (1=SHORT/2=LONG), Y=ENCODER VALUE
‚ON ENTRY PARAMETERS R,S,T,U,V,Z MUST BE SET
‚R=BLINK DISPLAY 0/1, S=COLOUR OF DISPLAY, T=START DIGIT
‚U=START VALUE ENCODER, V=MINIMUM VALUE ENCODER
‚W=MAXIMUM VALUE ENCODER, Z=BLANK DISPLAY 0/1
‚********************************************************************************
30000:
p=0 ‚P INDICATES NUMBER OF DIGITS -1
if w/10 > 0 then p=1 ‚2 DIGITS AT LEAST
if w/100 > 0 then p=2 ‚3 DIGITS AT LEAST
if w/1000 > 0 then p=3 ‚4 DIGITS AT LEAST
if w/10000 > 0 then p=4 ‚5 DIGITS
if z=1 then LED.blackout() ‚BLANK DISPLAY IF WANTED SO
IO.setenc(u-v,w-v,0) ‚ENCODER FROM STARTVALUE MINUS MIN.VALUE
‚BECAUSE ENCODER WILL START WITH 0
‚WILL BE RECTIFIED WHEN EXITING
m=0 ‚TEMP.COUNTER RESET
30050:
x=0 ‚KEYPRESS RESET
y=IO.getenc() ‚READ ENCODER WHEEL VALUE
if a<>3 goto 30100 ‚IF NOT CALLED FROM BRIGHTNESS CONFIG SKIP
if y=l goto 30100 ‚IF WHEEL VALUE EQUALS LAST KNOWN VALUE SKIP
b=y ‚SET BRIGHTNESS TO WHEEL VALUE
gosub 26000 ‚CALCULATE THE V-VALUE FOR COLOURS30100:
q=IO.getkey() ‚CHECK FOR KEYPRESS
if q=0 goto 31000 ‚NO KEYPRESS SO SKIP
o=0 ‚TEMP.COUNTER RESET
30200:
q=IO.keystate() ‚CHECK ENCODER KEYSTATE
if q=0 then x=1 ‚IT WAS A SHORT KEYPRESS, SET X TO 1
if q=0 goto 31000 ‚AND SKIP ON
delay 10 ‚DELAY FOR 10 ms
o=o+1 ‚INCREASE TEMP.COUNTER
if o<30 goto 30200 ‚IF NOT YET 300 ms SKIP BACK
x=2 ‚IT WAS A LONG KEYPRESS, SET X TO 2
31000:
if x=0 goto 31050 ‚IF NO KEYPRESS SKIP ON
if v>0 then y=y+v ‚RECTIFY THE RETURN WHEEL VALUE
LED.iled(s,n) ‚IN CASE KEY PRESS WAS DURING OFF PHASE
return ‚AND RETURN
31050:
if r=0 goto 31060 ‚IF NO BLINKING DISPLAY WANTED SKIP
if m % 25 < 8 goto 31100 ‚IF TEMP.COUNTER MODULO 15 < 10 SKIP ON
31060:
for q=t*10 to (t+p)*10+9 ‚LOOP FOR ALL INVOLVED LED INDICES
LED.lrgb(q,0,0,0) ‚PUT LED ON BLACK
next q ‚LOOP
if r=1 then LED.show() ‚IF BLINKING WANTED -> SHOW LEDS
31100:
if r=0 goto 31140 ‚IF NO BLINKING DISPLAY WANTED SKIP
if m % 25 > 7 goto 31150 ‚IF TEMP.COUNTER MODULO 15 > 9 SKIP ON
31140:
x=y+v ‚PUT X TO RECTIFIED ENCODER WHEEL VALUE
for q=t+p downto t ‚LOOP INVOLVED DIGITS BACKWARDS
o=x%10 ‚O = WHEEL VALUE MODULUS 10
n=read 10,o ‚READ CORRECT LED INDEX
LED.iled(s,q*10+n) ‚PUT THIS LED ON WANTED COLOUR
x=x/10 ‚LOOSE THE RIGHTMOST DIGIT OF WHEELVALUE
next q ‚LOOP
LED.show() ‚SHOW THE LEDS
31150:
m=m+1 ‚INCREASE TEMP.COUNTER
if m>32000 then m=0 ‚TO PREVENT OVERFLOW
goto 30050 ‚GO BACK‚********************************************************************************
‚PROGRAM START – INITIALIZATION
‚IF EEPROM LOCATION 0 DOES NOT CONTAIN THE VALUE 999 THEN WRITE DEFAULT VALUES
‚FOR EEPROM LOCATIONS 1 … 7 AND WRITE 999 AT LOCATION 0
‚********************************************************************************
32000:
if (IO.eeread(0)) = 999 then GOTO 32100 ‚EEPROM WAS ONCE CONFIGURED SO SKIP
32050: ‚ENTRY POINT FOR STARTUP RESET
IO.eewrite(0, 999) ‚INDICATOR THAT EEPROM WAS ONCE SET
IO.eewrite(1, 5) ‚BRIGHTNESS (5 OUT OF 9)
IO.eewrite(2, 2) ‚COLOR FOR TIME DISPLAY (ORANGE)
IO.eewrite(3, 7) ‚COLOR FOR DATE DISPLAY (BLUE)
IO.eewrite(4, 1) ‚AUTOMATIC DATE DISPLAY (ON)
IO.eewrite(5, 0) ‚HOURLY CHIME (OFF)
IO.eewrite(6, 0) ‚TIME CORRECTION PER 24 HRS (0)
IO.eewrite(7, 0) ‚TIME CORRECTION BACKw./FORW. (0)
delay 250 ‚DELAY A BIT‚********************************************************************************
‚READ SOME EEPROM LOCATIONS USER SETTINGS AND RESET TEMP.VARS
‚********************************************************************************
32100:
IO.eewrite(11,0) ‚RESET TEMP.VAR
IO.eewrite(12,0) ‚RESET TEMP.VAR
IO.eewrite(13,0) ‚RESET TEMP.VAR
IO.eewrite(14,0) ‚RESET TEMP.VAR
IO.eewrite(15,0) ‚RESET TEMP.VAR
b = IO.eeread(1) ‚BRIGHTNESS
f = IO.eeread(2) ‚PREFERRED COLOR FOR TIME
g = IO.eeread(3) ‚PREFERRED COLOR FOR DATE
return ‚DONERegards, Martin
15. August 2018 um 20:39 #1353Martin de WidtTeilnehmerOops, that code doesn’t look very well … here’s a new attempt
### L60 CGRB P1 S2 M92 F80 '******************************************************************************** 'SIMPLE NO-FANCY-STUFF LED-NIXIE CLOCK/CALENDAR BY MARTIN DE WIDT - V.0.99 '******************************************************************************** 'VARIABLE USAGE: 'A=DISPLAY MODE N=TEMPORARY 'B=BRIGHTNESS USER O=TEMPORARY 'C=TEMPORARY P=TEMPORARY 'D=TEMPORARY Q=TEMPORARY 'E=CALCULATED BRIGHTNESS R=TEMPORARY 'F=TIME DISPLAY COLOUR USER S=TEMPORARY 'G=DATE DISPLAY COLOUR USER T=START DIGIT OF DISPLAY 'H=TEMPORARY U=TEMPORARY 'I=TEMPORARY V=TEMPORARY 'J=TEMPORARY W=VALUE TO DISPLAY 'K=TEMPORARY X=ENCODER KEY VALUE 'L=LAST KNOWN ENCODER VALUE Y=ENCODER CURRENT VALUE 'M=TEMPORARY Z=BLANK THE DISPLAY SWITCH '******************************************************************************** 'EEPROM SETTINGS (DEFAULTS IN LAST BRACKETS: '1: BRIGHTNESS (0=AUTO, 1..9 USER)(5) '2: PREFERRED COLOUR FOR TIME DISPLAY (0..9 SEE SETTINGS FOR COLOURS)(2=ORANGE) '3: PREFERRED COLOUR FOR DATE DISPLAY (0..9 SEE SETTINGS FOR COLOURS)(7=BLUE) '4: AUTOMATIC DATE DISPLAY EVERY MINUTE AT XX.XX.45 (0=NO / 1=YES)(1=ON) '5: HOURLY CHIME (0=NO / 1=YES)(0=OFF) '6: TIME CORRECTION IN SECONDS PER 24 HOURS (00..99)(0) '7: TIME CORRECTION -/+ (0=CLOCK BACKWARD / 1=CLOCK FORWARD)(0) ' 'AT STARTUP OF THE CLOCK THE SOFTWARE VERSION WILL BE DISPLAYED FOR SOME SECONDS. 'DURING THE VERSION DISPLAY KEEPING THE ENCODER KEY PRESSED UNTIL A BEEP-BEEP 'SIGNAL WILL RESET ALL EEPROM VALUES TO THEIR DEFAULTS. '******************************************************************************** 'SETTINGS MENU: '0: BACK TO TIME DISPLAY (THE ONLY WAY OUT !) '1: SET THE TIME - SHORT PRESS DISPLAYS THE TIME - EVERY NEXT SHORT PRESS CYCLES ' THROUGH HOURS - MINUTES - SECONDS - MENU OPTION 1. ROTATE TO CHANGE ' LONG PRESS SAVES THE DISPLAYED TIME. '2: SET THE DATE - SHORT PRESS DISPLAYS THE DATE - EVERY NEXT SHORT PRESS CYCLES ' THROUGH DAY - MONTH - YEAR - MENU OPTION 2. ROTATE TO CHANGE ' LONG PRESS SAVES THE DISPLAYED DATE. '3: BRIGHTNESS LEVEL - SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO CHANGE. ' LONG PRESS SAVES THE DISPLAYED SETTING. 0=AUTO, 1=DIM ... 9=BRIGHT '4: PREFERRED COLOUR FOR TIME DISPLAY - SHORT PRESS DISPLAYS CURRENT SETTING. ' ROTATE TO CHANGE. LONG PRESS SAVES THE DISPLAYED SETTING. ' 0=WHITE, 1=RED, 2=ORANGE, 3=YELLOW, 4=GREEN, 5=AQUA ' 6=CYAN, 7=BLUE, 8=MAGENTA, 9=RAINBOWING COLOURS '5: PREFERRED COLOUR FOR DATE DISPLAY - SHORT PRESS DISPLAYS CURRENT SETTING. ' ROTATE TO CHANGE. LONG PRESS SAVES THE DISPLAYED SETTING. ' 0=WHITE, 1=RED, 2=ORANGE, 3=YELLOW, 4=GREEN, 5=AQUA ' 6=CYAN, 7=BLUE, 8=MAGENTA, 9=RAINBOWING COLOURS '6: AUTOMATIC DATE DISPLAY - SHORT PRESS DISPLAYS CURRENT SETTING. ' ROTATE TO CHANGE. LONG PRESS SAVES DISPLAYED SETTING. '7: HOURLY CHIME - SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO CHANGE. ' LONG PRESS SAVES DISPLAYED SETTING. 0=NO, 1=YES '8: DAILY TIME CORRECTION - SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO ' CHANGE. LONG PRESS SAVES DISPLAYED SETTING. 0...99 SECONDS/24 HOURS '9: DAILY TIME CORRECTION +/-. SHORT PRESS DISPLAYS CURRENT SETTING. ROTATE TO ' CHANGE. LONG PRESS SAVES DISPLAYED SETTING. 0=CLOCK BACKWARD, 1=CLOCK FORWARD 'SETTINGS MENU IS INVOKED BY LONG PRESS DURING TIME OR DATE DISPLAY. '******************************************************************************** '******************************************************************************** 'DATA FOR DIGIT ORDER '******************************************************************************** 10: data 5,0,6,1,7,2,8,3,9,4 '******************************************************************************** 'DATA FOR COLOUR INDEX H-VALUE '******************************************************************************** 20: data 0,5,30,120,150,180,240,300 100: '******************************************************************************** 'INITIALIZE CLOCK '******************************************************************************** gosub 32000 'INITIALIZATION gosub 26000 'LOAD IHSV INDEX gosub 25000 'DISPLAY VERSION NUMBER '******************************************************************************** 'MAIN PROGRAM LOOP '******************************************************************************** 200: 'DISPLAY THE TIME IO.setenc(f,9,0) 'ENCODER ON 0..9 PRESET TIME COLOUR a=0 'MODE TIME DISPLAY c=0 'NOT IN CONFIG MODE x=0 'ENCODER KEYPRESS RESET gosub 20000 'DISPLAY THE TIME if j=0 and k=0 then gosub 22400 'SOUND THE CHIME AT xx.00.00 if i=3 and j=15 and k=0 then gosub 9000 'CHECK IF THE TIME NEEDS CORRECTION AT 3:15 if k=45 then gosub 8000 'CHECK IF THE DATE SHOULD DISPLAY if k%30=0 and b=0 then gosub 26000 'IF AUTO BRIGHTNESS ON RECALC EVERY 30 SECS if x=0 goto 200 'NO KEYPRESS if x=1 goto 300 'SHORT KEYPRESS - CHANGE TO DATE DISPLAY u=1 'ENCODER PRESET ON 1 if x=2 goto 10000 'LONG KEYPRESS - GOTO CONFIGURATION 300: 'DISPLAY THE DATE IO.setenc(g,9,0) 'ENCODER ON 0..9 PRESET DATE COLOUR a=1 'MODE DATE DISPLAY c=0 'NOT IN CONFIG MODE x=0 'ENCODER KEYPRESS RESET gosub 21000 'DISPLAY THE DATE if x=0 goto 300 'NO KEYPRESS if x=1 goto 200 'SHORT KEYPRESS - GOTO TIME DISPLAY u=1 'ENCODER PRESET ON 2 if x=2 goto 10000 'LONG KEYPRESS = GOTO CONFIGURATION '******************************************************************************** 'CHECK IF DATE NEEDS TO BE DISPLAYED '******************************************************************************** 8000: if (IO.eeread(4))=0 then return 'CONFIG SAYS NO SO RETURN a=1 'MODE DATE DISPLAY c=4 'TO INDICATE ONE TIME DATE DISPLAY x=0 'ENCODER KEYPRESS RESET gosub 21000 'DISPLAY THE DATE delay 3000 'FOR THREE SECONDS a=0 'MODE TIME DISPLAY c=0 'NOT IN CONFIG MODE return 'EXIT '******************************************************************************** 'CHECK IF TIME NEEDS TO BE CORRECTED AT 03:15 '******************************************************************************** 9000: if (IO.eeread(15))=1 then goto 9500 'IN CASE NEG.CORRECTION HAS JUST BEEN DONE h=(IO.eeread(6)) 'NUMBER OF SECS/24 HRS TO CORRECT if h=0 then return '0 MEANS NO CORRECTION NECESSARY z=(IO.eeread(7)) 'SIGN 0=MINUS / 1=PLUS if z=0 goto 9100 'IF MINUS CORRECTION SKIP k=k+h 'BECOMES MAX. 99 if k>59 then j=j+1 'IF MORE THAN 60 SECS INCREASE MINUTE if k>59 then k=k-60 'IF MORE THAN 60 SECS SUBTRACT THE 60 SECS IO.setrtc(2,i) 'WRITE HOURS TO RTC IO.setrtc(1,j) 'WRITE MINUTES TO RTC IO.setrtc(0,k) 'WRITE SECONDS TO RTC return 'DONE 9100: k=k-h 'SUBTRACT CORRECTION SECONDS FROM CURRENT if k<-60 then j=j-2 else j=j-1 'IF > 1 MIN. CORRECT MINUTES BY 2 ELSE BY 1 if k<-60 then k=k+60 'AND BRING SECONDS BETWEEN 0 AND 59 k=60+k 'CALCULATE NEW SECONDS VALUE IO.setrtc(2,i) 'WRITE HOURS TO RTC IO.setrtc(1,j) 'WRITE MINUTES TO RTC IO.setrtc(0,k) 'WRITE SECONDS TO RTC IO.eewrite(15,1) 'TEMP. FLAG THAT CORRECTION HAS BEEN DONE return 'DONE 9500: IO.eewrite(15,0) 'REMOVE TEMP.VAR INDICATOR CORRECTION DONE delay 1000 'PAUSE A SECOND SO 03:15:00 CAN'T REAPPEAR return 'DONE '******************************************************************************** 'CONFIGURATION MENU AFTER LONG PRESS DURING TIME / DATE DISPLAY '******************************************************************************** 10000: 'DISPLAY MENU CHOICE 0..9 AS 1ST DIGIT c=0 'NOT (YET) IN CONFIG MODE HERE x=0 'ENCODER KEY RESET r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=0 '1ST DIGIT v=0 'ENCODER MIN. VALUE w=9 'ENCODER MAX. VALUE z=1 'BLANK THE DISPLAY gosub 30000 'READ AND DISPLAY ENCODER if y=0 goto 200 'BACK TO TIME DISPLAY if y=1 goto 11000 'ÇONFIG TIME if y=2 goto 12000 'CONFIG DATE if y=3 goto 13000 'CONFIG USER BRIGHTNESS LEVEL if y=4 goto 14000 'CONFIG PREFERRED COLOUR FOR TIME DISPLAY if y=5 goto 15000 'CONFIG PREFERRED COLOUR FOR DATE DISPLAY if y=6 goto 16000 'CONFIG AUTOMATIC DATE DISPLAY if y=7 goto 17000 'CONFIG HOURLY CHIME if y=8 goto 18000 'CONFIG DAILY SECONDS TIME CORRECTION if y=9 goto 19000 'CONFIG DAILY SECONDS CORRECTION +/- '******************************************************************************* 'CONFIG ITEM 1 - SET THE TIME '******************************************************************************* 11000: IO.setenc(f,9,0) 'ENCODER FROM 0..9 PRESET DATE COLOUR a=0 'DISPLAY TIME MODE x=0 'RESET ENCODER KEY gosub 20000 'DISPLAY CURRENT TIME c=1 'IN CONFIG MODE r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=0 '1ST DIGIT u=i 'ENCODER PRESET VALUE (HOURS) v=0 'ENCODER MIN. VALUE w=23 'ENCODER MAX. VALUE z=0 'DON'T BLANK THE DISPLAY l=i 'LAST ENCODER VALUE (HOURS) gosub 30000 'READ AND EVALUATE ENCODER i=y 'SET HOURS TO ENCODER VALUE gosub 20000 'REDISPLAY THE TIME if x=2 goto 11900 'LONG KEYPRESS t=2 '3RD DIGIT u=j 'ENCODER PRESET VALUE (MINUTES) w=59 'ENCODER MAX. VALUE l=j 'LAST ENCODER VALUE (MINUTES) gosub 30000 'READ AND EVALUATE ENCODER j=y 'SET MINUTES TO ENCODER VALUE gosub 20000 'REDISPLAY THE TIME if x=2 goto 11900 'LONG KEYPRESS t=4 '5TH DIGIT u=k 'ENCODER PRESET VALUE (SECONDS) w=59 'ENCODER MAX. VALUE l=k 'LAST ENCODER VALUE (SECONDS) gosub 30000 'READ AND EVALUATE ENCODER k=y 'SET SECONDS TO ENCODER VALUE gosub 20000 'REDISPLAY THE TIME if x=2 goto 11900 'LONG KEYPRESS u=1 'ENCODER PRESET BACK TO 1 goto 10000 'SHORT KEYPRESS SO BACK TO MENU 11900: 'LONG KEYPRESS SO SAVE THE SET TIME gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE IO.setrtc(2,i) 'SET RTC HOURS IO.setrtc(1,j) 'SET RTC MINUTES IO.setrtc(0,k) 'SET RTC SECONDS u=1 'ENCODER PRESET BACK TO 1 goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 2 - SET THE DATE '******************************************************************************** 12000: IO.setenc(g,9,0) 'ENCODER FROM 0..9 PRESET DATE COLOUR a=1 'MODE DATE DISPLAY x=0 'RESET ENCODER KEY gosub 21000 'DISPLAY CURRENT DATE 12100: 'RE-ENTRY POINT IN CASE OF FAULTY DATE c=1 'IN CONFIG MODE r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=0 '1ST DIGIT u=i 'ENCODER PRESET VALUE (DAY) v=1 'ENCODER MIN. VALUE w=31 'ENCODER MAX. VALUE z=0 'DON'T BLANK THE DISPLAY l=i 'LAST ENCODER VALUE (DAY) gosub 30000 'READ AND EVALUATE ENCODER i=y 'SET DAY TO ENCODER VALUE gosub 21000 'REDISPLAY THE DATE if x=2 goto 12900 'LONG KEYPRESS t=2 '3RD DIGIT u=j 'ENCODER PRESET VALUE (MONTH) w=12 'ENCODER MAX. VALUE l=j 'LAST ENCODER VALUE (MONTH) gosub 30000 'READ AND EVALUATE ENCODER j=y 'SET MONTH TO ENCODER VALUE gosub 21000 'REDISPLAY THE DATE if x=2 goto 12900 'LONG KEYPRESS t=4 '5TH DIGIT u=k 'ENCODER PRESET VALUE (YEAR) w=99 'ENCODER MAX. VALUE l=k 'LAST ENCODER VALUE (YEAR) gosub 30000 'READ AND EVALUATE ENCODER k=y 'SET YEAR TO ENCODER VALUE gosub 21000 'REDISPLAY THE DATE if x=2 goto 12900 'LONG KEYPRESS u=2 'ENCODER PRESET BACK TO 2 a=0 'TIME DISPLAY MODE goto 10000 'SHORT KEYPRESS SO BACK TO MENU 12900: 'LONG KEYPRESS SO SAVE THE SET DATE p=0 'TEMP.CHECK VAR. FOR DATE CORRECTNESS h=k%4 'YEAR MODULUS 4 FOR LEAP YEAR CHECK if h=0 and j=2 and i>29 then p=1 'LEAP YEAR AND FEBRUARI DAYS >29 if h <> 0 and j=2 and i>28 then p=1 'NO LEAP YEAR AND FEBRUARI DAYS >28 if i>30 and j=4 then p=1 '31 APRIL if i>30 and j=6 then p=1 '31 JUNE if i>30 and j=9 then p=1 '31 SEP if i>30 and j=11 then p=1 '31 NOV if p=0 goto 12950 'IF NO P-FLAG SET DATE IS OK gosub 22200 'LONG LOW BEEP TO INDICATE FAULTY DATE goto 12100 'BACK TO RE-ENTRYPOINT, TRY AGAIN 12950: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE k=k+2000 'RESTORE FULL DATE INCL. CENTURY IO.setrtc(3,i) 'SET RTC DAY IO.setrtc(4,j) 'SET RTC MONTH IO.setrtc(5,k) 'SET RTC YEAR u=2 'ENCODER PRESET BACK TO 2 a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 3 - SET THE BRIGHTNESS LEVEL '******************************************************************************** 13000: IO.eewrite(11,b) 'SAVE CURRENT BRIGHTNESS SETTING a=3 'USED TEMP. TO INDICATE BRIGHTNESS CONFIG c=1 'IN CONFIG MODE x=0 'ENCODER KEY RESET r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=5 '6TH DIGIT u=b 'ENCODER PRESET VALUE v=0 'ENCODER MIN. VALUE w=9 'ENCODER MAX. VALUE z=0 'DON'T BLANK DISPLAY l=u 'LAST ENCODER VALUE gosub 30000 'READ AND EVALUATE ENCODER if x=2 goto 13900 'LONG KEYPRESS SO GOTO SAVE u=3 'ENCODER PRESET BACK TO 3 a=0 'DISPLAY MODE BACK TO TIME b=(IO.eeread(11)) 'RESTORE ORIGINAL BRIGHTNESS (NO SAVE) gosub 26000 'REFILL IHSV INDEX WITH CORRECT BRIGHTNESS goto 10000 'BACK TO MENU 13900: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE u=3 'ENDODER PRESET BACK TO 3 a=0 'DISPLAY MODE BACK TO TIME IO.eewrite(1,b) 'WRITE BACK BRIGHTNESS SETTING goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 4 - SET THE PREFERRED COLOUR FOR TIME DISPLAY '******************************************************************************** 14000: IO.eewrite(12,f) 'SAVE CURRENT COLOUR TEMPORARILY IO.setenc(f,9,0) 'SET ENCODER 0..9 PRESET CURRENT COLOUR a=0 'DISPLAY MODE TIME x=0 'RESET ENCODER KEY c=0 'PRETEND NOT TO BE IN CONFIG MODE 14100: gosub 20000 'DISPLAY CURRENT TIME if x=0 goto 14100 'NO KEYPRESS SO LOOP if x=2 goto 14900 'LONG KEYPRESS SO SAVE f=(IO.eeread(12)) 'RESTORE ORIGINAL COLOUR (NO SAVE) u=4 'ENCODER PRESET BACK TO 4 goto 10000 'BACK TO MENU 14900: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE u=4 'ENCODER PRESET BACK TO 4 IO.eewrite(2,f) 'WRITE BACK TIME COLOUR goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 5 - SET THE PREFERRED COLOUR FOR DATE DISPLAY '******************************************************************************** 15000: IO.eewrite(13,g) 'SAVE CURRENT COLOUR TEMPORARILY IO.setenc(g,9,0) 'SET ENCODER 0..9 PRESET CURRENT COLOUR a=1 'DISPLAY MODE DATE x=0 'RESET ENCODER KEY c=0 'PRETEND NOT TO BE IN CONFIG MODE 15100: gosub 21000 'DISPLAY CURRENT DATE if x=0 goto 15100 'NO KEYPRESS SO LOOP if x=2 goto 15900 'LONG KEYPRESS SO SAVE g=(IO.eeread(13)) 'RESTORE ORIGINAL COLOUR (NO SAVE) u=5 'ENCODER PRESET BACK TO 5 a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU 15900: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE u=5 'ENCODER PRESET BACK TO 5 IO.eewrite(3,g) 'WRITE BACK DATE COLOUR a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 6 - SET AUTOMATIC DATE DISPLAY 0=NO / 1=YES '******************************************************************************** 16000: c=1 'IN CONFIG MODE x=0 'ENCODER KEY RESET r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=5 'SIXTH DIGIT u=d 'ENCODER PRESET VALUE v=0 'ENCODER MINIMUM VALUE w=1 'ENCODER MAX. VALUE z=0 'DON'T BLANK THE DISPLAY l=d 'LAST ENCODER VALUE gosub 30000 'READ AND EVALUATE ENCODER if x=2 goto 16900 'LONG KEYPRESS SO SAVE u=6 'ENCODER PRESET BACK TO 6 goto 10000 'BACK TO MENU 16900: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE u=6 'ENCODER PRESET BACK TO 6 IO.eewrite(4,y) 'WRITE BACK AUTO DATE DISPLAY d=y 'SET USER CONFIG VAR. a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 7 - SET HOURLY CHIME 0=NO / 1=YES '******************************************************************************** 17000: c=1 'IN CONFIG MODE x=0 'ENCODER KEY RESET r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=5 'SIXTH DIGIT u=(IO.eeread(5)) 'ENCODER PRESET VALUE v=0 'ENCODER MINIMUM VALUE w=1 'ENCODER MAX. VALUE z=0 'DON'T BLANK THE DISPLAY l=u 'LAST ENCODER VALUE gosub 30000 'READ AND EVALUATE ENCODER if x=2 goto 17900 'LONG KEYPRESS SO SAVE u=7 'ENCODER PRESET BACK TO 7 a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU 17900: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE u=7 'ENCODER PRESET BACK TO 7 IO.eewrite(5,y) 'WRITE BACK HOURLY CHIME SETTING a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 8 - SET DAILY TIME CORRECTION 0..99 SECONDS '******************************************************************************** 18000: IO.eewrite(14,(IO.eeread(6))) 'TEMPORARY SAVE CURRENT SETTING c=1 'IN CONFIG MODE x=0 'ENCODER KEY RESET r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=4 'FIFTH DIGIT u=(IO.eeread(6)) 'ENCODER PRESET VALUE v=0 'ENCODER MINIMUM VALUE w=99 'ENCODER MAX. VALUE z=0 'DON'T BLANK THE DISPLAY l=u 'LAST ENCODER VALUE gosub 30000 'READ AND EVALUATE ENCODER if x=2 goto 18900 'LONG KEYPRESS SO SAVE u=8 'ENCODER PRESET BACK TO 8 a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU 18900: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE u=8 'ENCODER PRESET BACK TO 8 a=0 'TIME DISPLAY MODE IO.eewrite(6,y) 'WRITE BACK DAILY TIME CORRECTION SECONDS goto 10000 'BACK TO MENU '******************************************************************************** 'CONFIG ITEM 9 - SET DAILY TIME CORRECTION SIGN 0=MINUS / 1=PLUS '******************************************************************************** 19000: c=1 'IN CONFIG MODE x=0 'ENCODER KEY RESET r=1 'BLINK DISPLAY s=7 'COLOUR BLUE t=5 'SIXTH DIGIT u=(IO.eeread(7)) 'ENCODER PRESET VALUE v=0 'ENCODER MINIMUM VALUE w=1 'ENCODER MAX. VALUE z=0 'DON'T BLANK THE DISPLAY l=u 'LAST ENCODER VALUE gosub 30000 'READ AND EVALUATE ENCODER if x=2 goto 19900 'LONG KEYPRESS SO SAVE u=9 'ENCODER PRESET BACK TO 9 a=0 'TIME DISPLAY MODE goto 10000 'BACK TO MENU 19900: gosub 22000 'THREE SHORT BEEPS TO ACKNOWLEDGE SAVE u=9 'ENCODER PRESET BACK TO 9 a=0 'TIME DISPLAY MODE IO.eewrite(7,y) 'WRITE BACK TIME CORRECTION SIGN goto 10000 'BACK TO MENU '******************************************************************************** 'DISPLAY THE FULL TIME '******************************************************************************** 20000: if c=1 goto 20010 'IF IN CONFIG MODE DON'T RE-READ THE TIME i=IO.getrtc(2) 'GET HOURS FROM RTC j=IO.getrtc(1) 'GET MINUTES FROM RTC k=IO.getrtc(0) 'GET SECONDS FROM RTC 20010: t=0 'FIRST DIGIT w=i/10 'TENS OF HOURS gosub 28000 'DISPLAY THIS t=1 'SECOND DIGIT w=i%10 'ONES OF HOURS gosub 28000 'DISPLAY THIS t=2 'THIRD DIGIT w=j/10 'TENS OF MINUTES gosub 28000 'DISPLAY THIS t=3 'FOURTH DIGIT w=j%10 'ONES OF MINUTES gosub 28000 'DISPLAY THIS t=4 'FIFTH DIGIT w=k/10 'TENS OF SECONDS gosub 28000 'DISPLAY THIS t=5 'SIXTH DIGIT w=k%10 'ONES OF SECONDS gosub 28000 'DISPLAY THIS return '******************************************************************************** 'DISPLAY THE FULL DATE '******************************************************************************** 21000: if c=1 goto 21010 'IF IN CONFIG MODE DON'T RE-READ THE TIME i=IO.getrtc(3) 'GET DAY FROM RTC j=IO.getrtc(4) 'GET MONTH FROM RTC k=IO.getrtc(5) 'GET YEAR FROM RTC k=k%100 'GET RID OF CENTURY 21010: t=0 'FIRST DIGIT w=i/10 'TENS OF DAY gosub 28000 'DISPLAY THIS t=1 'SECOND DIGIT w=i%10 'ONES OF DAY gosub 28000 'DISPLAY THIS t=2 'THIRD DIGIT w=j/10 'TENS OF MONTH gosub 28000 'DISPLAY THIS t=3 'FOURTH DIGIT w=j%10 'ONES OF MONTH gosub 28000 'DISPLAY THIS t=4 'FIFTH DIGIT w=k/10 'TENS OF YEAR gosub 28000 'DISPLAY THIS t=5 'SIXTH DIGIT w=k%10 'ONES OF YEAR gosub 28000 'DISPLAY THIS return '******************************************************************************** 'THREE SHORT ACKNOWLEDGMENT BEEPS '******************************************************************************** 22000: for q=1 to 3 'THREE TIMES IO.beep(26) 'LOW BEEP delay 50 'FOR 50 ms IO.beep(0) 'BEEP OFF delay 50 'FOR 50 ms next q 'LOOP return 'EXIT '******************************************************************************** 'ONE LONG LOW FREQUENCY BEEP TO INDICATE ERROR ENTRY '******************************************************************************** 22200: IO.beep(300) 'LONG HIGH BEEP delay 500 'FOR 0,5 SECONDS IO.beep(0) 'BEEP OFF return '******************************************************************************** 'CHIME MELODY '******************************************************************************** 22400: IO.beep(659) 'PLAYES BIG BEN MELODY delay 650 IO.beep(523) delay 650 IO.beep(587) delay 650 IO.beep(392) delay 900 IO.beep(0) delay 400 IO.beep(392) delay 650 IO.beep(597) delay 650 IO.beep(659) delay 650 IO.beep(523) delay 1000 IO.beep(0) return '******************************************************************************** 'DISPLAY VERSION '******************************************************************************** 25000: LED.blackout() 'DISPLAY OFF LED.iled(7,15) '0 LED.iled(7,34) '9 LED.iled(7,44) '9 LED.show() 'DISPLAY ON delay 2000 '2 SECONDS TO PRESS THE KEY j=IO.getkey() 'CHECK FOR KEYPRESS if j>0 gosub 32050 else return 'KEY PRESSED SO RESET EEPROM IO.beep(1) 'BEEP-BEEP THAT INDICATES EEPROM RESET delay 75 IO.beep(29) delay 100 IO.beep(0) 'BEEP OFF return 'DONE '******************************************************************************** 'FILL THE IHSV-INDEX '0=WHITE, 1=RED, 2=ORANGE, 3=YELLOW, 4=GREEN, 5=AQUA '6=CYAN, 7=BLUE, 8=MAGENTA, 9=RAINBOW EFFECT '******************************************************************************** 26000: gosub 27500 'CALCULATE BRIGHTNESS (V-VALUE OF HSV) LED.ihsv(0, 0, 0, 128) 'WHITE for j = 1 to 8 'INDEX 1..8 (9 RESERVED FOR RAINBOw) i = read 20, j-1 'READ COLOUR H-VALUE LED.ihsv(j, i, 255, e) 'SET COLOUR ARRAY next j 'LOOP return 'EXIT '******************************************************************************** 'CALCULATE V-VALUE FOR HSV COLOR IN CASE OF AUTO BRIGHTNESS 'RETURNS E AS V-VALUE '******************************************************************************** 27500: if b > 0 then goto 27600 'IF NOT AUTO BRIGHTNESS SKIP e = IO.getldr()+10 'READ LDR VALUE WITH MIN. OF TEN return 'DONE 27600: e = b*26+10 'GOES FROM 36 TO 244 DEPENDING ON SETTING return 'DONE '******************************************************************************** 'DISPLAY ROUTINE FOR TIME/DATE ETC. 'RETURNS X=KEY ENCODER VALUE (1=SHORT/2=LONG), Y=ENCODER VALUE 'ON ENTRY PARAMETERS T,W MUST BE SET 'T=DIGIT (0..5), W=VALUE TO DISPLAY (0..9) '******************************************************************************** 28000: if a=0 then l=f else l=g if c=1 or c=4 goto 29050 'IF IN CONFIG MODE NO ENCODER EVALUATION y=IO.getenc() 'GET WHEEL VALUE if y=l then goto 28100 'IF EQUAL TO LAST KNOWN VALUE SKIP if a=0 then f=y else g=y 'WHEEL TURNED, SET NEW COLOUR FOR TIME/DATE l=y 'SET LAST KNOWN WHEEL VALUE goto 29000 28100: q=IO.getkey() 'READ ENCODER KEY if q=0 goto 29000 'NO KEYPRESS AND SKIP o=0 'INITIALIZE TEMP.COUNTER 28200: q=IO.keystate() 'READ ENCODER KEYSTATE if q=0 then x=1 'SHORT KEYPRESS SET X TO 1 if q=0 goto 29000 'AND SKIP delay 10 '10 ms DELAY o=o+1 'INCREASE TEMP.COUNTER if o<30 goto 28200 'NOT YET 300 ms ? THEN SKIP BACK x=2 'LONG KEYPRESS SET X TO 2 29000: if x=0 goto 29050 'X STILL ZERO (NO KEYPRESSES)'THEN SKIP ON return 'KEY WAS PRESSED SO RETURN 29050: for q=0 to 9 'LOOP 10 TIMES LED.lrgb(t*10+q,0,0,0) 'SET APPROPRIATE LED TO BLACK next q 'LOOP if l <> 9 goto 29060 'IF COLOUR IS NOT "RAINBOW" SKIP ON n=(m+(8*(50-(t*10))))%360 'CALCULATE SEMI-RANDOM COLOUR H-VALUE LED.ihsv(9, n, 255, e) 'SET THIS COLOUR IN COLOUR ARRAY 9 29060: o=read 10,w 'READ APPROPRIATE LED INDEX LED.iled(l,t*10+o) 'SET THIS LED TO COLOUR 'L' LED.show() 'SHOW DISPLAY m=m+1 'INCREASE TEMP.COUNTER M if m>32000 then m=0 'PREVENT OVERFLOW return '******************************************************************************** 'ENCODER/DISPLAY ROUTINE FOR CONFIGURATION 'RETURNS X=KEY ENCODER VALUE (1=SHORT/2=LONG), Y=ENCODER VALUE 'ON ENTRY PARAMETERS R,S,T,U,V,Z MUST BE SET 'R=BLINK DISPLAY 0/1, S=COLOUR OF DISPLAY, T=START DIGIT 'U=START VALUE ENCODER, V=MINIMUM VALUE ENCODER 'W=MAXIMUM VALUE ENCODER, Z=BLANK DISPLAY 0/1 '******************************************************************************** 30000: p=0 'P INDICATES NUMBER OF DIGITS -1 if w/10 > 0 then p=1 '2 DIGITS AT LEAST if w/100 > 0 then p=2 '3 DIGITS AT LEAST if w/1000 > 0 then p=3 '4 DIGITS AT LEAST if w/10000 > 0 then p=4 '5 DIGITS if z=1 then LED.blackout() 'BLANK DISPLAY IF WANTED SO IO.setenc(u-v,w-v,0) 'ENCODER FROM STARTVALUE MINUS MIN.VALUE 'BECAUSE ENCODER WILL START WITH 0 'WILL BE RECTIFIED WHEN EXITING m=0 'TEMP.COUNTER RESET 30050: x=0 'KEYPRESS RESET y=IO.getenc() 'READ ENCODER WHEEL VALUE if a <> 3 goto 30100 'IF NOT CALLED FROM BRIGHTNESS CONFIG SKIP if y=l goto 30100 'IF WHEEL VALUE EQUALS LAST KNOWN VALUE SKIP b=y 'SET BRIGHTNESS TO WHEEL VALUE gosub 26000 'CALCULATE THE V-VALUE FOR COLOURS 30100: q=IO.getkey() 'CHECK FOR KEYPRESS if q=0 goto 31000 'NO KEYPRESS SO SKIP o=0 'TEMP.COUNTER RESET 30200: q=IO.keystate() 'CHECK ENCODER KEYSTATE if q=0 then x=1 'IT WAS A SHORT KEYPRESS, SET X TO 1 if q=0 goto 31000 'AND SKIP ON delay 10 'DELAY FOR 10 ms o=o+1 'INCREASE TEMP.COUNTER if o<30 goto 30200 'IF NOT YET 300 ms SKIP BACK x=2 'IT WAS A LONG KEYPRESS, SET X TO 2 31000: if x=0 goto 31050 'IF NO KEYPRESS SKIP ON if v>0 then y=y+v 'RECTIFY THE RETURN WHEEL VALUE LED.iled(s,n) 'IN CASE KEY PRESS WAS DURING OFF PHASE return 'AND RETURN 31050: if r=0 goto 31060 'IF NO BLINKING DISPLAY WANTED SKIP if m % 25 < 8 goto 31100 'IF TEMP.COUNTER MODULO 15 < 10 SKIP ON 31060: for q=t*10 to (t+p)*10+9 'LOOP FOR ALL INVOLVED LED INDICES LED.lrgb(q,0,0,0) 'PUT LED ON BLACK next q 'LOOP if r=1 then LED.show() 'IF BLINKING WANTED -> SHOW LEDS 31100: if r=0 goto 31140 'IF NO BLINKING DISPLAY WANTED SKIP if m % 25 > 7 goto 31150 'IF TEMP.COUNTER MODULO 15 > 9 SKIP ON 31140: x=y+v 'PUT X TO RECTIFIED ENCODER WHEEL VALUE for q=t+p downto t 'LOOP INVOLVED DIGITS BACKWARDS o=x%10 'O = WHEEL VALUE MODULUS 10 n=read 10,o 'READ CORRECT LED INDEX LED.iled(s,q*10+n) 'PUT THIS LED ON WANTED COLOUR x=x/10 'LOOSE THE RIGHTMOST DIGIT OF WHEELVALUE next q 'LOOP LED.show() 'SHOW THE LEDS 31150: m=m+1 'INCREASE TEMP.COUNTER if m>32000 then m=0 'TO PREVENT OVERFLOW goto 30050 'GO BACK '******************************************************************************** 'PROGRAM START - INITIALIZATION 'IF EEPROM LOCATION 0 DOES NOT CONTAIN THE VALUE 999 THEN WRITE DEFAULT VALUES 'FOR EEPROM LOCATIONS 1 ... 7 AND WRITE 999 AT LOCATION 0 '******************************************************************************** 32000: if (IO.eeread(0)) = 999 then GOTO 32100 'EEPROM WAS ONCE CONFIGURED SO SKIP 32050: 'ENTRY POINT FOR STARTUP RESET IO.eewrite(0, 999) 'INDICATOR THAT EEPROM WAS ONCE SET IO.eewrite(1, 5) 'BRIGHTNESS (5 OUT OF 9) IO.eewrite(2, 2) 'COLOR FOR TIME DISPLAY (ORANGE) IO.eewrite(3, 7) 'COLOR FOR DATE DISPLAY (BLUE) IO.eewrite(4, 1) 'AUTOMATIC DATE DISPLAY (ON) IO.eewrite(5, 0) 'HOURLY CHIME (OFF) IO.eewrite(6, 0) 'TIME CORRECTION PER 24 HRS (0) IO.eewrite(7, 0) 'TIME CORRECTION BACKw./FORW. (0) delay 250 'DELAY A BIT '******************************************************************************** 'READ SOME EEPROM LOCATIONS USER SETTINGS AND RESET TEMP.VARS '******************************************************************************** 32100: IO.eewrite(11,0) 'RESET TEMP.VAR IO.eewrite(12,0) 'RESET TEMP.VAR IO.eewrite(13,0) 'RESET TEMP.VAR IO.eewrite(14,0) 'RESET TEMP.VAR IO.eewrite(15,0) 'RESET TEMP.VAR b = IO.eeread(1) 'BRIGHTNESS f = IO.eeread(2) 'PREFERRED COLOR FOR TIME g = IO.eeread(3) 'PREFERRED COLOR FOR DATE return 'DONE
15. August 2018 um 20:47 #1354Martin de WidtTeilnehmer -
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.