Forum: Compiler & IDEs LCD menu in C mit switch case zu komplex


von Sebastian B. (sebastian86)


Lesenswert?

Guten Tag,

Ich bin mir grad ein LCD menu am Basteln und hänge ein bisschen fest.
die Menu Struktur sollte so aussehen:

1
Mainmenu>>>Untermenu1>>>Menupunkt1
2
                        Menupunkt2
3
                        ..  
4
                        ..
5
                        ..
6
                        Menupunkt15
7
                        Menupunkt16
8
9
10
        >>>Untermenu2>>>xxx
11
  
12
13
        >>>Untermenu3>>>xxx


ich möchte über das untermenu1 zwei Komplette Ports an den Ausgängen 
steuern auf dem 4-zeiligem Display werden immer 3 Ausgänge angezeigt
es sieht dann ungefähr so aus:(der Pfeil ist quasi der cursor.)und mit 
"Enter" kann ich den Zustand verändern

---------------
Menu1
PB0   AN
PB1   AN   <--
PB2   AUS
---------------

Nur wie mache ich das geschickt mit der Menuführung wenn ich von PB2 
noch eins runter gehe sollte
sich das Menu dann so ändern das dort PB3,4 und 5 steht.

Momentan hab ich das mit switch case überprüfungen gemacht aber das wird 
glaube ich viel zu komplex vorallem
wenn später das menu geändert werden soll.

Ich komme nun grad nicht weiter und wollte mal nach einer Hilfestellung 
fragen wie man soetwas machen könnte.

Vieleicht kann mir ja jemand helfen oder es hat jmd schonmal so ein menu 
erstellt.

Gruß

Seb

von F. K. (Firma: LHC) (tschuesswelt)


Lesenswert?

abo

von Karl H. (kbuchegg)


Lesenswert?

Was hast du an Tasten verfügbar?

Ich geh mal davon aus, dass es da noch Tasten gibt:

Als allererstes würde ich mir mal Menüfunktionen bauen, die scrollen 
können. Damit bist du die Beschränkung auf 3 nutzbare Zeilen los.
Am linken oder rechten Rand kommen 2 Sonderzeichen hin, ein Pfeil nach 
oben und ein Pfeil nach unten, die anzeigen, dass es da noch weitere 
Menüpunke gibt, wenn man mit dem Cursor über den Rand kommt, ganz 
ähnlich den Pfeilen in der Windows-Scroll Leiste, nur dass die 
entsprechenden Pfeile verschwinden, wenn ich ganz oben bzw. unten im 
Menü bin

Wie es dann weiter geht, hängt davon ab, wie leistungsfähig dein 
bisheriges Menüsystem ist, bzw. wie die Auslösung der Funktion konkret 
funktioniert. Funktionspointer sind da oft eine große Hilfe. Die ganzen 
switch-case Konstrukte verschwinden damit weitgehend. Dafür hat man dann 
allerdings einen Satz spezialisierter Funktionen, die in den 
Datenstrukturen der Menüs verwendet werden.

von Sebastian B. (sebastian86)


Lesenswert?

Tasten habe ich 5 zur verfügung UP,DOWN,LEFT,RIGHT,OK

wobei Links und rechts noch überhaupt nicht belegt sind.


Mit Pointern und Strukturen habe ich mich bisher noch garnicht 
beschäftigt.

Hast du sowas mal in klein aufgebaut also nur wie das ungefähr aussieht 
den rest leite ich dann schon ab bzw bastel es mir zusammen.

Nur weiss ich garnicht wie sowas aufgebaut wird :/

Ich lese mir inzwischen mal grad durch was das ist.

Aber danke schonmal fuer deine Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Hier ist eine Kurzzusammenfassung über FUnktionszeiger
http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger

besonders der Unterabschnitt über 'Menüs mit Funktionszeiger' wird dich 
ineteressieren. Aber lies den Abschnitt der FAQ von vorne durch, sonst 
verstehst du in diesem Unterabschnitt nur noch Bahnhof.

von Ulrich P. (uprinz)


Lesenswert?

Das leidliche Thema, wie man ein optimales Menü, gerade auf einem 
kleinen Controller.
Als recht effizient hat sich bei mir die Pointer-Tabelle erwiesen. Ich 
baue mir eine Tabelle, die für jeden Menüeintrag auf den anzuzeigenden 
String, eine Ausführ-Funktion und eine Value-Funktion zeigt.

Der Sting ist klar, es ist der Anfang des dazustellenden Menüeintrages.
Die Ausführfunktion ist die, die bei Auswahl des Menüeintrages 
aufgerufen wird. Die Value-Funktion kann dem String noch eine dynmische 
Komponente anhängen, also einen Wert oder Text, der sich aus dem Zustand 
des Systems ergibt.

Für eine luxuriöse Darstellung mit Scrollen und Auswählen werden jetzt 
leidglich zwei Pointer benötigt. Ein Auswahl-Pointer läuft mit den 
Menütasten, also i.d.R. Hoch und Runter und steht damit immer auf dem 
aktuell ausgewählten Wert.
Der zweite Pointer, der Display-Pointer wird aus der Display-Größe und 
dem Auswahl-Pointer berechnet, er zeigt auf den ersten anzuzeigenden 
Eintrag. Die Anzahl der anzuzeigenden Einträge wird anhand der 
Display-Größe festgelegt.

Mit diesen beiden Pointern kann man nun nach Vorliebe alle 
Menü-Varianten abbilden, es hängt lediglich von der Verknüpfung der 
beiden Pointer ab:
Ein Menü, dass seine zentrale Auswahlzeile immer in der Mitte hält, beim 
ersten Eintrag sind also oberhalb leere Zeilen, beim letzten darunter.
Oder eine dynamische Auswahlzeile, die zuerst vom ersten Eintrag bis zur 
Mitte läuft und den letzten Zeilen dann ans untere Ende läuft.
Oder die Tilt-Auswahl, die oben startet, dann bis zur letzten Zeile 
läuft und dort bleibt.
Auch der Rundkurs ist einfach, man bleibt mit der Auswahl immer in der 
Mitte des Displays und das menü läuft rund, der erste Eintrag wird unten 
wieder eingeblenden, wenn Ihr versteht was ich meine. Man kann eine 
Ende-Erkennung in der Tabelle ( z.B. NULL Pointer) verwenden um eine 
Trennlinie einzufügen.

Anhand der Pointerkonstellation kann man natürlich auch leicht Symbole 
einfügen, die Anzeigen, dass da noch mehr weiter oben oder weiter unten 
ist.

Gruß, Ulrich

von ramius (Gast)


Lesenswert?

hallo sebastian,

wenn du dein menu nicht über switch-case aufbauen willst, dann mach dich 
mal in die richtung zustandsautomat etwas schlau ;)

ein "gutes" beispiel findest du, wenn du dir den avr butterfly code 
ansiehst

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.