Forum: Mikrocontroller und Digitale Elektronik Funktionszeiger in C


von nj (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Sebastian V. (sebi_s)


Lesenswert?

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.

von nj (Gast)


Lesenswert?

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

von nj (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.