Hallo zusammen und noch ein frohes Neues. :) Ich wollte mich mal ein bisschen mit Menüprogrammierung beschäftigen und hab mir mal die Seite zu Gemüte geführt: http://www.mikrocontroller.net/articles/Funktionszeiger_in_C ( Unten der Beitrag: Menüs mit Funktionszeigern ) erste Frage: In der Funktion DoMenu... Warum soll Auswahl mit 1 subtrahiert werden.? Ergibt für mich keinen Sinn. Zweite Frage: Ist es überhaupt sinnvoll, die Tasterabfrage so und an diesen Ort zu schreiben.? Dritte Frage: Wenn ich nun ein Taster betätige, ruft es die Funktion auf. Das funktioniert schon mal. Mein Problem ist jetzt, dass die Funktion DoMenu weiter ausgeführt wird, und die Hauptmenüstruktur weiter angezeigt wird. In meinen Funktionen wie: void HandleEdit (int arg) kann ich es aber nicht löschen auf dem LCD. Ist auch logisch dass er es so macht. Aber wie kann ich es ändern.? danke schon mal mit freundlichem Gruß
nj schrieb: > erste Frage: In der Funktion DoMenu... Warum soll Auswahl mit 1 > subtrahiert werden.? Ergibt für mich keinen Sinn. Weil der erste Menüpunkt den Wert 1 hat aber Arrays in C das erste Element den Index 0 hat. nj schrieb: > Zweite Frage: Ist es überhaupt sinnvoll, die Tasterabfrage so und an > diesen Ort zu schreiben.? Prinzipiell schon. Ich würde aber nicht 5mal fast den gleichen Code schreiben sondern das über eine Schleife lösen. Etwa so:
1 | int taster[] = {1<<T1, 1<<T2, 1<<T3, 1<<T4, 1<<T5};
|
2 | Auswahl = -1; |
3 | while(Auswahl == -1) |
4 | {
|
5 | for(int i = 0; i < 5; ++i) |
6 | {
|
7 | if(get_key_short(taster[i])) |
8 | Auswahl = i; |
9 | } |
10 | } |
nj schrieb: > Dritte Frage: Wenn ich nun ein Taster betätige, ruft es die Funktion > auf. Das funktioniert schon mal. > Mein Problem ist jetzt, dass die Funktion DoMenu weiter ausgeführt wird, > und die Hauptmenüstruktur weiter angezeigt wird. In meinen Funktionen > wie: > void HandleEdit (int arg) > kann ich es aber nicht löschen auf dem LCD. Ist auch logisch dass er es > so macht. Aber wie kann ich es ändern.? Die Frage ist mir nicht ganz klar. Wenn du nicht willst das die Menüstruktur danach weiter angezeigt wird musst du dafür sorgen, dass die Funktion HandleEdit erst returned wenn die komplette Aktion abgeschlossen ist und zum Menü zurückgekehrt werden soll.
Sebastian V. O. schrieb: > Ich würde aber nicht 5mal fast den gleichen Code > schreiben ja :D das war bloß zum probieren. ... jetzt hatte ich ein Denkfehler. Stimmt, ich muss eine eine neue Struktur bilden
Ich habe mal noch eine andere Frage. Dürfte auch zum Thema Menü erstellen passen. Durch Tasterbetätigung will ich nun Ausgänge setzen und rücksetzen. Zusätzlich auch auf dem LCD anzeigen, ob AN oder nicht. Funktioniert auch alles. Mein Problem ist jetzt, wenn ich aus diesem Menüpunkt rausgeh, später diesen wieder öffne, dann sind zwar die Ausgänge noch gesetzt(logisch, weil sie ja nie zurückgesetzt worden), aber den Zustand zeigt es nicht mehr an, ob AN oder nicht. Was macht man da am besten.? Man könnte jetzt für jede Spannung noch eine Variable erstellen(die es speichert) und dann beim Öffnen des Menüpunktes abfragen. Aber das sollte doch einfacher und mit weniger Code gehen oder.? danke
1 | void Spannungen (int arg){ |
2 | ClearScreen(); |
3 | LCDSoftText("Spannungen",0,0,BLACK); |
4 | LCDSoftText("5V",0,16,BLACK); |
5 | LCDSoftText("12V",0,24,BLACK); |
6 | LCDSoftText("24V",0,32,BLACK); |
7 | LCDSoftText("0...12V",0,40,BLACK); |
8 | LCDSoftText("0...12V",0,48,BLACK); |
9 | DrawLine(45,16,45,54,BLACK); |
10 | DrawLine(65,40,65,54,BLACK); |
11 | while(1){ |
12 | int taster[] = {1<<T1, 1<<T2, 1<<T3, 1<<T4, 1<<T5}; |
13 | for(int i = 0; i < 5; ++i){ |
14 | if(get_key_short(taster[i])){ |
15 | LCDSoftText(puffer,110,4,BLACK); |
16 | LCDSoftText("AN",47,(i*8)+16,BLACK); |
17 | //PORTD |= (i);
|
18 | }
|
19 | if (get_key_long(taster[i])){ |
20 | LCDSoftText(" ",i*26,56,BLACK); |
21 | //PORTD &= ~ (i);
|
22 | }
|
23 | }
|
24 | tasterback(); |
25 | }
|
26 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.