Forum: Mikrocontroller und Digitale Elektronik Menüstruktur unter Bascom


von andré (Gast)


Lesenswert?

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

von andré (Gast)


Lesenswert?

"dass es nicht unmoeglich scheint,"

ich meinte natuerlich "dass es unmoeglich scheint,"

von Matthias (Gast)


Lesenswert?

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

von andré (Gast)


Lesenswert?

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

von andré (Gast)


Lesenswert?

*ahrg, das ist echt nich mein Tag heute:

dim test as string *2
....
restore test

>> error, label not found (test).

von sebezahn (Gast)


Lesenswert?

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

von Henning (Gast)


Lesenswert?

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!

von sebezahn (Gast)


Lesenswert?

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

von Henning (Gast)


Lesenswert?

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 :-|

von Henning (Gast)


Lesenswert?

achja: vielleicht können die herren mit den dicken Grafikdisplays ja
helfen. oder brauch man bei so viel displayfläche kein menue mehr?!
:)

von Thomas K (Gast)


Lesenswert?

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

von sebezahn (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

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

von sebezahn (Gast)


Lesenswert?

<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

von emil (Gast)


Lesenswert?

ein menü implementiert man stets durch einen zustandsautomaten;
am besten zustandsdiagramm zeichnen, transitionsbedingung auswählen,
"switch" anwenden, fertig

von Matthias (Gast)


Lesenswert?

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

von emil (Gast)


Lesenswert?

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

von Henning (Gast)


Lesenswert?

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...

von Henning (Gast)


Lesenswert?

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.

von andré (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Henning (Gast)


Lesenswert?

@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.

von andré (Gast)


Lesenswert?

"@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

von Josef (Gast)


Lesenswert?

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

von Henning (Gast)


Lesenswert?

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 :)

von andré (Gast)


Lesenswert?

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

von andré (Gast)


Lesenswert?

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

von sebezahn (Gast)


Angehängte Dateien:

Lesenswert?

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

von Dirk (Gast)


Lesenswert?

Hi,

super Programm mit Beschreibung .... vielleicht moved Andreas es ja um
in die Rubrik Codesammlung.



Mfg

Dirk

von sebezahn (Gast)


Lesenswert?

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

von anfänger (Gast)


Lesenswert?

ist da noch was draus geworden?

von Berti (Gast)


Angehängte Dateien:

Lesenswert?

Das ist meine Dipl Arbeit mit menüführung Ist aber in C

von sebezahn (Gast)


Lesenswert?

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

von anfänger (Gast)


Lesenswert?

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 :-)

von sebezahn (Gast)


Lesenswert?

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

von anfänger (Gast)


Lesenswert?

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 :-)

von anfänger (Gast)


Lesenswert?

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.

von Andi (Gast)


Lesenswert?

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

von anfänger (Gast)


Lesenswert?

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

von anfänger (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

Hallo anfänger,

ich bin auch dabei ein Menü zu programmieren.
Kannst Du bitte mal Deinen Code posten!?

Gruß Micha

von anfänger (Gast)


Lesenswert?

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...

von anfänger (Gast)


Angehängte Dateien:

Lesenswert?

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.

von beta-frank (Gast)


Angehängte Dateien:

Lesenswert?

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

von anfänger (Gast)


Lesenswert?

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 :-)

von Dirk (Gast)


Lesenswert?

Hi,

@Anfaenger : Das ist schon das was man dafuer braucht die Kommentare
              selber loeschen.

Mfg
Dirk

von anfänger (Gast)


Lesenswert?

hä? den satz versteh ich nicht!

von beta-frank (Gast)


Angehängte Dateien:

Lesenswert?

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.

von beta-frank (Gast)


Lesenswert?

Achso,

wenn Deine Subs ausgeführt werden, muß natürlich noch

   Call Print_menu(menustate)

aufgerufen werden, um das LCD zu aktualisieren.

von anfänger (Gast)


Lesenswert?

hey, echt super! danke.

von Ralph W. (tiscali)


Lesenswert?

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

von sebezahn (Gast)


Lesenswert?

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

von Ralph W. (tiscali)


Lesenswert?

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?

von sebezahn (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Weingut P. (weinbauer)


Lesenswert?

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

von Alexander (Gast)


Lesenswert?

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

von Fisch (Gast)


Lesenswert?

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)

von Mes (Gast)


Lesenswert?

Die Initialisierung des LCD lauft offenbar nicht rund. Standard Typen 
haben 8 Zeichen, erweiterte 16 oder mehr. Du solltest also in der 
Richtung suchen

von Fisch (Gast)


Lesenswert?

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.

von Stephan B. (s_bronco)


Lesenswert?

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
Noch kein Account? Hier anmelden.