'********************************************************************
' System  :  C-Control/BASIC mit Microprozessor MC68HC05B6
' Programm:  Wetter.bas
' Version :  V1.16m
' Autor   :  (c) DG1XPZ 21.09.1997
' Länge   :  4636 Byte
' Funktion:  Anzeige von Wetterdaten
' Systemvoraussetzungen:
' - Applicationsboard mit angeschlossenem Display
' - Applicationsboard mit angeschlossener Tastatur
' Schwerpunkt:
' - Ausgeben von Text am Display
' - Eingeben von Text mit Tastatur
' - Meßwerte vom AD-Wandler auswerten ->
' Hinweise:
' - AD1 = Temp              -27.5°C bis 100°C
' - AD2 = Lux                0 bis 265 Lux
' - AD3 = Luftdruck in mBar  800hPa bis 1015hPa
' - wechseln zum Menü während der laufenden Messung: mit STERN-Taste
'
' Meßwertaufzeichnung:
' - Tag, Monat, Jahr, Stunde, Minute, Sekunde, Temperatur, Lux, Luftdruck
' - Platzbedarf im EEPROM = 9 x 2 byte = 18 Byte je Messung
'         bei Intervall 30             = 48 Messungen pro Tag = 48 x 18 Byte
'                                      = 864 Byte pro Tag
' Fehlermeldungen:
' 1. "EEPROM voll" + Beepton -> wenn der interne EEPROM kein Platz mehr
'    zum Speichern der Wetterwerte hat.
'    Wartet auf das Drücken einer beliebigen Taste, und blendet Menü ein.
' Versionsgeschichte:
' V1.00: - Urversion
' V1.01: - Texte geändert
' V1.02: - Einbindung Luftdruckmesser
' V1.03: - Aufzeichnung der Daten und Abfrage während der laufenden Messung
'          duch drücken der STERN-Taste
' V1.04: - weiß nicht mehr
' V1.05: - Achtung ! Version 1.04 hatte Fehler !! -> bereinigt
' V1.06: - Aufzeichnung der Daten und Abfrage während der laufenden Messung
'          duch drücken der STERN-Taste
'        - Eingabe Meßintervall 1 Min bis 60 Min
' V1.07: - negative Temperatur wird endlich ausgegeben
'        - Sekunde der Aufzeichnung stimmt
' V1.08: - Kleinkram
' V1.09: - Kleinkram
' V1.10: - ausblenden führender Nullen bei Temp-Anzeige
'        - Groß/Klein-Schreibung bei der Textausgabe auf LCD-Display
' V1.11: - Menüsteuerung
' V1.12: - key_code Abfrage (2 Tabellen zusätzlich)
' V1.13: - Rücksprünge mit "Zeilex + y" innerhalb einer Zeile
' V1.14: - Fehler bei J/N-Abfrage: "einzeln" und "Meßwert löschen"
' V1.15: - diese Versionsgeschichte
' V1.16: - bei Meßwertübertragung zum PC
'          -> Abfrage von "einzeln (N=*/J=0)" in "einzeln (N=*/J=#)"
'          damit kein versehentliches löschen der Daten bei nachfolgender
'          Abfrage "löschen"
'        - Nach "EEPROM voll" Menü einblenden
'********************************************************************

' *** Daten-Definition ***
define key word            '1-2 Byte
define Temperatur word     '2-4 Byte
define Luftdruck word      '5-6 Byte
define Lux word            '7-8 Byte
define key_nr byte         '09 Byte  für Tastaturabfrage benötigt
define compare byte        '10 Byte  für Tastaturabfrage benötigt
define lcd_buf byte        '11 Byte  für LCD-Ausgabe benötigt
define lcd_param byte      '12 Byte  für LCD-Ausgabe benötigt
define Intervall byte      '13 Byte  Variable für Meßintervall
define hour_ byte          '14 Byte
define minute_ byte        '15 Byte
define second_ byte        '16 Byte
define day_ byte           '17 Byte
define month_ byte         '18 Byte
define Year_ byte          '19 Byte
define I byte              '20 Byte   Laufvariable
define last_minute byte    '21 Byte   prüft ob eine Minute vergangen
define flag byte           '22 Byte   wird als Flag benötigt

'*** Ende der Variablen ************************************************
'***********************************************************************
'*** Definition Symbolischer Konstanten (benötigt keinen Speicherplatz!!)
define AD_Temp ad[1]
define AD_Lux ad[2]
define AD_Luft ad[3]
define keyboard ad[8]
define blocksize 9
define Zeile1 &H80 ' Display-Adresse
'define Zeile2 &HC0 ' dto
define Zeile2 &HC0 ' dto
'define Zeile3 &H94 ' dto
'define Zeile4 &HD4 ' dto

' die Reihenfolge der Tasten auf dem Keyboard
define KEY_Stern   0  '*
define KEY_7       1  '7
define KEY_4       2  '4
define KEY_1       3  '1
define KEY_0       4  '0
define KEY_8       5  '8
define KEY_5       6  '5
define KEY_2       7  '2
define KEY_Kreuz   8  '#
define KEY_9       9  '9
define KEY_6       10 '6
define KEY_3       11 '3
define KEY_Nicht   12 'keine Taste gedrückt

' *** Definition LCD-Ports ***
define lcd_port byteport[2]
define lcd_rw port[13]
define lcd_rs port[14]
define lcd_e  port[15]

' *** ASCII-Codes ***
' (benötigt auch keinen Speicherplatz, ist nur Programmierhilfe !!)
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 Apostro_U &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
define Nicht     &HFE

'************************************************************************
'*** Beginn Hauptprogramm ***********************************************
#start
Intervall = 15
  gosub LCD_INIT
  last_minute=(-1)
  gosub Text_Programm_Name
  pause 50
  gosub LCD_CLS

#werteausgabe
 gosub ifkey
  if lcd_param = stern then gosub Menue_I
  if lcd_param = Stern or lcd_param = Kreuz then gosub LCD_CLS 'm' Bild_neu
'm' lcd_param = Zeile2 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
lcd_param = Zeile1 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile

   'print " °C ; Lux;hPa"                      ' Ausgabe über SerPort
for I = 0 to 13
  looktab Tab_text_Kopfzeile, I, lcd_param
  gosub LCD_WRITECHAR
next I
looktab temptable, ad_temp, temperatur
'lux = ad_lux * 75 / 10  ' Umwandlung in Lux-Wert
lux = ad_lux
Luftdruck = ad_Luft * 50 / 51               ' Anpassung Tabelle
if Luftdruck * 107 mod 100 > 50 then Luftdruck = (Luftdruck * 107 / 100) + 2 else Luftdruck = Luftdruck * 107 / 100 + 1    ' Test
' Anpassung da Betriebsspannung am Luftdruckmodul nicht 5.1V sondern 4.93V sind
looktab Lufttable, Luftdruck, Luftdruck
day_ = day : Month_ = Month : Year_ = Year : Hour_ = Hour : Minute_ = Minute : second_ = second
if minute_ <> last_minute and intervall > 0 then gosub mesz_intervall
if intervall=60 and minute_>0 then last_minute=60
gosub schreibe_wert
'm'
'lcd_param = Zeile4 : gosub LCD_WriteCMD        ' Wechsel in die vierte Zeile
'gosub schreibe_Datum
'lcd_param = Leerz : gosub LCD_WRITECHAR
'lcd_param = Leerz : gosub LCD_WRITECHAR
'gosub Schreibe_Zeit
goto werteausgabe

end
' *** Ende Hauptprogramm ************************************************
' ***********************************************************************
' *** Beginn Unterprogramme *********************************************

#Menue_I
  'gosub Bild_neu
  gosub LCD_CLS
  ' 1 - Datum/Zeit
  lcd_param = Zeile1 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
  lcd_param = Eins : gosub LCD_WRITECHAR
  gosub Text_Leerz_Minus_Leerz
  gosub Text_Datum
  lcd_param = SStrich : gosub LCD_WRITECHAR
  gosub Text_Zeit
  ' 2 - Intervall xx min
  lcd_param = Zeile2 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
  lcd_param = Zwei : gosub LCD_WRITECHAR
  gosub Text_Leerz_Minus_Leerz
  gosub Text_Intervall
  lcd_param = leerz : gosub LCD_writechar
  lcd_param = Null + INTERVALL / 10 : gosub LCD_WRITECHAR
  lcd_param = Null + Intervall mod 10 : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  gosub Text_min
  pause 80
  'm' lcd_param = Zeile4 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
   lcd_param = Zeile2 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
 ' 3 - Meßwerte zum PC
  lcd_param = drei : gosub LCD_WRITECHAR
  gosub Text_Leerz_Minus_Leerz
  gosub Text_Meszwerte
  gosub Text_zumPC
  gosub lesekey
  if lcd_param = Stern or lcd_param = Kreuz then return
  if lcd_param = eins then gosub Eingabe_Zeit
  if lcd_param = zwei then gosub Eingabe_Intervall
  if lcd_param = drei then gosub Meszwert_laden
  goto Menue_I
return

#Eingabe_Zeit
  gosub LCD_CLS
  'gosub Text_Programm_name
  lcd_param = Zeile1 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
  gosub Text_Zeit
  lcd_param = Dpunkt : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  gosub schreibe_Zeit
  lcd_param = Zeile1+6 : gosub LCD_WriteCMD
  gosub LCD_Blink_on
  gosub lesekey
  if lcd_param = stern then return
  if lcd_param = Kreuz then goto eingabe_Datum
  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 = RPfeil : gosub lcd_writechar
  lcd_param = Kreuz  : gosub lcd_writechar
  gosub LCD_links
  gosub lesekey
  if lcd_param <> kreuz then goto Eingabe_Zeit
  hour = hour_ : minute = minute_ : second = second_
 #eingabe_datum

 lcd_param = Zeile2 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
 gosub Text_Datum
  lcd_param = Dpunkt : gosub LCD_WRITECHAR
  gosub schreibe_datum
  lcd_param = Zeile2+6: gosub LCD_WriteCMD
   gosub lesekey
   if lcd_param = stern then goto eingabe_Zeit
   if lcd_param = Kreuz then return
   Day_= key
   gosub lesekey : day_= day_* 10 + key
    if day_ > 31 then goto eingabe_datum
  lcd_param = Punkt : gosub lcd_writechar
  gosub lesekey : Month_= key
  gosub lesekey : Month_= month_* 10 + key
    if Month_ > 12 then goto eingabe_datum
  lcd_param = Punkt : gosub lcd_writechar
  gosub lesekey : Year_= key
  gosub lesekey : year_= key
  gosub lesekey : Year_= key
  gosub lesekey : year_= year_* 10 + key
  lcd_param = RPfeil : gosub lcd_writechar
  lcd_param = Kreuz  : gosub lcd_writechar
  gosub LCD_links
  gosub lesekey
  if lcd_param = stern or lcd_param <> kreuz then goto eingabe_datum
  day = day_ : Month = Month_ : Year = year_
  Gosub LCD_Blink_off
return

#Bild_neu  'löscht gesamtes LCD-Display und gibt den Programmnamen aus
  gosub LCD_cls
  gosub Text_Programm_Name
return

#Eingabe_Intervall
' print "Intervall (1-60 min): ";          ' Ausgabe über SerPort
  gosub LCD_CLS
  'gosub Text_Programm_name
  lcd_param = Zeile1 : gosub LCD_WriteCMD   ' Wechsel in die dritte Zeile
  gosub Text_Intervall
  lcd_param = Zeile2 : gosub LCD_WriteCMD   ' Wechsel in die vierte Zeile
  for I = 0 to 5
    looktab Tab_Text_Eins_Sechzig, I, lcd_param
    gosub LCD_WRITECHAR
  next I
  gosub Text_min
  lcd_param = rKlammer : gosub LCD_WRITECHAR
  lcd_param = Dpunkt : gosub LCD_WRITECHAR
  lcd_param = leerz : gosub LCD_WRITECHAR
  gosub LCD_Blink_on
   gosub lesekey
   if lcd_param = stern then return
   if lcd_param = kreuz then goto Eingabe_Intervall
   intervall= key
   gosub lesekey
   if lcd_param = kreuz or lcd_param = stern then goto Eingabe_Intervall else intervall = intervall * 10 + key
  if intervall > 60 then goto Eingabe_Intervall
  lcd_param = RPfeil : gosub lcd_writechar
  lcd_param = Kreuz  : gosub lcd_writechar
  gosub LCD_links
  gosub lesekey
  if lcd_param <> kreuz then goto Eingabe_Intervall
  gosub LCD_Blink_off
return

#mesz_intervall 'Meßintervall
  for I=0 to 60 step intervall
    if minute_= I then gosub meszwert_speichern
  next I
return

#meszwert_speichern ' speicher Meßwerte im EEPROM
  last_minute = minute_
  open# for append
  if filefree > blocksize then print# day else goto filefull
  if filefree > blocksize then print# month else goto filefull
  if Filefree > blocksize then print# year else goto filefull
  if filefree > blocksize then print# hour else goto filefull
  if filefree > blocksize then print# minute else goto filefull
  if filefree > blocksize then print# second else goto filefull
  if Filefree > blocksize then print# temperatur else goto filefull
  if filefree > blocksize then print# Lux else goto filefull
  if filefree > blocksize then print# Luftdruck else goto filefull
  print day;".";month;".";Year;" ";hour;":";minute/10;minute mod 10;":";second/10;second mod 10;"  ";
  print temperatur/10;".";temperatur mod 10;"°C ";Lux;"Lux ";Luftdruck;"hPa"
 goto fileok
 #filefull
  'gosub lcd_cls
  lcd_param = Zeile2 : gosub LCD_WriteCMD
  for I = 0 to 10
    looktab Tab_Text_EEprom_voll, I, lcd_param 'print"EEPROM voll"
    gosub LCD_WRITECHAR
  next I
  for i=1 to 25
    beep 440,2,0
    beep 200,2,0
  next
  gosub lesekey  'bleibt stehen wenn EEPROM voll
  gosub Menue_I
  #fileok
  close#
return

#meszwert_laden  'liest Meßwerte aus dem EEPROM und übertragt sie zum PC
  gosub LCD_CLS
  'gosub Text_programm_name
  for I = 0 to 18
    looktab Tab_Text_einzeln, I, lcd_param
    gosub LCD_WRITECHAR
  next I
  gosub LCD_blink_on
  gosub lesekey
  if lcd_param = stern then Flag = 1
  if lcd_param = Kreuz then Flag = 2
  gosub LCD_blink_off
  gosub LCD_CLS
  'gosub Text_programm_name
  if Flag = 0 then goto meszwert_laden 'Ziffer 1 bis 9 und Kreuz = nächstes Menü
  open# for Read
    #lese_naechsten_wert
      if EOF then goto sind_uebertragen
      input# Day_ : input# Month_ : input# Year_
      input# Hour_ : input# Minute_ : input# second_
      input# Temperatur
      input# Lux
      input# Luftdruck
      print Day_;".";Month_;".";Year_;"  ";Hour_/10;Hour_ mod 10;":";minute_/10;Minute_ mod 10;":";second_/10;second_ mod 10;"  ";
      print Temperatur/10;".";temperatur mod 10;"°C  ";
      print Lux;"Lux  ";Luftdruck;"hPa"

'lcd_param = Zeile4 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
'gosub schreibe_zeit
'lcd_param = Leerz : gosub LCD_WRITECHAR
'lcd_param = Leerz : gosub LCD_WRITECHAR
'gosub Schreibe_Datum
gosub schreibe_wert
if flag=1 then goto lese_naechsten_wert
#einzelwert
gosub lesekey
 if lcd_param = stern then goto meszwert_löschen
 if lcd_param <> Kreuz then goto einzelwert
 goto lese_naechsten_wert
 #sind_uebertragen
 Flag=0 ' muß wieder zurückgesetzt werden für nächste Abfrage
' Ende Übertr
  print "Ende uebertr. ->#"                 ' Ausgabe über SerPort
  lcd_param = Zeile2 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
  for I = 0 to 19
    looktab Tab_Text_Ende_uebertr, I, lcd_param
    gosub LCD_WRITECHAR
  next I
  gosub LCD_links
  gosub LCD_Blink_on
  gosub lesekey
  if lcd_param <> kreuz then goto sind_uebertragen
#meszwert_löschen
gosub lcd_cls
'gosub Text_Programm_name
  'print "Meßwerte löschen? ->#"                 ' Ausgabe über SerPort
  lcd_param = Zeile1 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
  gosub Text_Meszwerte
  lcd_param = Zeile2 : gosub LCD_WriteCMD        ' Wechsel in die zweite Zeile
  for I = 0 to 18
    looktab Tab_Text_loeschen, I, lcd_param
    gosub LCD_WRITECHAR
  next I
  'gosub LCD_links
  gosub lesekey
  if lcd_param = stern then gosub LCD_blink_off
  if key_nr = key_stern then return
  if lcd_param <> Null then goto meszwert_löschen
  open# for write
  close#
  gosub LCD_blink_off
return

#lesekey ' wartet auf Tastatureingabe
  #loop
    lcd_param = &H1F
    for key_nr = 0 to 11
      looktab keycodes, key_nr, compare
      if abs(keyboard-compare) < 4 then gosub HANDLE_LCD_KEY
      if lcd_param >= Kreuz and <= neun then return
    next
  goto loop

#Ifkey  ' prüft ob Tastatur gedrückt wurde
  #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

#schreibe_wert ' Ausgabe auf LCD-Display
 lcd_param = Zeile2 : gosub LCD_Writecmd
 if temperatur < 0 then lcd_param = minus
 if temperatur < 0 then gosub lcd_writechar
 if temperatur < 0 then goto schreibe_wert_zehner
 if temperatur>=1000 then lcd_param=null+temperatur/1000 else lcd_param=Leerz ' blendet führen
 gosub lcd_writechar
 #schreibe_wert_zehner
 if temperatur < 0 then temperatur = temperatur * (-1)
 if temperatur>=100 then lcd_param=null+temperatur/100 else lcd_param=Leerz ' blendet führende nullen aus
 gosub lcd_writechar
 lcd_param = null + temperatur mod 100 / 10 : gosub lcd_writechar
 lcd_param = punkt : gosub lcd_writechar
 lcd_param = null + temperatur mod 100 mod 10 : gosub lcd_writechar
 lcd_param = leerz :gosub lcd_writechar
 lcd_param = null + lux / 1000 : gosub lcd_writechar
 lcd_param = null + lux mod 1000 / 100 : gosub lcd_writechar
 lcd_param = null + lux mod 1000 mod 100 / 10 : gosub lcd_writechar
 lcd_param = null + lux mod 1000 mod 100 mod 10 : gosub lcd_writechar
 lcd_param = leerz :gosub lcd_writechar
 lcd_param = null + Luftdruck / 1000 : gosub lcd_writechar
 lcd_param = null + Luftdruck mod 1000 / 100 : gosub lcd_writechar
 lcd_param = null + Luftdruck mod 1000 mod 100 / 10 : gosub lcd_writechar
 lcd_param = null + Luftdruck mod 1000 mod 100 mod 10 : gosub lcd_writechar
 lcd_param = leerz :gosub lcd_writechar
 lcd_param = leerz :gosub lcd_writechar
return

#schreibe_Datum ' Datum auf LCD-Display ausgeben
   lcd_param = NULL + Day_ / 10 : gosub LCD_WRITECHAR
   lcd_param = NULL + day_ mod 10 : gosub LCD_WRITECHAR
   lcd_param = punkt : gosub LCD_WRITECHAR
   lcd_param = NULL + Month_ / 10 : gosub LCD_WRITECHAR
   lcd_param = NULL + Month_ mod 10 : gosub LCD_WRITECHAR
   lcd_param = punkt : gosub LCD_WRITECHAR
   if Year_ < 80 then lcd_param = Zwei else lcd_param = Eins
   gosub LCD_WRITECHAR               ' Jahr >= 2000 erkennen !!!
   if Year_ < 80 then lcd_param = Null else lcd_param = Neun
   gosub LCD_WRITECHAR               ' Jahr >= 2000 erkennen !!!
   lcd_param = NULL + Year_ / 10 : gosub LCD_WRITECHAR
   lcd_param = NULL + Year_ mod 10 : gosub LCD_WRITECHAR
return

#Schreibe_Zeit ' Zeit auf LCD-Display ausgeben
   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
return

#HANDLE_LCD_KEY  ' ----- Tastennummer als Hex-Wert zurück
  key = 13
  looktab keynr_key, key_nr, key
  looktab keynr_LCDparam, key_nr, lcd_param
  if lcd_param >= Kreuz and <= Neun then beep 400,10,0
  if lcd_param >= Null and <= Neun then gosub LCD_writechar
  Pause 2
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


#LCD_CLS  ' Display loeschen
  lcd_param = &H02 : gosub LCD_WRITECMD
  lcd_param = &H01 : gosub LCD_WRITECMD
return

' Zeichen blinken on/off
#LCD_Blink_off  ' Cursor Blinken aus
  lcd_param = &B00001100
  gosub LCD_WRITECMD
return

#LCD_Blink_on ' Cursor Blinken an
  lcd_param = &B00001101
  gosub LCD_WRITECMD
return

#LCD_Links  ' Cursor 1 Zeichen nach links schieben
  lcd_param = &B00010000 : gosub LCD_WRITECMD
return

#LCD_WRITECMD  ' LCD-Kommando
  lcd_buf = OFF : goto LCD_WRITE

#LCD_WRITECHAR  ' Zeichenausgabe
  lcd_buf = &B00100000

#LCD_WRITE  ' Kommando oder Zeichen an Display senden
  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
' *** Ende LCD-Interface ***
' *** Ende Unterprogramme ***
'***********************************************************************
' *** Tastatur-Tabellen ***
' --- Verarbeitung des Tastaturereignisses anhand der Tastennummer ---
' ----- Vergleichstabelle
table keynr_key
10 7 4 1 0 8 5 2 11 9 6 3 12
tabend

table keynr_lcdparam
Stern sieben vier eins null acht fünf zwei kreuz neun sechs drei nicht
tabend

table keycodes
  0 23 46 68 90 111 132 152 173 193 214 235 243
tabend

' *** Text-Unterprogramme und Text-Tabellen ***************************
' Text-Tabellen   -> lohnt sich erst ab 5 Zeichen
#Text_Programm_Name
'***Wetter V.:1.16m**
for I = 0 to 19
  looktab Tab_Text_Programm_Name, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#text_zumPC
  for I = 0 to 6
    looktab Tab_Text_zumPC, I, lcd_param
    gosub LCD_WRITECHAR
  next I
return

#text_meszwerte
  for I = 0 to 7
    looktab Tab_Text_Meszwerte, I, lcd_param
    gosub LCD_WRITECHAR
  next I
return

#Text_Zeit
  lcd_param = Z_ : gosub LCD_WRITECHAR      '
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = kli_ : gosub LCD_WRITECHAR
  lcd_param = klt_ : gosub LCD_WRITECHAR
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_Datum
for I = 0 to 4
  looktab Tab_Text_Datum, I, lcd_param
  gosub LCD_WRITECHAR
next I
return

#Text_min
  lcd_param = klm_ : gosub LCD_WRITECHAR      '
  lcd_param = kli_ : gosub LCD_WRITECHAR
  lcd_param = kln_ : gosub LCD_WRITECHAR
return

#Text_Intervall
  for I = 0 to 8
    looktab Tab_Text_Intervall, I, lcd_param
    gosub LCD_WRITECHAR
  next I
return

table Tab_Text_Datum
'Datum
  D_ kla_ klt_ klu_ klm_
tabend

table Tab_Text_Ende_uebertr
'Ende übertr.      ->#
  E_ kln_ kld_ kle_ Leerz ue_ klb_ kle_ klr_ klt_ klr_ Punkt Leerz
  Leerz Leerz Leerz Leerz Leerz RPfeil Kreuz
tabend

table Tab_Text_zumPC
' zum PC
  Leerz klz_ klu_ klm_ Leerz P_ C_
tabend

table Tab_Text_Intervall
'Intervall
  I_ kln_ klt_ kle_ klr_ klv_ kla_ kll_ kll_
tabend

table Tab_Text_Meszwerte
'Meßwerte
  M_ kle_ sz_ klw_ kle_ klr_ klt_ kle_
tabend

table Tab_Text_loeschen
'löschen (N=*/J=0) >
  kll_ oe_ kls_ klc_ klh_ kle_ kln_ Leerz lKlammer N_ Gleich Stern
  SStrich J_ Gleich Null rKlammer leerz RPfeil
tabend

table Tab_Text_einzeln
'einzeln (N=*/J=#) >
  kle_ kli_ kln_ klz_ kle_ kll_ kln_ Leerz lKlammer N_ Gleich Stern
  SStrich J_ Gleich Kreuz rKlammer leerz RPfeil
tabend

table Tab_Text_EEprom_voll
'EEPROM voll
  E_ E_ P_ R_ O_ M_ leerz klv_ klo_ kll_ kll_
tabend

table Tab_Text_Eins_Sechzig
'(1-60
  lKlammer eins minus sechs null leerz
tabend

table Tab_Text_Kopfzeile
'  °C  Lux  hPa
  Leerz Leerz Grad C_ Leerz leerz L_ klu_ klx_ Leerz Leerz klh_ P_ Kla_
tabend

table Tab_Text_Programm_name
'***Wetter V.:1.16m**
 stern stern stern W_ kle_ klt_ klt_ kle_ klr_ leerz
  V_ Punkt Dpunkt Eins Punkt eins sechs klm_ stern stern
tabend

' *** Ende Textunterprogramme und Text-Tabellen
' *********************************************************************
' *** Sensor-Tabellen die von der Festplatte geladen werden
table temptable "tables\kty87.tab"
table Lufttable "tables\baro_smd.tab"
' *** Big-End *** Big-End *** Big-End *** Big-End *** Big-End ***
