LCD Menüstruktur: elegante Implementierungslösung??

OP #4525818
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
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".
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.