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