Hallo. Ich versuche heute schon den ganzen Tag mit Bascom eine brauchbare, stabil laufende Menüstruktur zu erstellen. Sie soll nur 2 Ebenen haben, also Hauptmenüs und zu jeden Hauptmenü dann noch einige Untermenüs, noch nichtmal unteruntermenüs :). Tja, es will einfach nicht so, wie ich das will. Mein Problem besteht darin, dass es nicht unmoeglich scheint, "restore <variable> zu machen, drum frag ich jetz einfach mal ob jemand zufaellig irgendwo eine aehnliche Menuestruktur herumliegen hat :). danke & mfg
"dass es nicht unmoeglich scheint," ich meinte natuerlich "dass es unmoeglich scheint,"
Hi eine Menüstruktur würde ich unter C entweder mit einem Array aus structs machen oder aus einer verketteten Liste aus structs. Bascom sollte doch ähnliches beherschen. Matthias
Genau da is der haken, wie?
ich habs ueber data versucht, also sowas wie eine Tabelle erstellt.
Aus der wollte ich dann mit restore die Menünamen auslesen, leider
scheiterte es daran, dass nach restore keine Variable stehen kann (
glaub ich zumindest, da es nicht funtionierte:
dim byte as string *2
....
restore test
>> error, label not found (test).
Es gibt ja noch die Moeglichkeit das ganze ueber case/if,then zu
machen, ist aber leider sehr langsam und aufwaendig.
mfg
*ahrg, das ist echt nich mein Tag heute:
dim test as string *2
....
restore test
>> error, label not found (test).
Wenn du Arrays brauchst, geht das so: Dim test(10) as integer dim dummy as integer dummy = 5 test(3) = dummy Darüber kannst du vielleicht eine Menüstruktur erzeugen. Gruß Sebezahn
ich hab meine menuestruktur (bis jetz leider noch nich ganz fertig) mit asm gemacht. allerdings brauche ich 3 ebenen mit haupt screen sinds 4. RootScreen -> MainMenue -> SubMenue -> EditWert habe das über 4 register gemacht (klar man könnte die ineinanderfassen), weil ich die so überhab in meinem programm. das erste register gibt an, welche ebene (root, main, sub) der mainmenue und submenue zähler geben das jeweilige ausgewählte menue an und EditWert (das ist der, der mir noch fehlt) gibt die position des zu editierenden wertes an. das ganze habe ich über kaskadierte tabellen gelöst -> sau gross geworden. wenn jemand also noch ne alternative idee hat: sofort hier melden, bitte :) editwert brauche ich dazu, um zB beim einstellen der uhrzeit zwischen stunde minute und sekunde zu wechseln. ich habe übrigens 4 tasten, die ich im menue verwende: ok, up, dn & cancel naja da aber alleine meine Tabellenstrukturen die ich brauche für die - 1ste Zeile (konstanter Text) - 2te Zeile im Display (generierter Text& Wert) - den Ok Button (werte wollen gespeichert werden) einen riesen platz verschleuder bin ich eigentlich noch nicht glücklich. auch muss ich noch mit der Up und Dn funktion der Tasten tricksen... also nochmal: ich würde mich freuen, wenn mir jemand eine bessere idee unterbreitet, das Menüproblem zu lösen. ich hab früher schon einmal im forum nachgefragt wie man solch ein problem (menue allgemein) löst aber damals keine antwort erhalten, die mir geholfen hat. naja, die Tabellen variante ist schoneinmal klüger als mein erster versuch. für tips: danke im voraus!
Hi, dieses Menueproblem habe ich selbst jetzt bald, aber in Gedanken habe ich da auch schon eine Lösung. Da ich selbst, wie du im ersten Post angegeben hast, BASCOM verwende, sollten wir uns da mal zusammen tun. Ich bekomme nur noch nicht meinen ATMEGA ans laufen ( http://www.mikrocontroller.net/forum/read-1-61978.html ), sonst könnte ich mich direkt darauf stürzen. Oder hast du heute Nacht was anderes vor ;-) Schreib mir mal an spamschutz01@beyl.de eine Mail, ich möchte ungerne meine Adresse Plaintext hier rein stellen. Gruß Sebezahn
hmm, yoa. da können wir uns zusammentuen. aber da wollen wir mal erst versuchen deinen avr ins rennen zu bekommen. ich hab an meiner heizungssteuerung (was lange währt...) ein 16x2 display mit 4bit steuerung und 4 tasten angeschlossen. bis morgen dann - oder doch heute :-|
achja: vielleicht können die herren mit den dicken Grafikdisplays ja helfen. oder brauch man bei so viel displayfläche kein menue mehr?! :)
Eine Menüsteuerung möchte ich auch irgendwann mal machen. Ich frage mich nur wie man das vernünftig mit einem 16x2 LCD machen kann!? Ich meine kann man da Zeichen invertieren oder geht das sowieso nur nach dem Prinzip pro Zeile ein Menüpunkt? MfG, Thomas
Also ich wollte einen Pfeil als Zeichen definieren, du kannst ja bis zu acht Zeichen selbst "malen". Und dann wollte ich das Menü in die letzte Zeile legen und den Pfeil springen lassen. Ich habe allerdings ein 16x4 Erste Zeile Zweite Zeile Dritte Zeile mnu >mnu mnu So in der Art. Oder man muss das Programm so schreiben, dass das Display scrollt: Menuepunkt 1 Menuepunkt 2 -- Menuepunkt 3 | Menuepunkt 4 | Menuepunkt 5 -- Menuepunkt 6 Menuepunkt 7 Beide Lösungen fände ich akzeptabel. Gruß Sebezahn
Hi, also ich habe mal so ein Menu in Bascom geschrieben. Leider alles mehr oder weniger ueber Variablen abfragen. Sprich die erste Variable zaehlt die Position fuer den Pfeil usw. Leider fande ich das keine schoene Loesung. Es waere nett wenn ihr eure Versuche nachher mal psotet. Mfg Dirk
<ot> Erst mal meinen Mega zum Laufen bekommen, siehe andere Threads... </ot> Naja, irgendwie muss man ja mit Variablen arbeiten, die Frage ist nur, wie sparend man damit umgehen kann. Gruß Sebezahn
ein menü implementiert man stets durch einen zustandsautomaten; am besten zustandsdiagramm zeichnen, transitionsbedingung auswählen, "switch" anwenden, fertig
Hi und für ein Menü mit vielen Punkten muß man dann eine Zustandsmaschine mit eben so vielen Zuständen machen. Das ist nicht sehr effektiv. Üblicherweise macht man das, so wie ich es oben geschrieben habe, über eine verkettete Liste von Strukturen. Eine einzelne Struktur enthält dann einen Zeiger auf die nächst höhere Menüebene, ein Array aus Zeigern für die Menütexte, ein Array aus Zeigern auf die Menüfunktionen und ein Array aus Zeigern auf die nächst tieferliegende Ebene. Hört sich jetzt komplitziert an ist aber ein sehr durchschaubres Prinzip. Matthias
hi matt, natürlich gebe ich dir recht, deine methode ist bestimmt eleganter; andre hat jedoch ein relativ einfaches menü gemeint, und das noch unter bascom (struktur?? hehehe! zeiger?? hehehe!); deswegen habe ich den zustandsautomaten erwähnt gruss, emil
da ich ja assembler verwende und auch schon meine tabellen und zeiger habe ist es für mich kein problem. in bascom müsste man das auch auf die reihe bekommen, sonst würd ich´s als mangel (für bascom) bewerten. was meint ihr mit zustandsautomat? eine case schleife in einer endlosloop? was ist mit struktur gemeint? vieleicht ne tabelle, array, oder das verschachtelt? ich denke mal es hängt nur an den begriffen bei mir...
ich habe in meinem display ein paar werte dargestellt. drückt man die Menuetaste zeigt jeweils die 1ste zeile den namen des menues (zB. einstellungen) und in der 2ten zeile werden weitere werte dargestellt. drückt man ok gelangt man in das submenue "einstellungen" und hat dort den ersten eintrag. der heist wiederum "uhr stellen" in der 2ten zeile steht die uhrzeit als wert. drückt man wiederum die ok bleibt die erste Zeile stehen, die 2te zeile bekommt einen pfeil und das erste feld der uhrzeit also die stunde kann editiert werden. mit ok schaltet man weiter über minute und sekunde zum speichern zusätzlich habe ich (zur besseren orientierung) in den ersten beiden zeichen der ersten zeile 2 ziffern angebracht, die ähnlich beim nokia oder siemenshandy das aktuelle menue angeben. finde das ist sehr übersichtlich, daher würd ich sagen, das 16x2 zeichen gerade knapp reichen für ein kleines menue mit nicht allzuvielen ebenen.
hm, als LCD hatte ich ein 4*20 geplant Die idee mit den Arrays sieht schonmal gut aus, koennte dazu vielleicht jemand mal ein konkretes Beispiel bringen? Werd jetz auch noch n bisschen rumprobieren, aber obs was wird. Is jedenfalls etwas, was eindeutig in der codesammlung fehlt g @sebezahn: Menuepunkt 1 Menuepunkt 2 -- Menuepunkt 3 | Menuepunkt 4 | Menuepunkt 5 -- Menuepunkt 6 Menuepunkt 7 Auf die Idee bin ich auch schon gekommen, scheint aber eher noch komplizierter zu sein. mfg
Hi eine Struktur ist ein zusammengesetzter Datentyp wie ihn jede höhere Programmiersprache unterstützen sollte (Objekte in der OOP sind auch nichts anderes als "etwas" komplexere Strukturen). So könnte eine Struktur in C etwa so aussehen: typedef struct{ unsigned char *text; menuepunkt *up; menuepunkt *down; }menuepunkt; Matthias
@matthias hmm gut. als ich Deinen Beitrag gelesen hab is mir glatt die nächste idee gekommen, wie ich das ganze noch verkleinern kann. werd das mal ausprobieren, aber jetz muss ich erstmal weiter lernen @andre das durchschieben der Einträge dürfte sich über eine tabelle auch simpel gestalten. man muss nur die gültigkeit des selektors prüfen und unter 0 und über max umrechnen noch ne frage: ich habe in meinem programm eine dauerschleife. die ständig das display aktuallisiert. auch wenn sich nichts verändert hat. bis auf den nachteil, das ich zB keine Blink-Cursor nutzen kann, binn ich ganz zufrieden. ist das schädlich zB. für die ram zellen des Displys? habe bis jetz noch kein argument gefunden das anders zu lösen.
"@andre das durchschieben der Einträge dürfte sich über eine tabelle auch simpel gestalten. man muss nur die gültigkeit des selektors prüfen und unter 0 und über max umrechnen " Hmm, hab ich soweit auch verstanden. Mein Problem besteht nur darin eine Tabelle zu erstellen und aus der dann die richtigen Elemente auszulesen. Hab noch nicht soo viel mit bascom gemacht, dafuer frueher aber n bisschen mit qb programmiert. mfg
Ihr denkt viel zu kompliziert ! Kein Mensch braucht für ein kleines Menü Structurvariablen, Submenüzähler und soweiter. Ein Blattl Papier mit kleinem Flußdiagramm hilft hier mal am meisten.Eine kleine Routine in welcher ich Zahlen eingeben kann reicht (zB 2.stellig). Für die Zeit ruf ich diese 2 mal auf. Dieser Routine gebe ich noch Maximal und Minimalwert bei jedem Aufruf mit.Diese Routine kann auch über ein Timeout verlassen werden. Enter speichert die neue Zahl erst ab. Cursor blinken usw. erledigt sie auch. Texte werden im Flash hinterlegt. Schöne Grüße Josef
mit hilfe der tabellen lässt sich der programmumfang verkleinern. bei grossen menüstrukturen halte ich das für äusserst hilfreich, da die sache auch übersichtlicher wird. ich will schließlich 4x4 + 3 + 8 Submenuepunkte sortiert unterbringen. das sind immerhin 27 werte die ich anzeigen und auch einige die ich editieren muss. da auch viel wiederholter code dabei ist bekommt man das auf unserem weg kleiner. ich währe ja froh, wenn du uns eine noch kleinere idee unterbreitest :)
Ich waer schon froh wenn jemand mal ein Beispiel bringen wuerde, damit man das ein bisschen nachvollziehen kann g. Ich find die Idee mit den Tabellen gut, weiss nur nicht wie das zu realisieren ist. mfg
hmm, habs nun tatsaechlich irgendwie hinbekommen :). Dim B1 As String * 20 Dim Av As Integer Enable Interrupts Enable Int0 Enable Int1 Av = 0 On Int1 Icr On Int0 Dcr Goto Gg Icr: Incr Av If Av > 3 Then Av = 3 Return Dcr: Decr Av If Av < 0 Then Av = 0 Return Gg: Do B1 = Lookupstr(av , Dta) Print B1 Loop End Dta: Data "sfsdf" , "sfdfgdfhg" , "flkjh" , "mkfjhkj" , "dkjhg" Weiss zufaellig jemand wie viele Ausdruecke hinter "Data" passen? mfg
Hi, wie angekündigt meine Lösung für das Menü. Lastet zusammen mit der Tastatur-Auswertung Matrixtastatur den Speicher vom M128 zu etwa 2% aus. Der Code ist reichlich kommentiert. Je nach Konfiguration muss das ganze noch auf die Pin-Belegung und Displaygröße angepasst werden. Gruß Sebezahn
Hi, super Programm mit Beschreibung .... vielleicht moved Andreas es ja um in die Rubrik Codesammlung. Mfg Dirk
Rofl... So gut ist es nun auch wieder nicht ;-) Ein wenig schnell zusammen geschrieben, ich wollte nur mal demonstrieren, wie ich sowas machen würde. Außerdem habe ich nicht alles voll ausgetestet. Also bitte ich um Rückantwort, wenn was nicht funktioniert. Das wichtigste, was noch geändert werden muss, ist die Position des Cursors. Der aktive Menüpunkt ist immer der oberste, das ist bei einem großen Display unschön. Kommt die Tage. Gruß sebezahn
Aehm, lang lang ists her. Ich muss mal in den Tiefen meines PCs kramen, aber ich glaube, ich habe den Cursor so gelassen. Oder nicht? Ich weiss es nicht mehr. Wenn ich etwas finde, schicke ich es sofort zu bzw stelle es ins Forum. Gruß Sebezahn
ja, das wär echt cool, wenn du da mal nachschauen könntest. @berti: danke, werd mal versuchen das zu entziffern. hab noch nie mit c gearbeitet :-)
Hi, tut mir leid, ich habe das Menü bei meinem damaligen Projekt so gelassen, wie es auch in der Download-Version hier ist. Du solltest das aber eigentlich ohne Probleme einbauen können. Ich habe zwar noch einige Variablen eingesetzt, um den Speicher zu schonen, aber damit auch ein wenig "gefuscht" und Variablen aus meiner restlichen Anwendung benutzt, wenn die nicht in Gebrauch waren. Das bringt euch herzlich wenig. @anfaenger: Ich denke aber, mit ein wenig Programmiererfahrung bekommst du das auch selbst hin. Ansonsten ausprobieren, viel kapputt machen kannst du an dieser Stelle nicht. Gruß Sebezahn
naja, da kann man nix machen. dann werd ichs einfach mal allein versuchen. hab leider keine große programmiererfahrung, aber irgendwie werd ich das schon hinkriegen :-)
also, teilweise hab ichs hinbekommen. hier ist der entscheidende codefetzen: '*********************************************************************** ******** '*********************************************************************** ******** Mnushow: ' Wenn dieser Punkt angesprungen wird, verlangt das System eine Eingabe. ' Alle weiteren Aktionen, sofern nicht durch Interrupts erzeugt, werden ' nicht weiter verarbeitet. ' Das alte Mnuselect wird gesichert Mnuselectold = Mnuselect ' Der Zeiger wird auf den ersten Menüeintrag gestellt. Mnuselectpointer = 1 ' So lange das Menue nicht geaendert wurde, wird dies immer fortgesetzt. While Mnuselectold = Mnuselect ' Zuerst einmal muss nun auf dem Display etwas angezeigt werden. ' Dies ist der Zaehler für die anzuzeigende Zeile M = 1 ' Mehr als die verfuegbaren Menuepunkte können nicht angezeigt werden. Hilf = 1 If Mnuselectpointer > Lcdrows Then Hilf = Mnuselectpointer - Lcdrows Incr Hilf End If N = Hilf + Lcdrows Decr N Cls For I = Hilf To N Locate M , 1 If I = Mnuselectpointer Then Lcd "=> " Else Lcd " " End If Lcd Mnutext(i) Incr M Next '*********************************************************************** ******** '*********************************************************************** ******** beim runterscrollen bewegt sich der erst nur der zeiger, bis er am rand des dislpays angekommen ist. ab da bewegt sich dann die schrift. so wie es sein soll. wenn man dann allerdings hochscrollt bewegt sich erst nur die schrift und dann der zeiger. also genau in umgekehrter reihenfolge wie beim runterscrollen. irgendwie hab ich jetzt aber keinen nerv mehr. wenn jemand ganz nett ist und lust hat, kann er mir ja mal helfen. achja, was auch noch nicht stimmt: wenn man ein menü zurück geht bleiben die einträge aus dem vorherigen menü stehen, wenn sie nicht überschrieben werden. diesen codefetzen kann man einfach in den code von sebezahn an entsprechender stelle einsetzen. hatte nur keine lust den ganzen code zu posten, weils dann etwas viel geworden wär :-) mfg, anfänger.
Habe in ASM ein Menü in der sogenannten Baumstruktur gemacht. Vorteil bei sowas ist, das sich so was auf einfache Art und Weise schnell erweitern läßt. Eine Software ist für so ne Baumstruktur nicht schwer zu realisieren. Vielleicht hilft das hier weiter: ;Menü in einer Baumstruktur wobei jeder "Zweig" auf den nächsten und vorigen Zweig zeigt. ;Bedeutung der Datenbytes: ; Byte 1 = nächster Zweig in der gleichen ebene. 0 bedeutet das es der letzte Zweig in seiner Ebene ist. ; Byte 2 = voriger Zweig in der gleichen Ebene. 0 bedeutet, das es der erste Zweig in seiner Ebene ist. ; Byte 3 = Erste Zweignummer der Untermenüs in der nächsten Ebene. ; Byte 4 = Zeilennummer der Liste in den Settings für die Parameter. ; Ist Byte 3 = 0 und Byte 4 <> 0 wird davon ausgegangen, das mittels Tastatur oder Drehimpulsgeber was verstellt werden kann. ;Menü 1 mit Untermenüs .db 5, 0, 2, 0 ;Ebene 1 .db 3, 0, 0, 1 ;Ebene 2 .db 4, 2, 0, 2 ;Ebene 2 .db 0, 3, 0, 3 ;Ebene 2 ;Menü 2 mit Untermenüs .db 12, 1, 6, 0 ;Ebene 1 .db 7, 0, 0, 4 ;Ebene 2 .db 8, 6, 0, 5 ;Ebene 2 .db 9, 7, 0, 6 ;Ebene 2 .db 10, 8, 0, 7 ;Ebene 2 .db 11, 9, 0, 8 ;Ebene 2 .db 0, 10, 0, 13 ;Ebene 2 ;Menü 3 mit Untermenüs .db 18, 5, 13, 0 ;Ebene 1 .db 14, 0, 0, 9 ;Ebene 2 .db 15, 13, 0, 10 ;Ebene 2 .db 16, 14, 0, 11 ;Ebene 2 .db 17, 15, 0, 12 ;Ebene 2 .db 0, 16, 0, 14 ;Ebene 2 ;Menü 4 mit Untermenüs .db 0, 12, 19, 0 ;Ebene 1 .db 20, 0, 0, 15 ;Ebene 2 .db 21, 19, 0, 16 ;Ebene 2 .db 22, 20, 0, 17 ;Ebene 2 .db 0, 21, 0, 18 ;Ebene 2 ;Hier die Parameterliste für Menü 1, 2, 3 und 4 ;Bedeutung der einzelnen Bytes (0 - 3) ;Min-Wert, Max-Wert, Stepping, DIPG-Raster .db 0, 3, 1, 2 .db 10, 120, 1, 2 .db 10, 120, 1, 2 .db 0, 1, 1, 4 .db 0, 100, 1, 2 .db 10, 50, 1, 2 .db 0, 255, 1, 1 .db 0, 50, 1, 1 .db 0, 7, 1, 4 .db 10, 60, 1, 2 .db 0, 50, 1, 2 .db 0, 255, 1, 1 .db 0, 1, 1, 4 .db 0, 1, 1, 4 .db 0, 6, 1, 4 .db 0, 6, 1, 4 .db 0, 1, 1, 4 .db 0, 1, 1, 4 ;Hier die nötigen Variablen zur Menü-Steuerung: .dseg RP1: MenuBuffer: .byte 14 ;Byte 0 = Nummer der aktuellen Menü-Ebene. ;Byte 1 - 4 = Nummer der Zweige in der Menüstruktur in Ebene 1 - 4 ;Byte 5 - 8 = Nummer des ausgewählten Menüs in einer Ebene z. B. für Beep-Codes. ;Byte 9 - 10 = Adesse der Parameterwerte für ChangeValue. ;Byte 11 - 12 = Adresse des im SRAM zu ändernden Wertes. ;Byte 13 und 14 = Alter Wert (Sicherheitskopie). Gruß Andi
so, falls es noch jemanden interessiert, ich hab den spass noch zu ende gebracht. kann sein, dass das auch einfacher geht, aber es funktioniert :-) '*********************************************************************** ******** '*********************************************************************** ******** Mnushow: ' Wenn dieser Punkt angesprungen wird, verlangt das System eine Eingabe. ' Alle weiteren Aktionen, sofern nicht durch Interrupts erzeugt, werden ' nicht weiter verarbeitet. ' Das alte Mnuselect wird gesichert Mnuselectold = Mnuselect ' Der Zeiger wird auf den ersten Menüeintrag gestellt. Mnuselectpointer = 1 ' So lange das Menue nicht geaendert wurde, wird dies immer fortgesetzt. While Mnuselectold = Mnuselect ' Zuerst einmal muss nun auf dem Display etwas angezeigt werden. ' Dies ist der Zaehler für die anzuzeigende Zeile M = 1 Hilf = 1 If Mnuselectpointer < Hilf_alt Then Hilf = Hilf_alt - 1 Else If Mnuselectpointer > N_alt Then Hilf = Hilf_alt + 1 Else Hilf = Hilf_alt End If End If N = Hilf + Mnuselectscount Decr N If N > Lcdrows Then N = Lcdrows + Hilf Decr N End If Cls For I = Hilf To N Locate M , 1 If I = Mnuselectpointer Then Lcd "=> " Else Lcd " " End If Lcd Mnutext(i) Incr M Next Hilf_alt = Hilf N_alt = N '*********************************************************************** ******** '*********************************************************************** ******** der code muss natürlich in das ursprüngliche file von sebezahn an der entsprechenden stelle eingefügt werden. ausserdem müssen noch irgendwo die variablen "Hilf", "Hilf_alt" und "N_alt" als Byte deklariert werden. mfg, euer anfänger
ach männo. ich habs nochmal verbessert... also wen das hier noch interessiert, der soll einfach nochmal hier reinposten. bei bedarf kann ich das fertige file dann hier posten oder zuschicken.
Hallo anfänger, ich bin auch dabei ein Menü zu programmieren. Kannst Du bitte mal Deinen Code posten!? Gruß Micha
ja, kann ich machen. muss das menü aber erstmal "bereinigen" :-) also ich stells spätestens heut abend hier rein. hab noch n bißchen was zu tun...
so, hier ist "mein" menü. ist fast komplett von sebezahn kopiert und nur ein wenig angeändert. ich hab leider keine kommentare drin. wenn du das alles verstehen willst, solltest du dir vielleicht auch noch das menü von sebezahn angucken. das ist sehr gut kommentiert.
Hi, ich hatte mal für ein 2-zeiliges Textdisplay mit 4 Softkeys ne Menüstruktur unter BASCOM gemacht. Ein BildschirmMenü kann also max 4 Aktionen durchführen (z.B. up, down, esc, OK) D.h., ein Tastendruck hat die zugeordnete Funktion ausgeführt und ist dann zum nächten Menü (was im Falle von "up" auch dasselbe sein kann)gesprungen. Welcher text im Display stehen soll, welche Aktionen den Tastern zugeordnet sind und welches der näxte Menü-punkt/text ist, habe ich mit ner Tabelle gemacht. Der Code stammt noch aus meiner Beginnerzeit, ist also net super elegant programmiert. Die Verwendung der Menüs sollte aber schnell verständlich sein, wenn man den restlichen Anwendungsspez. Code ignoriert. Hier sind z.B. 10 Menüs/Displayinhalte definiert. Die Zahlen in den geschweiften klammern sind LCD-Sonderzeichen: '*************************************************** '* Menustruktur-u.Arbeitstabelle * '* ----------------------------- * '* Spalten: Tastenzuordnung mit * '* - Sub: erst abzuarbeitende Prozedur * '* - Menu: danach gültiges Menu * '* * '* Zeilen sind den jeweiligen Menus zugeordnet * '*************************************************** Menustrukt: ' Taste1 Taste2 Taste3 Taste4 ' Sub/Menu Sub/Menu Sub/Menu Sub/Menu Data 00 , 00 , 03 , 01 , 00 , 00 , 00 , 00 '0 Power on Data 00 , 00 , 00 , 00 , 00 , 00 , 00 , 02 '1 Normalbetrieb Data 01 , 03 , 03 , 01 , 00 , 05 , 02 , 04 '2 Data 01 , 03 , 01 , 02 , 01 , 03 , 01 , 02 '3 Data 02 , 04 , 02 , 04 , 02 , 04 , 00 , 02 '4 Data 04 , 06 , 00 , 09 , 00 , 07 , 00 , 02 '5 Data 00 , 00 , 00 , 00 , 00 , 00 , 00 , 05 '6 Data 00 , 07 , 00 , 08 , 00 , 07 , 00 , 05 '7 Data 00 , 00 , 00 , 00 , 00 , 00 , 00 , 07 '8 Data 05 , 10 , 06 , 10 , 00 , 00 , 00 , 05 '9 Backup Data 00 , 00 , 00 , 00 , 00 , 00 , 00 , 02 '10 '*************************************************** '* Menutexte * '* --------- * '* * '* Zeilen sind den jeweiligen Menus zugeordnet * '*************************************************** Menutext: Data "{005}Systemstart {004}" , "{005}V.1.0-26.07.02{006}" '0 Data "{005}Prg Sub {006}" , "{005}Lauflicht-Demo{003}" '1 Data "Prg.wahl Run" , "Datei Mem-Info" '2 Data "{001} {004}" , "{002}Die Programmnr{003}" '3 Data "{005} Prg. Noch {006}" , "{005} % Mem.frei {003}" '4 Data "Load Backup" , "Delete {003}" '5 Data " Fertig. %" , " Mem.frei {003}" '6 Data "{001} Prg delete" , "{002}Name {003}" '7 Data " Fertig. XX%" , " Mem.frei {003}" '8 Data "Save Restore" , " {003}" '9 Data " Fertig" , " {003}" '10
cool! noch ne lösung. würde es dir was ausmachen, mal den nicht zum menü gehörenden kram da raus zu löschen? so find ichs nämlich ziemlich unübersichtlich und ich blick auch noch nicht ganz durch :-)
Hi, @Anfaenger : Das ist schon das was man dafuer braucht die Kommentare selber loeschen. Mfg Dirk
Ok. Da ich inzwischen auch nicht alles ohne Einarbeitung sofort durchblicke, nur prinzipiell, teilweise mit Syntaxfehlern. Kommt ja nur auf das Prinzip an. Wie Du z.B. letztlich Tasten abfragst/entprellst ist dem menü ja egal. Ist natürlich so ein kurzes Beispiel, daß ein Wechsel der Menüs/LCD-Inhalte net nötig wäre...aber möglich. Die Tabellen habe ich inhaltlich net extra angepasst. hoffe, nis vergessen/übersehen zu haben.
Achso, wenn Deine Subs ausgeführt werden, muß natürlich noch Call Print_menu(menustate) aufgerufen werden, um das LCD zu aktualisieren.
habe mir gerade mal das menü von sebezahn angeschaut, ist recht gut, aber wie kann ich das menü wieder verlassen so das ich im hauptprogramm bin, bzw wie kann ich im hauptprogramm sagen das ich ins menü möchte
Hi, langlang ists her. Das Menü IST das Hauptprogramm. Wenn du nun eine Routine ablaufen lassen willst, dann hängst du sie als Unterprogramm in das Menü ein. Sobald die Routine beendet ist, geht es wieder zurück ins Menü. Ich glaube, das war damals die Logik dahinter. Gruß Sebezahn
ja hatte schon versucht dies zu ändern, aber so firm bin ich leider darin noch nicht, ich suche im endefekt so ein menü wie dies ist, was ich aber seperat aufrufen kann z.b. über eine taste, aber dennoch die restlichen programmteile ausgeführt werden. wärend des menü aufrufs dürfen die anderen teile nicht oder nur sehr kurz unterbrochen werden. kennst du eine lösung dafür?
Achso... nein, das war mit diesem Menü nicht beabsichtigt. Du könntest das ganze auf Interrupts umbauen, hier wird ja gepollt. Suche mal nach "Unterschied zwischen Interrupt und Polling", da solltest du genug finden. Und lasse dich nicht entmutigen! Gruß Sebezahn
Hallo Ich hab ein kleines Menü angefertigt, das auch geht nur hab ich ein Problem: Und zwar wenn ich eine Variable verändere, dann geht das aber es geht nicht immer. d.h. die Variable1_decr kann ich 10 mal erhöhen und dann man 11 mal springt das ganze Programm wieder zum Anfang zurück. Falls jmd mein Problem verstanden hat und vieleicht eine Indee hat kann er mir ja bescheid sagen. Danke Dim Menu_kugel As Byte Dim Menu_pendel As Byte Dim Schwingungen As Byte Dim Leange As Byte Locate 1 , 1 Lcd ; "Menu" Schleife: Do Debounce Pinc.1 , 0 , Forward , Sub Debounce Pinc.2 , 0 , Back , Sub Debounce Pinc.3 , 0 , Variable1_incr , Sub Debounce Pinc.4 , 0 , Variable2 , Sub Debounce Pinc.5 , 0 , Variable1_decr , Sub Loop Variable1_decr: Decr Leange Goto Case_menu Variable1_incr: 'Dieses Sprungziel dient zur Bestimmung der Länge bzw. Höhe. Incr Leange If Pinc.3 = 0 Then Locate 1 , 1 Lcd "Leange" Locate 1 , 8 Lcd Leange ; " " Goto Variable1_incr Else Goto Case_menu End If Variable2: 'Dieses Sprungziel dient zur bestimmung der Anzahl Schwingungen. Schwingungen = Schwingungen + 2 If Schwingungen > 30 Then Schwingungen = 0 Goto Case_menu '-----Vorwärts---------------------------------------------------------- -------- Forward: If Pinc.0 = 1 Then Incr Menu_kugel Else Incr Menu_pendel End If If Menu_kugel = 3 Then Goto Stopp_uhr If Menu_pendel = 4 Then Goto Stopp_uhr Goto Case_menu '-----Rückwärts--------------------------------------------------------- -------- Back: If Pinc.0 = 1 Then Decr Menu_kugel Else Decr Menu_pendel End If Goto Case_menu '-----Case Menü----------------------------------------------------------------- Case_menu: If Pinc.0 = 0 Then Select Case Menu_pendel Case 0 Goto Schleife Case 1 Cls Locate 1 , 1 Lcd "Anwendung:Pendel" Case 2 Cls Locate 1 , 1 Lcd "Leange" Locate 1 , 8 Lcd Leange ; " " Case 3 Cls Locate 1 , 1 Lcd "Anzahl" Locate 2 , 1 Lcd "Schwingungen" Locate 2 , 13 Lcd Schwingungen ; " " End Select Goto Schleife End If If Pinc.0 = 1 Then Select Case Menu_kugel Case 0 Goto Schleife Case 1 Cls Locate 1 , 1 Lcd "Anwendung:" Locate 2 , 1 Lcd "Freier Fall" Case 2 Cls Locate 1 , 1 Lcd "Leange" Locate 1 , 8 Lcd Leange ; " " End Select Goto Schleife End If
bitte streiche "Goto" aus Deinem Wortschatz, da schüttelt es die meisten hier ... UARGH schau mal dort: http://www.rn-wissen.de/index.php/Bascom_State_Machine_Menu
Hallo anfänger oder sebezahn Habe mir das Menü von Sebezahn, und die verbesserung von anfänger mal angesehen. Jetzt versuche ich schon seit 2 Tagen den Code von anfänger so zu erweitern, das man weitere Untermenüs hat, aber ich bekomme es einfach nicht hin. Leider ist die letzte Version von anfänger nicht Dokumentiert ,so das ich nicht so wirklich durchsteige ! Wie bekomme ich es hin, das ich weitere Untermenüs mit mehr Einträgen in den Code ergänzen kann ? Wer kann mir helfen ? Bitte ! MfG Alexander PS Bin auch blutiger Anfänger
Habe das Codebeispiel von sebezahn benutzt und nur auf mein Display angepasst. Menü funktoiniert super! Nur möchte ich jetzt z.B. etwas ausgebe. Z.B. bei IP_Adresse gebe ich dann im Case 11 ein : LCD "Testsystem", dann werden aber wenn ich das ganze Aufrufe am Display nur immer jeweils 8 Zeichen dargestellt und der Rest un die zweitel Zeile befördert. Das sieht dann so aus Testsyst em Was hängt damit zusammen? Wie krieg ich das alles in die erste Zeile (Die ja 16 Zeichen hat)
Die Initialisierung des LCD lauft offenbar nicht rund. Standard Typen haben 8 Zeichen, erweiterte 16 oder mehr. Du solltest also in der Richtung suchen
Ja Danke habs nach einer Stunde herumprobieren auch herausgefunden ;) Man muss oben noch "Config LCD = 16 * 2 eingeben. Der Cursor hat mich auch ein wenig gestört also auch noch "Cursor Off" hinzugefügt.
Hi, also ich habe gerade mein 6+1 Kanal PC- Lüftersteuerungs- Projekt quasi fertig, das hat ein Menü mit 3 Leveln: Level 1. MAIN > je 6x 2.Level > je 8x 3.Level + 1x 2.Level > 12x 3.Level Am einfachsten gehts (imho) mit Select Case. Select Case MENULEVEL Case 0 ist MAIN Case 1 - 7 2. Level Case 10 - X0 3. Level Case 11 - 1X Sublevel Case 21 - 2X Sublevel Case MENULEVEL > da drin dann noch jeweils die passende Touch X,Y Auswertung (Nicht den Touch selbst, nur die X/Y Pos) ebenfalls über Select Case, bei JEDEM Mainloop Durchlauf, LCD wird nur aktualisiert wenn was geändert wurde, Eingabeauswertung nur wenn TOUCHed > 5( 6x ADC Auswertungen selber Punkt berührt), wenn ausgeführt bis nach loslassen nicht mehr, ausser wenn unter bestimmten Bedingungen, gewollt, ein Interrupt nach 100ms die Variable zurücksetzt. Das bedeutet, mein Programm tut in der MAINLOOP nichts anderes als Touch Auswerten, LCD Anzeigen, Eingabe Auswerten und wieder von vorne, der ganze Rest ist Interrupt gesteuert. der Nachteil: Anzeige und Touch Bestimmung am Stück, laaang ( viele Bildschirmseiten), zig Select Case verwirrend ineinander verschachtelt. Bei diesem Projekt ca. 80%, der Rest ist 7 verschiede DS18S20 Abfragen und ziemlich viele Berechnungen, aber nur alle 5s - 100s. Vorteil: meist schnell in der Abarbeitung, da der µC oft nur 2 Bedingungen prüfen muss, >>> was neues Anzuzeigen?, Eingabe erfolgt? NEIN? Fertig.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.