Also ohne jetzt genau dein Programm zu kennen, verwende ich bei den Menüs folgende Technik:
Benötigt werden 3 Variablen:
Mlv (String, z.B. Länge 20)
PressedKey (String mit Länge 1)
MString (String mit Länge Mlv + Pressedkey, z.B. 21)
Im String Mlv (Menulevel) wird der aktuelle Menüpunkt gespeichert (z.B. "Main" für das Hauptdisplay, "Settings1" für Einstellungen 1. Ebene, "SetTimeDate" für Datum/Zeit-Einstellungen etc);
In PressedKey wird die gedrückte Taste gespeichert; also "U" für hoch, "D" für Runter, "M" Menü, "X" Escape/Exit... sowie "N" für keine
Taste.
Die beiden werden dann zu einem String MString vereinigt, dass der normalzustand z.B. "MainN" ist (also einfaches MString = Mlv + PressedKey). Wird eine Taste gedrückt (z.B. Menü "M"), ändert sich der String nach "MainM", wobei entsprechend dann reagiert wird.
In nem grossen Select-Case-Block werden dann alle möglichen Kombinationen abgefragt..
z.B.
Case "MainN": Anzeigen des Haupt-Display
Case "MainX": würde System abschalten
Case "MainM": ruft Menü auf
Case "Settings1X": springt von den Einstellungen zurück (z.B. nach Main)
Case "VolumeU": dreht Lautstärke hoch
...
Die Daten sind bei mir dann so angeordnet, dass bei "....N" (also keine Taste gedrückt) nur LCD-Ausgaben erfolgen und bei allen anderen Tasten
entsprechend reagiert wird.
Vorteil hier: man sieht gleich ohne Kommentare, was der jeweilige Case macht; Nachteil: Speicher wird mit den 3 Variablen belegt; aber sollte eh genug da sein.
Nach dem Case-Select-Block bzw. bei der Tastenauswertung muss die gedrückte Taste natürlich wieder auf "N" gesetzt werden.
Etwas kompliziert, aber so klappts bei mir mit den Menüs problemlos.
Hier ein Beispiel-Ausschnitt aus nem Programm von mir:
(Die Gedrückte Taste wurde hier mit mehr als nur 1 Zeichen angegeben; ein ! soll das als Befehl kennzeichnen)
Code:
'Ausschnitt aus dem Bereich der Tastenabfrage
'(Tasten bei mir per Widerstandsmatrix an einem ADC angeschlossen)
Adcval0 = Getadc(0)
If Adcval0 < 15 Then 'Keine Taste gedrückt
Key = "!NON"
End If
If Adcval0 > 14 Then Waitms 25
Key = Getkey() 'GetKey() besorgt sich aus der anliegenden Spannung die gedrückte Taste
'Umschreiben der Tasten:
If key = "E" then Key = "!ENT"
If key = "X" then Key = "!ESC"
If key = "C" then Key = "!F12"
If key = "U" then Key = "!UP"
If key = "D" then Key = "!DWN"
If key = "L" then Key = "!LFT"
If key = "R" then Key = "!RIG"
'Ausschnitt aus Bereich: Datum einstellen: Jahr gewählt
Case "SetDateY!NON" 'Zeit prüfen, Timer stoppen und Zeit anzeigen
Checktime
Stop Timer1
Lcd1 = "<Set Date>"
Lcd3 = " " + Strdate
Lcd4 = " " + Chr(1)
Case "SetDateY!RIG" : Mlv = "SetDateM" 'Zum Monat wechseln
Case "SetDateY!UP" : Incr Tyear 'Jahr erhöhen
Case "SetDateY!DWN" : Decr Tyear 'Jahr erniedrigen
Case "SetDateY!ENT" 'Jahr übernehmen und vorher gestoppten Timer neu starten
Mlv = "TimeDate2"
Start Timer1
Case "SetDateY!ESC" : Mlv = "TimeDate2" 'Zurück zu den Zeiteinstellungen
Lesezeichen