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