Sieht gut aus, sieht aber auh nach viel Arbeit aus!!! Respekt =D>
Wie wärs wenn du das als Artikel ins Wiki schreibst?
Hallo ...
für alle die gern ein LCD Menue in Ihren Code einbauen würden und nicht wissen wie oder zu faul sind hab ich ein universelles Menue geschrieben
das kinderleicht angepasst werden kann,da das eigentliche Menue aus einem Datensatz besteht in dem man einfach die Texte und die Sprungmarken anpasst.
Funktionieren tut das ganze wie n altes Handy Menu
Taste hoch blättert in der aktuellen ebene einen eintrag hoch
Taste runter einen runter,Taste rechts springt in das jeweilige Untermenue und Taste links wieder zurueck in die höhere Ebene
Es können pro Menue ebene maximal 9 Einträge verwendet werden
und maximal 255 Menue-Punkte in allen Ebenen
weiterhin sind maximal 99 Ereignisse auf die Menuepunkte möglich
(kann noch erhöht werden)
zum Testen kann der folgende code einfach im Simulator getestet werden
die Tastenbelegung ist:
Taste hoch pinc.1
runter pind.1
links pind.2
rechts pind.0
das entspricht den Pfeilen auf der Tastatur
weiter Hinweise zum anpassen und infos stehen im code..
alle profis unter euch können gern tips zum optimieren geben,da dies auch
bestimmt möglich ist und mir mal erklären warum manche pins von port A
wärend der ausführung des codes ihren level ändern
ansonsten viel spaß gruß Daniel
achso der code ist fürn 4 zeilen 20 zeichen menue
wer weniger zeilen hat muß die locate und lcd anweisungen ändern
Code:$regfile = "m16def.dat" Dim Menuepunkt As Byte Menuepunkt = 2 Dim Menuevor As Byte Menuevor = 2 Dim Menuezurueck As Byte Menuezurueck = 2 Dim Menuehoch As Byte Menuehoch = 2 Dim Menuerunter As Byte Menuerunter = 2 Dim Menuecase As Byte Dim Taste As Byte Dim Schonbearbeitet As Bit Declare Sub Menueupdate(submenupunkt As Byte , Submenucase As Byte , Submenuvor As Byte , Submenuzurueck As Byte , Submenuhoch As Byte , Submenurunter As Byte ) Config Portc = Input Config Portd = Input Tastehoch Alias Pinc.1 'hier definiert ihr die tastenpins Tasterunter Alias Pind.1 Tastelinks Alias Pind.2 Tasterechts Alias Pind.0 Schonbearbeitet = 0 Taste = 0 Startzeile: If Tastehoch = 1 Then Taste = 1 Goto Testen End If If Tasterunter = 1 Then Taste = 2 Goto Testen End If If Tastelinks = 1 Then Taste = 3 Goto Testen End If If Tasterechts = 1 Then Taste = 4 Goto Testen End If Taste = 0 Schonbearbeitet = 0 Goto Startzeile 'hier steht der weitere code Testen: If Schonbearbeitet = 0 Then Goto Neumenu Goto Startzeile Neumenu: Schonbearbeitet = 1 Select Case Taste Case 1 : Menuepunkt = Menuehoch 'je nach taste wird der neue menue-punkt gesetzt Case 2 : Menuepunkt = Menuerunter Case 3 : Menuepunkt = Menuezurueck Case 4 : Goto Caseauswertung End Select Menueupdaten: Call Menueupdate(menuepunkt , Menuecase , Menuevor , Menuezurueck , Menuehoch , Menuerunter) 'menue wird erneuert Menueende: Print "menu runter " ; Menuerunter Print "menue hoch " ; Menuehoch Print "menue vor " ; Menuevor Print "menue zurück " ; Menuezurueck Print "menuecase" ; Menuecase Goto Startzeile Caseauswertung: If Menuecase = 0 Then Menuepunkt = Menuevor Goto Menueupdaten End If Cls Menuepunkt = 2 Menuehoch = 2 Menuerunter = 2 Menuevor = 2 Menuezurueck = 2 'Select Case Menuecase 'hier kann die auswertung der ereignisse erfolgen 'Case 1 :goto .. 'vor rückkehr zur tasten abfrage muß menuecase wieder auf 0 'case 2 :goto ... 'gesetzt werden 'case 3 :goto ... 'End Select Locate 2 , 1 'dies dient nur zum test Lcd "Ereigniss " ; Menuecase ' "" Menuecase = 0 Goto Menueende Sub Menueupdate(submenupunkt As Byte , Submenucase As Byte , Submenuvor As Byte , Submenuzurueck As Byte , Submenuhoch As Byte , Submenurunter As Byte ) 'sub zum erneuern des menues Cls Local Beendet As Byte Local Zahler As Byte Local Kurzstring As String * 4 Local Langstring As String * 20 Local Zeile1 As Byte Menurunter: Submenupunkt = Submenupunkt + 2 'text und menuepunkt für taste runter-blättern wird gesucht und ausgegeben Kurzstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(kurzstring , 1) If Kurzstring = "#" Then Locate 4 , 1 Lcd "********************" Submenupunkt = Submenupunkt - 2 Submenurunter = Submenupunkt Else Submenurunter = Submenupunkt Langstring = Lookupstr(submenupunkt , Menue) Locate 4 , 1 Lcd Langstring Submenupunkt = Submenupunkt - 2 End If Aktuell: 'text für aktuellen menuepunkt wird ausgegeben Langstring = Lookupstr(submenupunkt , Menue) Locate 3 , 1 Lcd Langstring Menuevor: Submenupunkt = Submenupunkt + 1 'text und menuepunkt für taste vor (rechts) wird gesucht und ausgegeben Kurzstring = Lookupstr(submenupunkt , Menue) Langstring = Left(kurzstring , 1) If Langstring = "!" Then Langstring = Right(kurzstring , 2) Submenucase = Val(langstring) Submenupunkt = Submenupunkt - 1 Goto Menuehoch End If Submenucase = 0 Kurzstring = "#" + Kurzstring Zahler = 0 Beendet = 0 Do Incr Zahler Langstring = Lookupstr(zahler , Menue) If Kurzstring = Langstring Then Beendet = 1 Loop Until Beendet = 1 Zahler = Zahler + 2 Submenuvor = Zahler Submenupunkt = Submenupunkt - 1 Menuehoch: 'text und menuepunkt für taste hoch-blättern wird gesucht und ausgegeben Submenupunkt = Submenupunkt - 2 Langstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(langstring , 1) If Kurzstring = "#" Then Locate 2 , 1 Lcd "********************" Submenupunkt = Submenupunkt + 2 Submenuhoch = Submenupunkt Else Submenuhoch = Submenupunkt Langstring = Lookupstr(submenupunkt , Menue) Locate 2 , 1 Lcd Langstring Submenupunkt = Submenupunkt + 2 End If Menuezuruck: Beendet = 0 'text und menuepunkt für taste zurueck (links) wird gesucht und ausgegeben Zahler = 0 Do Decr Submenupunkt Langstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(langstring , 1) If Kurzstring = "#" Then Beendet = 1 Loop Until Beendet = 1 If Submenupunkt = 0 Then Zeile1 = 1 Else Zeile1 = 0 End If Submenupunkt = Submenupunkt + 1 Langstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(langstring , 2) Kurzstring = "#" + Kurzstring Beendet = 0 Zahler = 0 Do Langstring = Lookupstr(zahler , Menue) If Langstring = Kurzstring Then Beendet = 1 Else Incr Zahler End If Loop Until Beendet = 1 Kurzstring = Lookupstr(submenupunkt , Menue) Kurzstring = Right(kurzstring , 1) Submenupunkt = Val(kurzstring) Submenupunkt = Submenupunkt * 2 Submenuzurueck = Zahler + Submenupunkt If Submenuzurueck = 2 Then If Zeile1 = 1 Then Locate 1 , 5 Lcd "Hauptmenue" Zeile1 = 0 Else Langstring = Lookupstr(submenuzurueck , Menue) Locate 1 , 5 Lcd Langstring End If Else Langstring = Lookupstr(submenuzurueck , Menue) Locate 1 , 5 Lcd Langstring End If End Sub ' hinter der # steht die menueebene dahinter steht die rücksprungadresse für diese menueebene ' zB wird aus einem eintrag der ebene #04 (zB Abstand) in die ebene #3 eintrag 1 gesprungen (031) in diesem fall nach eingänge ' und von dort gehts zurück in ebene 1 eintrag 2 (012) das wäre dann "Tests" 'nach der rücksprungadresse folgt der erste menuepunt (max 20 Zeichen)und danach dessen vorprung adresse 'zB hinter "Einstellungen" steht 07 also verzweigt das menue von dort in die unter-ebene 7 'falls aus einem Menuepunkt nicht weiter in ein Untermenue gesprungen werden soll sondern ein bestimmdes Ereigniss stattfinden soll 'dann kommt als vor-sprung-adresse (die zahl hinter dem eintrag) ein ! und eine Zahl von 1-99 diese Zahl wird dann in der variable menuecase zurueckgegeben 'zB wenn man im Menuepunkt "Akku Laden" die menue-vor taste drückt wird der wert 02 zurueckgegeben diese können dann ausgewertet werden Menue: Data "#01" , "011" , "Modus" , "02" , "Test" , "03" , "Einstellungen" , "07" , "Akku laden" , "!02" Data "#02" , "011" , "Autonom" , "!03" , "Erkunden" , "!04" , "Manuell RC" , "!05" , "Manuell-Stick" , "!06" Data "#03" , "012" , "Eingaenge" , "04" , "Ausgaenge" , "05" Data "#04" , "031" , "Kollision" , "!07" , "Abstand" , "!08" , "Richtung" , "!09" , "Spannung" , "!10" Data "#05" , "032" , "Antrieb" , "!11" , "Servos" , "06" , "Walze" , "!12" , "Lenkung" , "!13", Data "#06" , "052" , "Servo links" , "!14" , "Servo rechts" , "!15" Data "#07" , "013" , "Uhrzeit" , "08" , "Offset" , "!16" Data "#08" , "071" , "Datum" , "!17" , "Uhrzeit" , "!18" , "Jahr" , "!19" , "hallo" , "!20" Data "#EO" 'muß am ende stehen
Sieht gut aus, sieht aber auh nach viel Arbeit aus!!! Respekt =D>
Wie wärs wenn du das als Artikel ins Wiki schreibst?
naja war schon viel arbeit aber es war mir wichtig das ich mir die arbeit nur einmal mache und ich mein menue dann beliebig ändern erweitern oder abspecken kann
Da ich noch relativ neu hier bin warte ich auch erstmal auf feedback ob das prog auch nach diversen änderungen fehlerfrei läuft oder ob irgendwo noch was zu ändern ist
ich hab zwar diverse menueebenen dazugeschrieben und verzweigungen getestet da lief alles aber man weiß ja nie
Gruß Daniel
habe es mal kurz im Bascom-Simulator angetestet:
Code läuft nicht, sondern hängt sich schnell auf, weil Submenupunkt "negativ" wird.
Irgendie schießt der Code durch alle glatt Sprungmarken durch, als wenn ein paar Rücksprünge fehlen würden Menurunter/Aktuell/Menuevor/Menuehoch -> error
ich weiß zwar nicht worans ligt aber dieser hier läuft bei mir
*.bas ist im anhang
Code:$regfile = "m16def.dat" Dim Menuepunkt As Byte Menuepunkt = 2 Dim Menuevor As Byte Menuevor = 2 Dim Menuezurueck As Byte Menuezurueck = 2 Dim Menuehoch As Byte Menuehoch = 2 Dim Menuerunter As Byte Menuerunter = 2 Dim Menuecase As Byte Dim Taste As Byte Dim Schonbearbeitet As Bit Declare Sub Menueupdate(submenupunkt As Byte , Submenucase As Byte , Submenuvor As Byte , Submenuzurueck As Byte , Submenuhoch As Byte , Submenurunter As Byte ) Config Portc = Input Config Portd = Input Tastehoch Alias Pinc.1 'hier definiert ihr die tastenpins Tasterunter Alias Pind.1 Tastelinks Alias Pind.2 Tasterechts Alias Pind.0 Schonbearbeitet = 0 Taste = 0 Startzeile: If Tastehoch = 1 Then Taste = 1 Goto Testen End If If Tasterunter = 1 Then Taste = 2 Goto Testen End If If Tastelinks = 1 Then Taste = 3 Goto Testen End If If Tasterechts = 1 Then Taste = 4 Goto Testen End If Taste = 0 Schonbearbeitet = 0 Goto Startzeile 'hier steht der weitere code Testen: If Schonbearbeitet = 0 Then Goto Neumenu Goto Startzeile Neumenu: Schonbearbeitet = 1 Select Case Taste Case 1 : Menuepunkt = Menuehoch 'je nach taste wird der neue menue-punkt gesetzt Case 2 : Menuepunkt = Menuerunter Case 3 : Menuepunkt = Menuezurueck Case 4 : Goto Caseauswertung End Select Menueupdaten: Call Menueupdate(menuepunkt , Menuecase , Menuevor , Menuezurueck , Menuehoch , Menuerunter) 'menue wird erneuert Menueende: Print "menu runter " ; Menuerunter Print "menue hoch " ; Menuehoch Print "menue vor " ; Menuevor Print "menue zurück " ; Menuezurueck Print "menuecase" ; Menuecase Goto Startzeile Caseauswertung: If Menuecase = 0 Then Menuepunkt = Menuevor Goto Menueupdaten End If Cls Menuepunkt = 2 Menuehoch = 2 Menuerunter = 2 Menuevor = 2 Menuezurueck = 2 'Select Case Menuecase 'hier kann die auswertung der ereignisse erfolgen 'Case 1 :goto .. 'vor rückkehr zur tasten abfrage muß menuecase wieder auf 0 'case 2 :goto ... 'gesetzt werden 'case 3 :goto ... 'End Select Locate 2 , 1 'dies dient nur zum test Lcd "Ereigniss " ; Menuecase ' "" Menuecase = 0 Goto Menueende Sub Menueupdate(submenupunkt As Byte , Submenucase As Byte , Submenuvor As Byte , Submenuzurueck As Byte , Submenuhoch As Byte , Submenurunter As Byte ) 'sub zum erneuern des menues Cls Local Beendet As Byte Local Zahler As Byte Local Kurzstring As String * 4 Local Langstring As String * 20 Local Zeile1 As Byte Menurunter: Submenupunkt = Submenupunkt + 2 'text und menuepunkt für taste runter-blättern wird gesucht und ausgegeben Kurzstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(kurzstring , 1) If Kurzstring = "#" Then Locate 4 , 1 Lcd "********************" Submenupunkt = Submenupunkt - 2 Submenurunter = Submenupunkt Else Submenurunter = Submenupunkt Langstring = Lookupstr(submenupunkt , Menue) Locate 4 , 1 Lcd Langstring Submenupunkt = Submenupunkt - 2 End If Aktuell: 'text für aktuellen menuepunkt wird ausgegeben Langstring = Lookupstr(submenupunkt , Menue) Locate 3 , 1 Lcd Langstring Menuevor: Submenupunkt = Submenupunkt + 1 'text und menuepunkt für taste vor (rechts) wird gesucht und ausgegeben Kurzstring = Lookupstr(submenupunkt , Menue) Langstring = Left(kurzstring , 1) If Langstring = "!" Then Langstring = Right(kurzstring , 2) Submenucase = Val(langstring) Submenupunkt = Submenupunkt - 1 Goto Menuehoch End If Submenucase = 0 Kurzstring = "#" + Kurzstring Zahler = 0 Beendet = 0 Do Incr Zahler Langstring = Lookupstr(zahler , Menue) If Kurzstring = Langstring Then Beendet = 1 Loop Until Beendet = 1 Zahler = Zahler + 2 Submenuvor = Zahler Submenupunkt = Submenupunkt - 1 Menuehoch: 'text und menuepunkt für taste hoch-blättern wird gesucht und ausgegeben Submenupunkt = Submenupunkt - 2 Langstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(langstring , 1) If Kurzstring = "#" Then Locate 2 , 1 Lcd "********************" Submenupunkt = Submenupunkt + 2 Submenuhoch = Submenupunkt Else Submenuhoch = Submenupunkt Langstring = Lookupstr(submenupunkt , Menue) Locate 2 , 1 Lcd Langstring Submenupunkt = Submenupunkt + 2 End If Menuezuruck: Beendet = 0 'text und menuepunkt für taste zurueck (links) wird gesucht und ausgegeben Zahler = 0 Do Decr Submenupunkt Langstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(langstring , 1) If Kurzstring = "#" Then Beendet = 1 Loop Until Beendet = 1 If Submenupunkt = 0 Then Zeile1 = 1 Else Zeile1 = 0 End If Submenupunkt = Submenupunkt + 1 Langstring = Lookupstr(submenupunkt , Menue) Kurzstring = Left(langstring , 2) Kurzstring = "#" + Kurzstring Beendet = 0 Zahler = 0 Do Langstring = Lookupstr(zahler , Menue) If Langstring = Kurzstring Then Beendet = 1 Else Incr Zahler End If Loop Until Beendet = 1 Kurzstring = Lookupstr(submenupunkt , Menue) Kurzstring = Right(kurzstring , 1) Submenupunkt = Val(kurzstring) Submenupunkt = Submenupunkt * 2 Submenuzurueck = Zahler + Submenupunkt If Submenuzurueck = 2 Then If Zeile1 = 1 Then Locate 1 , 5 Lcd "Hauptmenue" Zeile1 = 0 Else Langstring = Lookupstr(submenuzurueck , Menue) Locate 1 , 5 Lcd Langstring End If Else Langstring = Lookupstr(submenuzurueck , Menue) Locate 1 , 5 Lcd Langstring End If End Sub ' hinter der # steht die menueebene dahinter steht die rücksprungadresse für diese menueebene ' zB wird aus einem eintrag der ebene #04 (zB Abstand) in die ebene #3 eintrag 1 gesprungen (031) in diesem fall nach eingänge ' und von dort gehts zurück in ebene 1 eintrag 2 (012) das wäre dann "Tests" 'nach der rücksprungadresse folgt der erste menuepunt (max 20 Zeichen)und danach dessen vorprung adresse 'zB hinter "Einstellungen" steht 07 also verzweigt das menue von dort in die unter-ebene 7 'falls aus einem Menuepunkt nicht weiter in ein Untermenue gesprungen werden soll sondern ein bestimmdes Ereigniss stattfinden soll 'dann kommt als vor-sprung-adresse (die zahl hinter dem eintrag) ein ! und eine Zahl von 1-99 diese Zahl wird dann in der variable menuecase zurueckgegeben 'zB wenn man im Menuepunkt "Akku Laden" die menue-vor taste drückt wird der wert 02 zurueckgegeben diese können dann ausgewertet werden 'das menue kann beliebig erweitert oder verändert werden.es ist nur das format einzuhalten. Menue: Data "#01" , "011" , "Modus" , "02" , "Test" , "03" , "Einstellungen" , "07" , "Akku laden" , "!02" Data "#02" , "011" , "Autonom" , "!03" , "Erkunden" , "!04" , "Manuell RC" , "!05" , "Manuell-Stick" , "!06" Data "#03" , "012" , "Eingaenge" , "04" , "Ausgaenge" , "05" Data "#04" , "031" , "Kollision" , "!07" , "Abstand" , "!08" , "Richtung" , "!09" , "Spannung" , "!10" Data "#05" , "032" , "Antrieb" , "!11" , "Servos" , "06" , "Walze" , "!12" , "Lenkung" , "!13", Data "#06" , "052" , "Servo links" , "!14" , "Servo rechts" , "!15" Data "#07" , "013" , "Uhrzeit" , "08" , "Offset" , "!16" Data "#08" , "071" , "Datum" , "!17" , "Uhrzeit" , "!18" , "Jahr" , "!19" , "hallo" , "!20" Data "#EO" 'muß am ende stehen
ich habe den Code noch einmal in eine andere Bascom-Installation herüberkopiert. Der ERROR ist der gleiche:
Bascom 1.11.8.1
an diesem Punkt wird bei Aktivierung Portc.1=1 oder Portd.1=1 die Variable submenupunkt=&HFDCode:131 Aktuell: 'text für aktuellen menuepunkt wird ausgegeben 132 Langstring = Lookupstr(submenupunkt , Menue)
tja ich hab die selbe Version bei mir läufts, auch aufm mega
die lokale variable submenupunkt wird ja mit aufruf der sub menueupdate auf den wert vom menuepunkt gesetz und dieser ist beim starten des progs auf 2
also mußt du mal das prog verfolgen an welcher stelle der mist reinkommt
kann sein das du HW und SW Stack erhöhen mußt damit alles stabil bleibt
bei mir ist
hwstack=32
softstack=40
framesize=32
(bei option - compile -chip einstellen)
Alles klar, das war es. Jetzt läuft es im Simulator.
Habe den Code noch ergänzt um:
Gute ArbeitCode:$hwstack = 32 $swstack = 40 $framesize = 32 Config Lcdmode = Port Config Lcdbus = 4 '4 bit mode Config Lcd = 20 * 4 Initlcd
Hallo Daniel,
prima Menü. Super Arbeit. Kann man das auch in ein Touch-Display verwenden?
zB.: dieses Set -
http://eckstein-shop.de/Mega-2560-mit-32-Touchsreen-Set
Gruß Andreas
Hallo molleonair,
dein Code „Universal LCD Menue“ ist schon prima, aber warum die 4Taster und Pin Verschwendung.
Dies finde ich nicht ganz so toll. In meinen bescheiden Code mache ich es im Programmablauf automatisch. Hier können auch bis zu 255 Menüanzeigen voreingestellt werden. Je nach „Unterprogramm“ wird auch die passende Anzeige generiert.
Mit freundlichen Grüßen
Lesezeichen