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







Zitieren

Lesezeichen