No-nonsense-LedNixie

Startseite Foren LED-Nixie-Clock No-nonsense-LedNixie

Schlagwörter: , , ,

Ansicht von 3 Beiträgen - 1 bis 3 (von insgesamt 3)
  • Autor
    Beiträge
  • #1352
    Martin de Widt
    Teilnehmer

    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,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

    Regards, Martin

    #1353
    Martin de Widt
    Teilnehmer

    Oops, 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
    
    #1354
    Martin de Widt
    Teilnehmer
Ansicht von 3 Beiträgen - 1 bis 3 (von insgesamt 3)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.