Forum: Compiler & IDEs LCD Menüstruktur: elegante Implementierungslösung??


von Georg T. (microschorsch)


Lesenswert?

Hallo zusammen,

ich arbeite momentan an einer Applikation mit einer aufwändigeren 
LCD-Menüstruktur. Ist nicht die erste, die ich mache, aber ist schon 
ziemlich umfangreich.

Bisher habe ich das LCD-Menü immer irgendwie geradeso zusammengebastelt. 
Für kleine Menüs ist das sicherlich ausreichend. Aber ich wollte mich 
mal erkundigen, ob es da nicht eine elegantere Lösung gibt, um LCD-Menüs 
"schön" zu implementieren.

Hier sieht ihr mal im stark vereinfachten Code, wie meine Menüs bisher 
implementiert sind:
1
uint8_t lcdWindow;
2
3
void updateLCD() {
4
  switch (lcdWindow) {
5
    case 0x01:
6
      lcd_string("something");
7
      break;
8
    case 0x02:
9
      lcd_string("something else");
10
      break;
11
      [...]
12
  }
13
}
14
15
void actorSW1() {
16
  window++;
17
  if (window>0x10) window = 0x01;
18
}
19
20
void actorSW2() {
21
  switch (lcdWindow) {
22
    case 0x01:
23
      /* do something here */
24
      break;
25
    case 0x02:
26
      /* do something else here */
27
      break;
28
      [...]
29
  }
30
}
31
32
int main() {
33
  [...]
34
  lcdWindow = 0x01;
35
  for (;;) {
36
    if (myISR & 0x01) /* do something by interrupt */
37
    if (myISR & 0x02) /* do something else by interrupt */
38
    if (myISR & 0x04) updateLCD(); /* timer-based interrupt */
39
    if (debouce(&PIND, SW1)) actorSW1();
40
    if (debouce(&PIND, SW2)) actorSW2();
41
  }
42
}

Ihr seht, dass ich immer drei Funktionen pro Menübild implementieren 
muss. Einmal muss man innerhalb eines switch-case statements einen 
Eintrag in updateLCD() machen, und jeweis einen weiteren pro Taster. Ich 
frage mich, ob es eine elegantere Lösung gibt??

Für mich ist die größte Herausforderung, wenn man den Code, so wie oben 
stehend aufbaut, dass man ständig durch großere Codeblöcke hin und 
herscrollen muss. Daher fänge ich es elegant sowohl die 
Darstellungsbeschreibung (also das was in updateLCD steht) aber auch die 
Aktoren pro Menüpunkt dicht beieinander zu haben.

Ich wollte einfach mal in die Runde fragen, wie ihr das macht...

Ich könnte mir vorstellen die drei Funktionen in eine zu packen und dann 
über einen Parameter die Ausführungsebene zu wählen.


Gruß Schorsch

von Walter T. (nicolas)


Lesenswert?

Georg T. schrieb:
> Ich wollte einfach mal in die Runde fragen, wie ihr das macht...

Komplett anders.


Das Menü ist bei mir eine Datenstruktur (die komplett im Flash liegt). 
Actionen werden als Funktionszeiger (void-void-Funktionen) und Texte als 
von Xprintf-interpretierbare Zeichenketten hinterlegt.

Die Menü-Routinen werten ein Wertepaar aus aus 
"Bestätigungs-Tastendruck-Status" (kein, kurzer, langer Tastendruck) und 
"Koordinatenänderung" (down/nix/up) aus. Das hat den Vorteil, halbwegs 
plattformunabhängig zu sein.

Das Menü wird nicht auf die Aktionen angepaßt. Nur der Datensatz.

Elegant sieht vermutlich anders aus, aber wie heißt es so schön: "works 
for me".

von Florian H. (florianh80)


Lesenswert?

Ich mache es ähnlich wie Walter.
Ich hab allerdings verschiedene Typen von Menüeinträgen definiert.
Bespielsweise ein Untermenü Typ.
Den Menüaufbau mach ich dann mit Makros.
Sieht übersichtlicher aus.

Gruß,
Flo

von Tobias .. (bitfehler)


Lesenswert?

Hast du schon ins Wiki geschaut: 
https://www.mikrocontroller.net/articles/Men%C3%BC

von Stephan H. (stephan-)


Lesenswert?

ich lege die Menüs komplett aufgebaut im Flash am Ende vom Code ab.
Das Text-Display Befindet sich dann 1:1 gespiegelt im RAM.
Ich rede explizit von Matrix Display keine Grafischen !
In den RAM schreibe ich dann in einer ISR 3-4*/Sek nur die Daten die 
aktualiesiert werden. Die Displaymasken schreibe ich nur dann in den RAM 
wenn sich der gesamte Inhalt ändern soll. Rechenergebnisse werden dann 
lediglich nur mit 30h beaufschlagt und in die RAM Zelle gelegt. Die ISR 
unterscheidet lediglich ob Daten oder Befehle gesendet werden. Den Rest 
macht einfach nur ein Zeiger.

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.