molleonair
26.02.2006, 11:41
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
$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
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
$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