'********************************************************************
' System  :  C-Control/BASIC mit Microprozessor MC68HC05B6
' Programm:  LLicht.bas
' Version :  V1.09
' Autor   :  (c) DG1XPZ 01.09.1997
' Länge   :  3462 Byte
' Funktion:  Lauflicht am Digital-Port 1-7
' Systemvoraussetzungen:
' - C-Control/Basic-Modul
' - Applicationsboard mit angeschlossenem Display und Tastatur
' Schwerpunkt:
' - Lauflicht an Digi-Port1 - Digi-Port7
' Hinweise:
' - benötigt wird Autostart-Modus und Funkuhr-Modul
' - 1. Startzeit 15.00 Uhr  Ende 22.00 Uhr
'   2. Startzeit 06.00 Uhr  Ende 10.00 Uhr
' Bedienung des Programms:
'  1. drücken der Sterntaste (während das Programm auf die Startzeit wartet)
'     bewirkt eine Unterbrechung des laufenden Programms und erwartet die
'     Eingabe der aktuellen Zeit HH:MM:SS  (24h-Modus)
'  2. Da es immer wieder Problem gibt mit dem störungsfreien Empfang
'     der DCF77-Signale, speichert das Programm, während der Warte-Zeit jede
'     Sekunde und während der Lauflichtphase jede volle Minute, die Zeit
'     im Arbeitsspeicher ab. Diese Zeit wird beim Neustart des Programms als
'     erstes eingelesen und überbrückt damit kurzzeitige Netzausfälle.
'     (eine Neu-Synchronisation der DCF77-Uhr dauert im allgemeinen 2-5 Minuten,
'      und kann bei starken Störungen unter Umständen sogar völlig ausbleiben))
' Versionsgeschichte:
' V1.01: - Stellen der Zeit mit Sterntaste ermöglichen
' V1.02: - Zweite Startzeit hinzugefügt
' V1.03: - Auf 4-zeiliges LCD-Display angepasst
' V1.04: - ?
' V1.05: - mit Hinweis: läuft ... bzw warte ... versehen
'        - Textausgabe in Groß/Klein-Schreibung
' V1.06: - Wochentag erkennen (damit Sonntags ein bischen länger Ruhe ist)
'        - Startzeit am Wochenende = 09.00 Uhr
' V1.07: - ?
' V1.08: - Menü eingebaut, Text in Tabellenform (Speicherplatz sparen)
'        - mit Lampentest
' V1.09: - "Blitze" zu Silvester 0:00 (unregelmäßiges Aufleuchten)
'********************************************************************


' *** Variablen-Definition *** (Word=2byte, Byte =1byte)  max. 24byte Variablen !!!
define key word                  '01-02  Tastaturwert in Ziffernform z.B 1=1
define LaufLichtport byteport[1] '3-10 für 8-Bit Port
define key_nr byte               '11  Nummer der Taste für Tastaturabfrage
define compare byte              '12  für Tastaturabfrage
define lcd_buf byte              '13  für LCD-Modul
define lcd_param byte            '14  Übergabewert eines Zeichens für LCD-Modul
define I byte                    '15  Laufvariable für Schleifen
define Lastminute byte           '16  erkennen ob Minute +1
define Startzeit byte            '17
define Endzeit byte              '18
define Flag byte                 '19  Flagbyte
define dow_ byte                 '20 Wochentag
define hour_ byte                '21 Stundenwert
define minute_ byte              '22 Minutenwert
define second_ byte              '23 Sekundenwert
define zufallzahl byte           '24 für Blitze
' *** Definition Symbolischer Konstanten (benötigt keinen Speicherplatz!!)
define Zeile1 &H80               'Display-Adresse für Zeile 1
define Zeile2 &HC0               'dto 2
define Zeile3 &H94               'dto 3
define Zeile4 &HD4               'dto 4
define startzeit1 6              '06.00 Uhr Start
define endzeit1 10                '10.00 Uhr Ende
define startzeit2 15              '15.00 Uhr Start
define startzeit3 9               '09.00 Uhr Start am Wochenende
define endzeit2 22                '22.00 Uhr Ende
define keyboard ad[8]
define lcd_port byteport[2]   '*** Definition LCD-Ports ***
define lcd_rs port[14]        ' *** Definition LCD-Ports ***
define lcd_rw port[13]        ' *** Definition LCD-Ports ***
define lcd_e port[15]         ' *** Definition LCD-Ports ***

' die Reihenfolge der Tasten auf dem Keyboard
define KEY_Stern   0
define KEY_7       1
define KEY_4       2
define KEY_1       3
define KEY_0       4
define KEY_8       5
define KEY_5       6
define KEY_2       7
define KEY_Kreuz   8
define KEY_9       9
define KEY_6       10
define KEY_3       11

' *** ASCII-Codes ***
define Leerz     &H20 : define AKlammer &H40
define AZeichen  &H21 : define A_ &H41 : define kla_ &H61 : define ae_       &HE1
define Quote     &H22 : define B_ &H42 : define klb_ &H62 : define oe_       &HEF
define Kreuz     &H23 : define C_ &H43 : define klc_ &H63 : define ue_       &HF5
define Dollar    &H24 : define D_ &H44 : define kld_ &H64 : define MStrich   &HB0 '-
define Prozent   &H25 : define E_ &H45 : define kle_ &H65 : define Grad      &HDF '°
define Kaufm_Und &H26 : define F_ &H46 : define klf_ &H66 : define sz_       &HE2
define Apostro_O &H27 : define G_ &H47 : define klg_ &H67 : define mue_      &HE4 'µ
define LKlammer  &H28 : define H_ &H48 : define klh_ &H68 : define Wurzel    &HE8
define RKlammer  &H29 : define I_ &H49 : define kli_ &H69 : define Unendl    &HF3
define Stern     &H2A : define J_ &H4A : define klj_ &H6A : define Ohm       &HF4
define Plus      &H2B : define K_ &H4B : define klk_ &H6B : define Summe     &HF6
define Komma     &H2C : define L_ &H4C : define kll_ &H6C : define Pi        &HF7
define Minus     &H2D : define M_ &H4D : define klm_ &H6D : define Geteilt   &HFD
define Punkt     &H2E : define N_ &H4E : define kln_ &H6E : define Semikol   &H3B
define SStrich   &H2F : define O_ &H4F : define klo_ &H6F : define LSKlammer &H3C
define Null      &H30 : define P_ &H50 : define klp_ &H70 : define Gleich    &H3D
define Eins      &H31 : define Q_ &H51 : define klq_ &H71 : define RSKLammer &H3E
define Zwei      &H32 : define R_ &H52 : define klr_ &H72 : define RPfeil    &H7E
define Drei      &H33 : define S_ &H53 : define kls_ &H73 : define FZeichen  &H3F
define vier      &H34 : define T_ &H54 : define klt_ &H74 : define UStrich   &H5F
define fünf      &H35 : define U_ &H55 : define klu_ &H75 : define LPfeil    &H7F
define sechs     &H36 : define V_ &H56 : define klv_ &H76
define sieben    &H37 : define W_ &H57 : define klw_ &H77
define acht      &H38 : define X_ &H58 : define klx_ &H78
define neun      &H39 : define Y_ &H59 : define kly_ &H79
define DPunkt    &H3A : define Z_ &H5A : define klz_ &H7A

'*** Programmbeginn  ***

LaufLichtPort=0

#start
  gosub LCD_INIT                             'Initialisiert das LCD-Display
  gosub Text_Programmname
'Gespeicherte Zeit einlesen  (falls kurzzeitiger Netzausfall war)
open# for Read
   #lese_naechsten_wert
   if EOF then goto Warte_auf_Startzeit
   input# Dow
   input# Hour
   input# Minute
   input# second
close#

#Warte_auf_Startzeit
  if DOW=0 then DOW=1
  gosub ifkey
  if lcd_param = stern then gosub Menue_I'Eingabe_Zeit
  ' Ausgabe von "Start:   xx:00:00"  am Display
  lcd_param = 3 : gosub LCD_GOTOLINE
  gosub Text_Start
  lcd_param = NULL + startzeit / 10 :gosub lcd_writechar
  lcd_param = NULL + startzeit mod 10 :gosub lcd_writechar
  lcd_param = dpunkt : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = dpunkt : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = 4 : gosub LCD_GOTOLINE
  Gosub Text_warte
  lcd_param = 2 : gosub LCD_GOTOLINE
gosub Anzeige_Zeit
gosub Zeit_speichern

startzeit = startzeit1 :  endzeit = endzeit1
if hour >= endzeit1 and hour < endzeit2 then startzeit = startzeit2
if hour >= endzeit1 and hour < endzeit2 then endzeit = endzeit2
'if DOW > 4 and DOW < 7 and hour > endzeit2 then Startzeit = startzeit3
' ist es Freitags nach 22.00 dann Start 10.00 Uhr:
if Dow = 5 and hour >=endzeit1 and hour >= endzeit2 then startzeit = startzeit3
' ist es Sonnabend oder Sonntag, dann Start 09.00 Uhr:
if dow > 5 then startzeit = startzeit3
'if es Sonnabend oder Sonntag dann Ende 22.00 Uhr:
if DOW > 5 then endzeit = endzeit2
' ist es Sonntag nach 22.00 Uhr dann Start 06.00 Uhr
if Dow = 7 and hour >= endzeit2 then startzeit = startzeit1
if Day=31 then endzeit = 24
if Day=1 then startzeit=0 and endzeit=2
if hour >= startzeit and hour < endzeit then goto Start_Lauflicht
goto warte_auf_startzeit

#Start_Lauflicht
  If DOW=0 then DOW=1
  flag = null
  if Day=31 then endzeit = 24
  if Day=1 then startzeit=0 and endzeit=2
  lcd_param = 3 : gosub LCD_GOTOLINE
  ' Ausgabe von "Ende:   xx:00:00"  am Display
  gosub Text_Ende
  lcd_param = NULL + Endzeit / 10 :gosub lcd_writechar
  lcd_param = NULL + Endzeit mod 10 :gosub lcd_writechar
  lcd_param = dpunkt : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = dpunkt : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = null : gosub LCD_WRITECHAR
  lcd_param = 4 : gosub LCD_GOTOLINE
  Gosub Text_laeuft
  if Day = 1 and Hour>=0 then goto Neujahrsblitze

#LaufLichtroutine
if hour >= Endzeit then goto Warte_auf_Startzeit
    For I = 0 to 67
      gosub ifkey
      if lcd_param = stern then Flag = stern          'die folgenden 3 Zeilen ermöglichen
      if lcd_param = stern then gosub Menue_I'Eingabe_Zeit    'das Stellen der Uhr
      if flag = stern then goto Start_Lauflicht
      if hour=0 then goto Start_Lauflicht
      looktab LaufLichtdaten, I , LaufLichtport
      pause 20
      lcd_param = 2 : gosub LCD_GOTOLINE
      gosub Anzeige_Zeit
      if Minute <> LastMinute then gosub Zeit_speichern
    next
 goto Lauflichtroutine

#Neujahrsblitze
if hour >= Endzeit then goto Warte_auf_Startzeit
    Randomize Timer
      Key = rand
      Key = ABS (Key)
      Key = Key mod 371
      Zufallzahl = Key mod 7
      gosub ifkey
      if lcd_param = stern then Flag = stern          'die folgenden 3 Zeilen ermöglichen
      if lcd_param = stern then gosub Menue_I'Eingabe_Zeit    'das Stellen der Uhr
      if flag = stern then goto Start_Lauflicht       '
      looktab Blitze, Zufallzahl , LaufLichtport
      pause 3
      lcd_param = 2 : gosub LCD_GOTOLINE
      gosub Anzeige_Zeit
      if Minute <> LastMinute then gosub Zeit_speichern
  goto Neujahrsblitze

end



' *************************************************************************************

#Menue_I
  Lauflichtport=0
  gosub Bild_neu
  ' 1 - Zeit
  lcd_param = Zeile2 : gosub LCD_WriteCMD     ' Wechsel in die zweite Zeile
  lcd_param = Eins : gosub LCD_WRITECHAR
  gosub Text_Leerz_Minus_Leerz
  gosub Text_Zeit
  ' 2 - Lampentest
  lcd_param = Zeile3 : gosub LCD_WriteCMD
  lcd_param = Zwei : gosub LCD_WRITECHAR
  gosub Text_Leerz_Minus_Leerz
  gosub Text_Lampentest
  lcd_param = Zeile4 : gosub LCD_WriteCMD
  ' 3 - ?
  lcd_param = drei : gosub LCD_WRITECHAR
  gosub Text_Leerz_Minus_Leerz
  lcd_param = FZeichen : gosub LCD_WRITECHAR
  gosub lesekey
  if lcd_param = Stern or lcd_param = Kreuz then return
  if lcd_param = eins then goto Eingabe_Zeit
  if lcd_param = zwei then gosub Lampentest
  'if lcd_param = drei then gosub Meszwert_laden
  goto Menue_I
return

#Zeit_speichern
  open# for write
    print# dow
    print# hour
    print# minute
    print# second
    Lastminute = minute
  close#
return

#Eingabe_Zeit
  gosub LCD_CLS                        'geht nicht tiefer zu
  gosub Text_Programmname              'Verschachteln
  lcd_param = 2 : gosub LCD_GOTOLINE
  gosub Text_Zeit2
  lcd_param = 1 : gosub lcd_blink
  gosub lesekey : hour_= key
  gosub lesekey : hour_= hour_ * 10 + key
  if hour_ > 23 then goto Eingabe_Zeit
    lcd_param = dPunkt : gosub lcd_writechar
  gosub lesekey : minute_= key
  gosub lesekey : minute_= minute_* 10 + key
    if minute_ > 59 then goto Eingabe_Zeit
  lcd_param = dPunkt : gosub lcd_writechar
  gosub lesekey : second_= key
  gosub lesekey : second_= second_* 10 + key
    if second_ > 59 then goto Eingabe_Zeit
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = RPfeil : gosub lcd_writechar
  lcd_param = Kreuz  : gosub lcd_writechar
  lcd_param = 1 : gosub LCD_Blink
  gosub lcd_links
  gosub lesekey
  if lcd_param <> kreuz then goto Eingabe_Zeit
  hour=hour_ : minute=minute_ : second=second_
  
  #Eingabe_Tag
  lcd_param = Zeile3 : gosub LCD_WriteCMD
  gosub Text_Tag
  gosub lesekey : dow_ = key
  if dow_ > 3 then goto Eingabe_Tag
  dow_ = dow_ * 10
  gosub lesekey : dow_ = dow_ + key
  if dow_ > 31 then goto Eingabe_Tag
  for I=1 to 12
    lcd_param = Leerz : gosub LCD_WRITECHAR
  next i
  lcd_param = RPfeil : gosub lcd_writechar
  lcd_param = Kreuz  : gosub lcd_writechar
  lcd_param = 1 : gosub LCD_Blink
  gosub lcd_links
  gosub lesekey
  if lcd_param <> kreuz then goto Eingabe_Tag
  Day=dow_

  #Eingabe_Wochentag
  lcd_param = Zeile4 : gosub LCD_WriteCMD
  gosub Text_Wochentag2
  lcd_param = Zeile3 : gosub LCD_WriteCMD
  gosub Text_Wochentag
  gosub lesekey : dow_ = key
  if dow_ > 7 or dow_ < 1 then goto Eingabe_Wochentag
  for I=1 to 7
    lcd_param = Leerz : gosub LCD_WRITECHAR
  next i
  lcd_param = RPfeil : gosub lcd_writechar
  lcd_param = Kreuz  : gosub lcd_writechar
  lcd_param = 1 : gosub LCD_Blink
  gosub lcd_links
  gosub lesekey
  if lcd_param <> kreuz then goto Eingabe_Wochentag
  lcd_param = 0 : gosub LCD_Blink
  dow=dow_
goto menue_I

#Bild_neu
  gosub LCD_CLS
  gosub Text_Programmname
return

#Lampentest
 gosub lcd_links
 lcd_param = Leerz : gosub LCD_WRITECHAR
 lcd_param = Zeile3+14 : gosub LCD_WriteCMD
 lcd_param = Gleich : gosub LCD_WRITECHAR
 lcd_param = kla_ : gosub LCD_WRITECHAR
 lcd_param = kln_ : gosub LCD_WRITECHAR
 Lauflichtport=127
 lcd_param = Leerz : gosub LCD_WRITECHAR
 lcd_param = RPfeil : gosub lcd_writechar
 lcd_param = stern  : gosub lcd_writechar
 lcd_param = 1 : gosub LCD_Blink
 gosub lcd_links
 gosub lesekey
 if lcd_param <> stern then goto Lampentest
 lcd_param = 0 : gosub LCD_Blink
 Lauflichtport=0
return

#Text_Programmname
for I = 0 to 19
  looktab Tab_Text_Programmname, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Zeit2
for I = 0 to 6
  looktab Tab_Text_Zeit2, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Ende
for I = 0 to 6
  looktab Tab_Text_Ende, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Start
for I = 0 to 6
  looktab Tab_Text_Start, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Lampentest
for I = 0 to 9
  looktab Tab_Text_Lampentest, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Leerz_minus_Leerz
  lcd_param = Leerz : gosub LCD_WRITECHAR      '
  lcd_param = Minus : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
return

#Text_Zeit
for I = 0 to 3
  looktab Tab_Text_Zeit, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Wochentag
for I = 0 to 9
  looktab Tab_Text_Wochentag, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Wochentag2
for I = 0 to 19
  looktab Tab_Text_Wochentag2, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_Tag
lcd_param = T_ : gosub LCD_WRITECHAR
lcd_param = kla_ : gosub LCD_WRITECHAR
lcd_param = klg_ : gosub LCD_WRITECHAR
lcd_param = Dpunkt : gosub LCD_WRITECHAR
return

#Text_Warte
for I = 0 to 8
  looktab Tab_Text_Warte, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_laeuft
for I = 0 to 9
  looktab Tab_Text_laeuft, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Montag
lcd_param = M_ : gosub LCD_WRITECHAR
lcd_param = klo_ : gosub LCD_WRITECHAR
return

#Dienstag
lcd_param = D_ : gosub LCD_WRITECHAR
lcd_param = kli_ : gosub LCD_WRITECHAR
return

#Mittwoch
lcd_param = M_ : gosub LCD_WRITECHAR
lcd_param = kli_ : gosub LCD_WRITECHAR
return

#Donnerstag
lcd_param = D_ : gosub LCD_WRITECHAR
lcd_param = klo_ : gosub LCD_WRITECHAR
return

#Freitag
lcd_param = F_ : gosub LCD_WRITECHAR
lcd_param = klr_ : gosub LCD_WRITECHAR
return

#Sonnabend
lcd_param = S_ : gosub LCD_WRITECHAR
lcd_param = kla_ : gosub LCD_WRITECHAR
return

#Sonntag
lcd_param = S_ : gosub LCD_WRITECHAR
lcd_param = klo_ : gosub LCD_WRITECHAR
return

#Anzeige_Zeit
  lcd_param = Z_ : gosub LCD_WRITECHAR     'kann icht tiefer
  lcd_param = kle_ : gosub LCD_WRITECHAR   'Verschachtelt werden
  lcd_param = kli_ : gosub LCD_WRITECHAR   'darum in dieser
  lcd_param = klt_ : gosub LCD_WRITECHAR   'Art und Weise
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = dpunkt : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  'lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = NULL + hour / 10 : gosub LCD_WRITECHAR
  lcd_param = NULL + hour mod 10 : gosub LCD_WRITECHAR
  lcd_param = dpunkt : gosub LCD_WRITECHAR
  lcd_param = NULL + minute / 10 : gosub LCD_WRITECHAR
  lcd_param = NULL + minute mod 10 : gosub LCD_WRITECHAR
  lcd_param = dpunkt : gosub LCD_WRITECHAR
  lcd_param = NULL + second / 10 : gosub LCD_WRITECHAR
  lcd_param = NULL + second mod 10 : gosub LCD_WRITECHAR
  lcd_param = leerz : gosub LCD_WRITECHAR
  lcd_param = leerz : gosub LCD_WRITECHAR
  ON DOW gosub Montag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Sonnabend, Sonntag
  lcd_param = Zeile3+17 : gosub LCD_WriteCMD
  lcd_param = NULL + day / 10 : gosub LCD_WRITECHAR
  lcd_param = NULL + day mod 10 : gosub LCD_WRITECHAR
 return

#Ifkey
  #loop_ifkey
    lcd_param = &H1F
    for key_nr = 0 to 12
      looktab keycodes, key_nr, compare
      if abs(keyboard-compare) < 4 then gosub HANDLE_LCD_KEY
      return
    next
  goto loop_ifkey

#lesekey
  #loop
    lcd_param = &H1F
    for key_nr = 0 to 11
      looktab keycodes, key_nr, compare
      if abs(keyboard-compare) < 3 then gosub HANDLE_LCD_KEY
      if lcd_param >= Kreuz and <= neun then return
    next
  goto loop

' ----- Tastennummer als Hex-Wert zurück
#HANDLE_LCD_KEY
  key = 13
  if key_nr = KEY_Stern then lcd_param = Stern
  if Key_nr = KEY_Stern then key = 10
  if key_nr = KEY_7 then lcd_param = Sieben
  if key_nr = KEY_7 then key = 7
  if key_nr = KEY_4 then lcd_param = vier
  if Key_nr = KEY_4 then key = 4
  if key_nr = KEY_1 then lcd_param = EINS
  if Key_nr = KEY_1 then key = 1
  if key_nr = KEY_0 then lcd_param = Null
  if Key_nr = KEY_0 then key = 0
  if key_nr = KEY_8 then lcd_param = Acht
  if Key_nr = KEY_8 then key = 8
  if key_nr = KEY_5 then lcd_param = fünf
  if Key_nr = KEY_5 then key = 5
  if key_nr = KEY_2 then lcd_param = zwei
  if Key_nr = KEY_2 then key = 2
  if key_nr = KEY_Kreuz then lcd_param = kreuz
  if Key_nr = KEY_Kreuz then key = 11
  if key_nr = KEY_9 then lcd_param = Neun
  if Key_nr = KEY_9 then key = 9
  if key_nr = KEY_6 then lcd_param = sechs
  if Key_nr = KEY_6 then key = 6
  if key_nr = KEY_3 then lcd_param = drei
  if Key_nr = KEY_3 then key = 3
  if lcd_param >= Kreuz and lcd_param <= Neun then beep 400,10,0
  if lcd_param >= Null and lcd_param <= Neun then gosub LCD_writechar
  Pause 3
return

'*************** LCD_Interface *********************************
'( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)

#LCD_INIT

' alle ports 0
  lcd_port = OFF

' 8-Bit-Modus aktivieren
  lcd_param=&H38 : gosub LCD_WRITECMD

' mit 8-Bit-Command in 4-Bit-Modus umschalten
  lcd_port=&B00000010
  tog lcd_e
  tog lcd_e

' ab jetzt 4-Bit-Modus
  lcd_param = &H28 : gosub LCD_WRITECMD
  lcd_param = &H0C : gosub LCD_WRITECMD

' Display loeschen
#LCD_CLS
  lcd_param = &H02 : gosub LCD_WRITECMD
  lcd_param = &H01 : gosub LCD_WRITECMD
return

' Cursor on/off
#LCD_Cursor
  if lcd_param = 0 then lcd_param = &B00001100
  if lcd_param = 1 then lcd_param = &B00001110
  gosub LCD_WRITECMD
return

' Zeichen blinken on/off
#LCD_Blink
  if lcd_param = 0 then lcd_param = &B00001100          ' Blinken an
  if lcd_param = 1 then lcd_param = &B00001101          ' Blinken aus
  gosub LCD_WRITECMD
return

' Cursor 1 Zeichen nach links schieben
#LCD_Links
  lcd_param = &B00010000
  gosub LCD_WRITECMD
return

' Zeilenwechsel  Zeile 1-4
#LCD_GOTOLINE
  if lcd_param = 1 then lcd_param = &H80
  if lcd_param = 2 then lcd_param = &HC0
  if lcd_param = 3 then lcd_param = &H94
  if lcd_param = 4 then lcd_param = &HD4
goto LCD_WRITECMD

' LCD-Kommando
#LCD_WRITECMD
  lcd_buf = OFF
  goto LCD_WRITE

' Zeichenausgabe
#LCD_WRITECHAR
  lcd_buf = &B00100000

' Kommando oder Zeichen an Display senden
#LCD_WRITE
  lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
  tog lcd_e
  tog lcd_e
  lcd_port = lcd_buf or (lcd_param and &H0F)  ' Lo-Nibble
  tog lcd_e
  tog lcd_e
return

' Tabellen

' --- Verarbeitung des Tastaturereignisses anhand der Tastennummer ---
' ----- Vergleichstabelle
table keycodes
  0 23 46 68
  90 111 132 152
  173 193 214 235 243
tabend

table LaufLichtdaten
  1 2 4 8 16 32 64 0           '8  1234567 einzeln
  64 32 16 8 4 2 1 0           '8  7654321 einzeln
  1 3 7 15 31 63 127 127       '8  1234567 addierend
  126 124 120 112 96 64 0 0    '8  1234567 subtrahierend
  1 64 2 32 4 16 8 0 8 0 8 0   '12 1726354-4-4 einzeln
  65 99 119 127 62 28 8 0      '8  1726354 add. und sub. zur Mitte
  8 28 62 127 119 99 65 0      '8
  1 33 37 45 61 63 127 0       '8  1634527 addierend
tabend

table Blitze
  1 8 4 64 32 2 16 0           '8  1234567 einzeln
tabend

table Tab_Text_Zeit
  Z_ kle_ kli_ klt_
tabend

table Tab_Text_Zeit2
  Z_ kle_ kli_ klt_ Leerz dpunkt Leerz
tabend

table Tab_Text_Ende
  E_ kln_ kld_ kle_ Leerz dpunkt Leerz
tabend

table Tab_Text_Start
  S_ klt_ kla_ klr_ klt_ dpunkt Leerz
tabend

table Tab_Text_Lampentest
  L_ kla_ klm_ klp_ kle_ kln_ klt_ kle_ kls_ klt_
tabend

table Tab_Text_Programmname
  Stern L_ kla_ klu_ klf_ kll_ kli_ klc_ klh_ klt_ leerz leerz V_ Punkt DPunkt
  Eins Punkt NuLL neun Stern
tabend

table Tab_Text_Warte
  klw_ kla_ klr_ klt_ kle_ leerz punkt punkt punkt
tabend

table Tab_Text_laeuft
  kll_ kla_ kle_ klu_ klf_ klt_ leerz punkt punkt punkt
tabend

table Tab_Text_Wochentag
  W_ klo_ klc_ klh_ kle_ kln_ klt_ kla_ klg_ DPunkt
tabend

table Tab_Text_Wochentag2
  LKlammer M_ klo_ Minus eins komma Leerz D_ kli_ Minus Zwei komma
  leerz punkt punkt S_ klo_ minus Sieben RKlammer
tabend
