PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Universal LCD Menue



molleonair
26.02.2006, 10: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

womb@t
26.02.2006, 11:36
Sieht gut aus, sieht aber auh nach viel Arbeit aus!!! Respekt =D>
Wie wärs wenn du das als Artikel ins Wiki schreibst?

molleonair
26.02.2006, 16:45
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

-tomas-
15.03.2006, 20:01
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

molleonair
15.03.2006, 21:09
ich weiß zwar nicht worans ligt aber dieser hier läuft bei mir

*.bas ist im anhang



$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

-tomas-
16.03.2006, 08:44
ich habe den Code noch einmal in eine andere Bascom-Installation herüberkopiert. Der ERROR ist der gleiche:
BASCOM 1.11.8.1

131 Aktuell: 'text für aktuellen menuepunkt wird ausgegeben
132 Langstring = Lookupstr(submenupunkt , Menue)
an diesem Punkt wird bei Aktivierung Portc.1=1 oder Portd.1=1 die Variable submenupunkt=&HFD

molleonair
16.03.2006, 16:48
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)

-tomas-
16.03.2006, 17:03
Alles klar, das war es. Jetzt läuft es im Simulator.
Habe den Code noch ergänzt um:

$hwstack = 32
$swstack = 40
$framesize = 32

Config Lcdmode = Port
Config Lcdbus = 4 '4 bit mode
Config Lcd = 20 * 4
Initlcd

Gute Arbeit :-)

Hicki
08.09.2015, 21:08
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

fredred
18.09.2015, 12:58
Hallo molleonair (https://www.roboternetz.de/community/threads/members/16681-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

Achim S.
18.09.2015, 14:01
Hallo fredred
hab ich da was überlesen. "In meinen bescheiden Code mache ich es ...", sagst du. Würde es gern mal anschauen.
achim

fredred
18.09.2015, 15:49
Hallo Achim,

nichst überlesen! Habe ja kein Code eingestellt. Sollte doch nur ein Hinweis sein. Natürlich wenn Interesse, werde ich meine Variante zu Verfügung stellen.
Vorab ein Schnipsel:

'**** Variable für Anzeigeauswahl ****
Dim Lcd_aktualisieren As Byte 'Zähler für LCD-Anzeigen
Gosub Anzeigen
'************ Bereich für LCD -Anzeigen ***************************
Anzeigen:

'****** Startfenster *******
If Lcd_aktualisieren = 255 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd Status ; " ist Startfenster "
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " Hallo Achim "
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " Datum " ; Date$ ; " "
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " Zeit " ; Time$ ; " "
End If

'***************************

'hier zur LCD - Datenanzeige für Funk
If Lcd_aktualisieren = 254 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd Status ; " D0 | D1 | D2 "
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd "_ " ; D0 ; " _|_ " ; D1 ; " _|_ " ; D2 ; "_ "
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " Temp1: " ; Temper1 ; " ßC "
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " Temp2: " ; Temper2 ; " ßC "
End If
'***************************
'hier zur LCD - Anzeige für Poti
If Lcd_aktualisieren = 253 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd Status ; " Poti Anzeige "
Locate 2 , 2 'Cursor auf 2 Zeile, 2 Spalte
Lcd " *Werte in Volt* "
Locate 3 , 2 'Cursor auf 3 Zeile, 2 Spalte
Lcd " Poti0 = " ; W0 ; " "
Locate 4 , 2 'Cursor auf 4 Zeile, 2 Spalte
Lcd " Poti1 = " ; W1 ; " "
End If
'***************************

'hier Anzeige Touch-Werte
If Lcd_aktualisieren = 252 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd " Touch Werte lesen "
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " Achsen testen "
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " X = " ; X ; " " 'die leer Zeichen löschen den Rest
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " Y = " ; Y ; " "
End If
'***************************

'hier Anzeige Touch-Panel
If Lcd_aktualisieren = 0 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd " Touch Test "
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " ************* "
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " * ENTER * " 'die leer Zeichen löschen den Rest
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " ************* "
Wait 1 'für Test anzeigen 3 Sekunden
End If
'***************************

'hier Anzeige Beispiel Temperaturreglung
If Lcd_aktualisieren = 2 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd " Temperaturwarnung "
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " T1= 3 " ; "ßC" ; " zu hoch "
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " Temp1: " ; Tempfehler ; " ßC "
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " Temp2: " ; Temper2 ; " ßC "
Wait 5
End If
'***************************
usw.
Gruß
Fred

Achim S.
18.09.2015, 16:28
Hab da doch was überlesen, ist Basic und ich nutze C. Schade
Danke
achim

Hicki
18.09.2015, 20:40
Hallo Fred,

kannst Du bitte Deinen ganzen Code reinstellen?

Gruß Andreas

fredred
19.09.2015, 11:22
Hallo Andreas,


kannst Du bitte Deinen ganzen Code reinstellen?


könnte ich. Passt aber nicht mehr zum Thema. Projekt ist eine umfangreiche MSR- Haussteuerung auch mit Funkübertragung (alles Eigenbau) Wenn immer noch Interesse schicke ich den Code(bas 938 Zeilen) als PN.

Mit freundlichen Grüßen
Fred

molleonair
29.10.2015, 17:31
Hallo Fred
.. leider kann ich die Wiederverwendbarkeit deines Codes nicht nachvollziehen.
Sinn dieser Routine war die Generierung einer Menustruktur nur durch Konfiguration des Dataset am Ende des Codes zu schaffen.
was du in deinem Programm machst ist je nach Ablauf des Programms Variablen aufs Display zu schreiben ...
wie kann man so einen Universell gesteuerten Menueablauf generieren ?
Mein Code soll die Reduktion von mehrfach verzweigten Menuestrukturen bewirken.
Du verwendest pro Menuepunkt 4 locate und 4 lcd befehle das mal die Anzahl von Menuepunkten frisst ordentlich Speicherplatz.
Ich verwende insgesamt nur 8 LCD Befehle für die Menueanzeige im Gesamten Programm unabhängig wieviel Menueeinträge vorhanden sind.
Du musst wissen als ich das Programm vor ca 10 Jahren geschrieben habe war Speicherplatz im ATmega stark begrenzt
Aber trozdem grossen Respekt an dich, daß du dich in deinem Alter noch an an eine MSR Steuerung mit 8-bit Prozessor im
Eigenbau heran wagst .

Gruß Daniel

fredred
30.10.2015, 14:27
Hallo Daniel,

hast völlig Recht. Die Taster haben mir nicht gefallen.
Im meiner MSR Steuerung teilen sich ein Atmega 644P und einen 128 die Arbeit. Die Parameter, von zu, tausche ich mit Uart (TTL) aus. Somit war und ist Speicherplatz zusparen nicht das Wichtigste für mich. Nur die Anzeige sollte immer das gleiche Format haben und nicht „flackern“. Anfänglich hatte ich es mit dem „blödem“ CLS- Befehl gemacht.

Zitat:
Mein Code soll die Reduktion von mehrfach verzweigten Menuestrukturen bewirken.
Zitat Ende

Wie gesagt deine Lösung finde ich Gut, sind aber andere Verhältnisse.
Beispiel: Wird ein Hausalarm ausgelöst, springe in Anzeige WO. Kommt Funkmeldung PV- Akku wird nicht mehr geladen springe in Anzeige PV. Möchte ja wissen ob „Susi“ nicht mehr genug „Kraft“ hat oder es sich um eine Störung handelt.
Kommt eine Meldung Lastprofilspeiche für Strom- Gaszäher ist fast voll springe in Anzeige Daten sichern usw.

Wichtig war für mich die Starteinstellung. Display zeig DCF77 an, in der letzen Zeile wird angezeigt, wo die Controller, gerate „herum Tadeln“. In allen Sub’s kann ich ein Status setzen (erst wenn sich Variable X ändert auch in %) nur dann in passende Anzeige springen.

Displayanzeige hat ja durch Klartext plus Variable in Zeilen immer eine andere Länge.
Soll halt nur „Schmuck“ aussehen und meine liebe Frau soll es auch deuten können für eventuelle Reaktionen.

Vielen Danke für Info der alte Mann
Fred

Beschwerden über Schreibfehler, fehlende Buchstaben oder Leerzeichen bitte an meine Tastatur richten.

Vitis
01.11.2015, 09:48
ich mach ja ungern den Pingeligen, aber "Goto" in Hülle und Fülle ist nicht so der optimale Programmierstil ...

Respekt vor der Leistung, doch das ist eher suboptimal gelöst.

fredred
01.11.2015, 12:42
Hallo Vitis,

Machst nicht den Pingeligen.
Freue mich immer wenn ein sachlicher Kommentar kommt. Nur dann bekommt man die Möglichkeit, sich zu rechtfertigen, warum dieser Programmierstil für dieses Projekt angewannt wird.
Code soll übersichtlich sein. Es kommen ja ständig neue Sensoren, Abfragen und Entscheidungen dazu.

Aber wo stehen im Code in „Hülle und Fülle“ Goto.
Besonders in größeren Projekten vermeide ich dies. Goto setzt ja kein Zeiger und damit verliert man schnell den Überblick.
Verwende Gosub ist doch schon ein großer Unterschied. Hier wird ein Zeiger gesetzt(Aufrufen und mit Return zurück zur nächster Zeile nach Aufruf)Kleiner Nachteil es müssen mehr Speicher im Header reservieren werden.
Aber wer hat der hat.
Könnte auch eine Declare Sub xxx verwenden. Sub ist zwar die eleganteste Lösung, hat aber auch Nachteile. Die Variablen in der Sub sind nicht öffentlich. Somit erst in Declare öffentlich machen. Reservierter Speicherplatz wirt auch nicht kleiner.

Ich sehe keinen Grund warum ich den Code suboptimal zu lasten der Übersicht ändern sollte. Muss ja auch immer die Laufzeit beachten und welche Entscheitung Vorrang hat.

Mit freundlichen Grüßen
Fred

molleonair
02.11.2015, 18:22
Hallo Ihr zwei ...

nein Vitis hat schon recht goto ist nicht der feine Programmierstil und vor 10 Jahren (so alt is der Thread fast) war ich noch Programmieranfänger ...
Davon mal abgesehen ist es Code abhängig welche Codeverweigung sinnvoll ist ..