'********************************************************************
' System  :  C-Control/BASIC mit Microprozessor MC68HC05B6
' Programm:  LAkku.bas               
' Version :  V1.01
' Autor   :  (c) DG1XPZ 16.08.1997
' Länge   :  4086 Byte     + 1152 byte werden für Daten benötigt !!
' Funktion:  Aufnehmen der Ladekennlinie eines Akkus
' Systemvoraussetzungen:
' - C-Control/Basic-Modul
' - Applicationsboard mit angeschlossenem Display und Tastatur
' Schwerpunkt:
' - Speichern der Weßwerte im EEPROM
' - Übertragen der Daten aus EEPROM zum PC (Terminalprogramm)
' Hinweise:
' - AD1-Eingang  = Spannung max 2,5V mit 10/12/12.5/15/25V-Sensor
' - es darf auf keinen Fall das Funkuhrmodul angeschlossen werden
' Meßwertaufzeichnung:
' - Format: Stunde, Minute, Spannung
' - alle 5 min werden die Meszwerte aufgezeichnet (im EEPROM)
'   (ungefähr [16h a 5 min] x [3 Meßwerte a 2 Byte] = 1152 Byte Speicherplatz im
'    EEPROM werden dafür benötigt [max. 1728 Byte bei 24h-Messung])
'
' Versionsgeschichte:
' V1.01: - Verwendung von Servivestecker (CControl) ermöglichen (12.5V - Sensor)
'          sowie Sensoren 10/12/15/25V (Menüabfrage eingefügt)
' Programmbeschreibung:
' Nach dem Start des Programms, und Ausgabe der Programmversion wird die
' Ausgabe der Meßwerte der letzten Aufzeichnung angeboten. Eine Bestätigung
' mit der RAUTE-Taste beginnt sofort mit der Übertragung der Meßwerte über
' die serielle Schnittstelle des µComputers. Am PC sollte vorher ein Terminal-
' programm gestartet werden. Die Meßwerte werden in Tabellenform so übertragen
' (zum PC)/aufgezeichnet(im EEPROM), daß sie problemlos in Excel als Diagramm
' ausgewertet werden können. Jede andere Taste bewirkt das VERNEINEN.
' Jetzt wird der verwendete Spannungssensor abgefragt.
' Danach kann die max. Meßzeit eingegeben werden, anschließend beginnt sofort
' die Messung mit Ausgabe der Spannung und der Meßzeit.
' Bei fehlendem Akku wird eine Fehlermeldung ausgegeben.
' Sollen die aufgezeichneten Meßwerte zum PC übertragen werden, muß
' das Programm neu gestartet werden (Reset+Start oder Power OFF+ON)
' Erklärung wie oben.
'********************************************************************


' *** Variablen-Definition *** (Word=2byte, Byte =1byte)  max. 24byte Variablen !!!
define key word               '01-02  Tastaturwert in Ziffernform z.B 1=1
define spannung word          '03-04

define letzte_minute byte     '05  für Zeitsteuerungen
define key_nr byte            '06  Nummer der Taste für Tastaturabfrage
define compare byte           '07  für Tastaturabfrage
define lcd_buf byte           '08  für LCD-Modul
define lcd_param byte         '09  Übergabewert eines Zeichens für LCD-Modul
define lastsec byte           '10  für Zeitausgabe
define I byte                 '11  Laufvariable für Schleifen
define hour_ byte             '12
define minute_ byte           '13
define flag byte              '14 Flag
define U_Sensor byte          '15 Spannungs-Sensor merken

' *** Ende der Variablen ********
' *** Definition Symbolischer Konstanten (benötigt keinen Speicherplatz!!)

define blocksize 3
define keyboard ad[8]
define AD_Spannung ad[1]
'define letzte_minute 0

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 ***
define Zeile1 &H80       'Display-Adresse für Zeile 1
define Zeile2 &HC0       'dto 2
define Zeile3 &H94       'dto 3
define Zeile4 &HD4       'dto 4


' 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 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 fuenf     &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  ***

#start
gosub LCD_INIT
letzte_minute=0

gosub text_akkuladeKennlinie

  lcd_param = 2 : gosub LCD_GOTOLINE        ' Wechsel in die zweite Zeile
  'print "V.:1.01       ->#"                 ' Ausgabe über SerPort
  lcd_param = V_ : gosub LCD_WRITECHAR      '
  lcd_param = Punkt : gosub LCD_WRITECHAR
  lcd_param = DPunkt : gosub LCD_WRITECHAR
  lcd_param = Eins : gosub LCD_WRITECHAR
  lcd_param = Punkt : gosub LCD_WRITECHAR
  lcd_param = Null : gosub LCD_WRITECHAR
  lcd_param = eins : gosub LCD_WRITECHAR
  pause 50

'  gosub lesekey
'  if lcd_param <> kreuz then goto start
  gosub alte_meszwerte
    gosub lcd_cls
  'gosub Lcd_blink_off
    gosub eingabe_Sensor
#eingabe_Meszdauer
  gosub lcd_cls
  gosub text_akkuladekennlinie
 lcd_param = 3 : gosub LCD_GOTOLINE        ' Wechsel in die zweite Zeile
' print"Meßdauer: __:__"
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = sz_ : gosub LCD_WRITECHAR
  lcd_param = kld_ : gosub LCD_WRITECHAR
  lcd_param = kla_ : gosub LCD_WRITECHAR
  lcd_param = klu_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = klr_ : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = DPunkt : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = Klh_ : gosub LCD_WRITECHAR
  lcd_param = klh_ : gosub LCD_WRITECHAR
  lcd_param = DPunkt : gosub LCD_WRITECHAR
  lcd_param = klm_ : gosub LCD_WRITECHAR
  lcd_param = klm_ : gosub LCD_WRITECHAR
  for i=1 to 5
    gosub LCD_links
  next i
    gosub LCD_blink_on

    gosub lesekey
    if lcd_param = kreuz then goto eingabe_Meszdauer
    if lcd_param = stern then goto start
    if lcd_param > zwei then goto eingabe_Meszdauer else Hour_ = key
    gosub lesekey
    if lcd_param = kreuz or lcd_param = stern then goto eingabe_Meszdauer
    if hour_ = 2 and lcd_param > drei then goto eingabe_Meszdauer else Hour_ = Hour_ * 10 + key
    lcd_param = DPunkt : gosub LCD_writechar
    gosub lesekey
    if lcd_param = kreuz or lcd_param = stern then goto eingabe_Meszdauer
    if lcd_param > fuenf then goto eingabe_Meszdauer else Minute_ = key
    gosub lesekey
    if lcd_param = kreuz or lcd_param = stern then goto eingabe_Meszdauer
    Minute_ = Minute_ * 10 + key
    lcd_param = Leerz : gosub LCD_WRITECHAR
    lcd_param = RPfeil : gosub LCD_WRITECHAR
    lcd_param = Kreuz : gosub LCD_WRITECHAR
    gosub lcd_links
    gosub lesekey
    if lcd_param <> kreuz then goto eingabe_Meszdauer
  gosub LCD_Blink_off
  gosub lcd_cls
  gosub text_akkuladekennlinie
  gosub Text_Start

  open# for write  ' Datei(EEPROM) auf Anfang setzen
  close#

  hour = 0 : minute = 0 : second = 0
  letzte_minute = minute
  gosub lcd_cls
  gosub text_akkuladekennlinie

 #werteausgabe
  lcd_param = 2 : gosub LCD_GOTOLINE        ' Wechsel in die zweite Zeile
  spannung = ad_spannung * 50 / 51
  if U_Sensor = 0 then spannung = spannung        ' Anpassung auf 0V-Spannungssensor
  if U_Sensor = 100 then spannung = spannung * 40 ' Anpassung auf 10V-Spannungssensor
  if U_Sensor = 120 then spannung = spannung * 48 ' Anpassung auf 12V-Spannungssensor
  if U_Sensor = 125 then spannung = spannung * 50 ' Anpassung auf 12.5V-Spannungssensor
  if U_Sensor = 150 then spannung = spannung * 60  ' Anpassung auf 15V-Spannungssensor
  if U_Sensor = 250 then spannung = spannung * 100 ' Anpassung auf 25V-Spannungssensor
  lcd_param = U_ : gosub LCD_Writechar
  lcd_param = gleich : gosub LCD_Writechar
  lcd_param = NULL + Spannung / 10000 : gosub lcd_writechar
  lcd_param = NULL + Spannung mod 10000 / 1000 : gosub lcd_writechar
  lcd_param = Punkt : gosub LCD_WRITECHAR
  lcd_param = NULL + Spannung mod 10000 mod 1000 / 100 : gosub lcd_writechar
  lcd_param = NULL + Spannung mod 10000 mod 1000 mod 100 / 10 : gosub lcd_writechar
  lcd_param = NULL + Spannung mod 10000 mod 1000 mod 100 mod 10: gosub lcd_writechar
  lcd_param = V_ : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR

  gosub schreibezeit

  if ad_Spannung = 0 then goto Fehler

  if hour=0 and minute = 0 and second <= 3 then gosub meszwert_uebertragen  'erster Meszwert

' Zeichnet die Daten alle 5min auf
  if minute <> letzte_minute and ( minute=0 or minute=5 or minute=10 or minute=15 or minute=20 or Minute =25) then gosub meszwert_uebertragen
  if minute <> letzte_minute and ( minute=30 or minute=35 or minute=40 or minute=45 or minute=50 or Minute =55) then gosub meszwert_uebertragen

'for i=0 to 55 step 5  'noch testen !! ob Tausch für obere Reihe= -70Byte!!!!
' If minute <> letzte_minute and Minute=I then gosub meszwert_uebertragen
'next i

  if hour > hour_ then goto ende
  if hour >=hour_ and minute >=minute_ then goto ende

  goto werteausgabe

end

' *************************************************************************************
' Ausgabe auf Terminal-Programm mit Text-Aufzeichnung in Datei
#Meszwert_uebertragen
  print hour;":";minute / 10;minute mod 10;";";
  print Spannung/10000;Spannung mod 10000/1000;",";Spannung mod 10000 mod 1000/100;
  print Spannung mod 10000 mod 1000 mod 100 / 10;Spannung mod 10000 mod 1000 mod 100 mod 10  ' Ausgabe über SerPort
  gosub meszwert_speichern
return

#Eingabe_Sensor  ' Achtung Sensor-Abfrage 3-Stellig
U_Sensor = 0
 lcd_param = Zeile3 : gosub LCD_WriteCMD
for I = 0 to 9
 looktab Tab_Text_xxU_Sensor_1, I, lcd_param
 gosub LCD_WRITECHAR
next I
lcd_param = Zeile4 : gosub LCD_WriteCMD
for I = 0 to 19
  looktab Tab_Text_xxU_Sensor_2, I, lcd_param
  gosub LCD_WRITECHAR
next I
lcd_param = Zeile3+10 : gosub LCD_WriteCMD
 lcd_param = NULL + U_Sensor / 100 : gosub lcd_writechar
 lcd_param = NULL + U_Sensor mod 100 / 10 : gosub lcd_writechar
 lcd_param = punkt : gosub lcd_writechar
 lcd_param = NULL + U_Sensor mod 100 mod 10 : gosub lcd_writechar
 lcd_param = V_ : gosub LCD_WRITECHAR
 lcd_param = Zeile3+10 : gosub LCD_WriteCMD
gosub lesekey
 if lcd_Param = kreuz or Lcd_param = stern then goto eingabe_Sensor
 U_Sensor = key
gosub lesekey
 if lcd_param = stern or lcd_param = kreuz then goto eingabe_Sensor
 U_Sensor = U_Sensor * 10 + key
 if U_Sensor <> 0 and U_Sensor <> 10 and U_Sensor <> 12 and U_Sensor <> 15 and U_Sensor <> 25 then goto Eingabe_Sensor
 lcd_param = punkt : gosub LCD_WRITECHAR
 gosub lesekey
 if lcd_param = stern or lcd_param = kreuz then goto eingabe_Sensor
 U_Sensor = U_Sensor * 10 + key
 if U_Sensor <> 0 and U_Sensor <> 100 and U_Sensor <> 120 and U_sensor <> 125 and U_Sensor <> 150 and U_Sensor <> 250 then goto Eingabe_Sensor
  lcd_param = Zeile3+16 : gosub LCD_WriteCMD
 gosub Text_Ja_Nein
gosub lesekey
if lcd_param <> Kreuz then goto eingabe_Sensor
return

#meszwert_speichern
  open# for append
  if filefree > blocksize then print# hour else goto filefull
  if filefree > blocksize then print# minute else goto filefull
  if Filefree > blocksize then print# spannung else goto filefull
 goto fileok
 #filefull
  lcd_param = 4 : gosub LCD_GOTOLINE
  'gosub lcd_cls
   'print"EEPROM voll"
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = P_ : gosub LCD_WRITECHAR
  lcd_param = R_ : gosub LCD_WRITECHAR
  lcd_param = O_ : gosub LCD_WRITECHAR
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = leerz : gosub LCD_WRITECHAR
  lcd_param = klv_ : gosub LCD_WRITECHAR
  lcd_param = klo_ : gosub LCD_WRITECHAR
  lcd_param = kll_ : gosub LCD_WRITECHAR
  lcd_param = kll_ : gosub LCD_WRITECHAR
  for i=1 to 25
    beep 440,2,0
    beep 200,2,0
  next
#fileok
close#
letzte_minute = minute
pause 100
return

#alte_meszwerte
'print"(alte) Meszwerte"
  lcd_param = 3 : gosub LCD_GOTOLINE
  lcd_param = lKlammer : gosub LCD_WRITECHAR
  lcd_param = kla_ : gosub LCD_WRITECHAR
  lcd_param = kll_ : gosub LCD_WRITECHAR
  lcd_param = klt_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = rKlammer : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = M_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = sz_ : gosub LCD_WRITECHAR
  lcd_param = klw_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = klr_ : gosub LCD_WRITECHAR
  lcd_param = klt_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = leerz : gosub LCD_WRITECHAR
  lcd_param = klz_ : gosub LCD_WRITECHAR
  lcd_param = klu_ : gosub LCD_WRITECHAR
  lcd_param = klm_ : gosub LCD_WRITECHAR
  lcd_param = 4 : gosub LCD_GOTOLINE        ' Wechsel in die zweite Zeile
  lcd_param = P_ : gosub LCD_WRITECHAR
  lcd_param = C_ : gosub LCD_WRITECHAR
  lcd_param = leerz : gosub LCD_WRITECHAR
  'print "uebertragen ? ->#"                 ' Ausgabe über SerPort
  gosub text_uebertragen

  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = FZeichen : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = RPfeil : gosub LCD_WRITECHAR
  lcd_param = Stern : gosub LCD_WRITECHAR
  lcd_param = SStrich : gosub LCD_WRITECHAR
  lcd_param = Kreuz : gosub LCD_WRITECHAR
  gosub LCD_Blink_on
  gosub Lcd_links
  gosub Lcd_links
  gosub lesekey
  if lcd_param <> kreuz then return
  open# for Read
    if EOF then goto sind_uebertragen
    #lese_naechsten_wert
      if EOF then goto sind_uebertragen
      input# Hour
      input# Minute
      input# Spannung
      print Hour;":";Minute / 10;minute mod 10;";";Spannung / 10000;Spannung mod 10000 / 1000;",";
      print Spannung mod 10000 mod 1000 / 100;Spannung mod 10000 mod 1000 mod 100 / 10;Spannung mod 10000 mod 1000 mod 100 mod 10
    goto lese_naechsten_wert
 #sind_uebertragen
  gosub lcd_cls
  gosub text_akkuladekennlinie
   'Ausgabe letzter Meßwert auf LCD-Anzeige
  lcd_param = 3 : gosub LCD_GOTOLINE        ' Wechsel in die zweite Zeile
  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 = Leerz : gosub LCD_WRITECHAR
  lcd_param = NULL + Spannung / 10000 : gosub lcd_writechar
  lcd_param = NULL + Spannung mod 10000 / 1000: gosub lcd_writechar
  lcd_param = Punkt : gosub LCD_WRITECHAR
  lcd_param = NULL + Spannung mod 10000 mod 1000 / 100 : gosub lcd_writechar
  lcd_param = NULL + Spannung mod 10000 mod 1000 mod 100 / 10 : gosub lcd_writechar
  lcd_param = NULL + Spannung mod 10000 mod 1000 mod 100 mod 10 : gosub lcd_writechar
  lcd_param = V_ : gosub LCD_WRITECHAR

'  print "Ende uebertr. ->#"                 ' Ausgabe über SerPort
  lcd_param = 4 : gosub LCD_GOTOLINE        ' Wechsel in die zweite Zeile
  lcd_param = E_ : gosub LCD_WRITECHAR
  lcd_param = kln_ : gosub LCD_WRITECHAR
  lcd_param = kld_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = Leerz: gosub LCD_WRITECHAR
  gosub text_uebertragen
  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
  gosub LCD_links
  gosub LCD_Blink_on
  gosub lesekey
  if lcd_param <> kreuz then goto sind_uebertragen
  gosub LCD_Blink_off
return

#ende
  lcd_param = 4 : gosub LCD_GOTOLINE
  lcd_param = E_ : gosub LCD_WRITECHAR       ' Ausgabe von "Ende"  am LCD
  lcd_param = kln_ : gosub LCD_WRITECHAR
  lcd_param = kld_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
for i=1 to 50
  beep 440,2,0
  beep 200,2,0
next
#ende2
goto ende2
return

#Text_Start
  'Ausgabe von "     Start  ->#"
  lcd_param = 4 : gosub LCD_GOTOLINE
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = S_ : gosub LCD_WRITECHAR
  lcd_param = klt_ : gosub LCD_WRITECHAR
  lcd_param = kla_ : gosub LCD_WRITECHAR
  lcd_param = klr_ : gosub LCD_WRITECHAR
  lcd_param = klt_ : 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
  gosub LCD_links
  gosub LCD_Blink_on
  gosub lesekey
  if lcd_param <> kreuz then goto Start
  gosub LCD_Blink_off
  return

#Fehler
  'Ausgabe von "!? Akku-Fehler ?! ->#"
  lcd_param = 4 : gosub LCD_GOTOLINE
  lcd_param = AZeichen : gosub LCD_WRITECHAR
  lcd_param = FZeichen : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = A_ : gosub LCD_WRITECHAR       ' Ausgabe von "Ende"  am LCD
  lcd_param = klk_ : gosub LCD_WRITECHAR
  lcd_param = klk_ : gosub LCD_WRITECHAR
  lcd_param = klu_ : gosub LCD_WRITECHAR
  lcd_param = Minus : gosub LCD_writechar
  lcd_param = F_ : gosub LCD_WRITECHAR       ' Ausgabe von "Ende"  am LCD
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = klh_ : gosub LCD_WRITECHAR
  lcd_param = kll_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = klr_ : gosub LCD_WRITECHAR
  lcd_param = Leerz : gosub LCD_WRITECHAR
  lcd_param = FZeichen : gosub LCD_WRITECHAR
  lcd_param = AZeichen : gosub LCD_WRITECHAR
for i=1 to 50
  beep 440,2,0
  beep 200,2,0
next
lcd_param = Leerz: gosub LCD_WRITECHAR
lcd_param = RPfeil : gosub LCD_WRITECHAR
lcd_param = Kreuz : gosub LCD_WRITECHAR
gosub LCD_links
gosub LCD_Blink_on
gosub lesekey
if lcd_param <> kreuz then goto Fehler
gosub LCD_Blink_off
goto start

#text_akkuladekennlinie
' print:print "Akku-Ladekennlinie"                       ' Ausgabe über SerPort
' Ausgabe von "Akku-Ladekennlinie"  am Display
  lcd_param = stern : gosub LCD_WRITECHAR
  lcd_param = A_ : gosub LCD_WRITECHAR
  lcd_param = klk_ : gosub LCD_WRITECHAR
  lcd_param = klk_ : gosub LCD_WRITECHAR
  lcd_param = klu_ : gosub LCD_WRITECHAR
  lcd_param = Minus : gosub LCD_WRITECHAR
  lcd_param = L_ : gosub LCD_WRITECHAR
  lcd_param = kla_ : gosub LCD_WRITECHAR
  lcd_param = kld_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = klk_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = kln_ : gosub LCD_WRITECHAR
  lcd_param = kln_ : gosub LCD_WRITECHAR
  lcd_param = kll_ : gosub LCD_WRITECHAR
  lcd_param = kli_ : gosub LCD_WRITECHAR
  lcd_param = kln_ : gosub LCD_WRITECHAR
  lcd_param = kli_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = stern : gosub LCD_WRITECHAR
return

#text_uebertragen
  lcd_param = ue_ : gosub LCD_WRITECHAR      '
  lcd_param = klb_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = klr_ : gosub LCD_WRITECHAR
  lcd_param = klt_ : gosub LCD_WRITECHAR
  lcd_param = klr_ : gosub LCD_WRITECHAR
  lcd_param = kla_ : gosub LCD_WRITECHAR
  lcd_param = klg_ : gosub LCD_WRITECHAR
  lcd_param = kle_ : gosub LCD_WRITECHAR
  lcd_param = kln_ : gosub LCD_WRITECHAR
return

#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

#schreibezeit
   ' print "Zeit: ";hour;":";minute;":";second
   lcd_param = klt_ : gosub LCD_WRITECHAR
   lcd_param = Gleich : 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
   pause 50
return

#Text_Ja_Nein
  lcd_param = RPfeil : gosub LCD_WRITECHAR
  lcd_param = Stern : gosub LCD_WRITECHAR
  lcd_param = SStrich : gosub LCD_WRITECHAR
  lcd_param = Kreuz : gosub LCD_WRITECHAR
  gosub LCD_Links : gosub LCD_Links
return


' ----- 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 = fuenf
  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 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

' Display loeschen
#LCD_CLS
  lcd_param = &H02 : gosub LCD_WRITECMD
  lcd_param = &H01 : gosub LCD_WRITECMD
return

' Zeichen blinken on/off
#LCD_Blink_off
  lcd_param = &B00001100          ' Cursor Blinken aus
  gosub LCD_WRITECMD
return

#LCD_Blink_on
  lcd_param = &B00001101          ' Cursor Blinken an
  gosub LCD_WRITECMD
return

' Cursor 1 Zeichen nach links schieben
#LCD_Links
  lcd_param = &B00010000
  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

' Zeilenwechsel
#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
tabend

table Tab_Text_xxU_Sensor_1
' "U-Sensor: "
  U_ Minus S_ kle_ kln_ kls_ klo_ klr_ dpunkt Leerz
tabend

table Tab_Text_xxU_Sensor_2
' "(0;10;12;12.5;15;25)"
  lklammer null semikol eins null semikol eins zwei semikol
  eins zwei punkt fuenf semikol eins fuenf semikol zwei fuenf rklammer
tabend
