Forum: Mikrocontroller und Digitale Elektronik LCD Menü mit switch case


von Jabber W. (jabber)


Lesenswert?

Hallo, ich wollte eigentlich nur schnell ein kleines Menü erstelle aber 
jetzt macht mich das Ding fertig.

Im Grunde geht es, nur wenn ich Taster DOWN drücke dann saust das ganze 
Menü durch, von unten nach oben das gleiche. Manchmal geht es 
allerdings! Warum???
Der obere testcode läuft einwandfrei.

Die Taster werden mit Timer0 alle 10ms abgefragt.
Also ist "tast" ja 10ms lang z.b. UP und er läuft das Menü nach oben 
durch. Deshalb wollte ich "tast" wieder auf 0 setzen aber das juckt ihn 
überhaupt nicht.
1
volatile uint8_t tast = 0;
2
volatile uint8_t menutap = 1;
3
4
5
void menu(void)
6
{   
7
  
8
  
9
/*
10
  if(tast == RIGHT)
11
    {LCD_puts("right",1);
12
      menutap = 10;
13
    }
14
  else if(tast == LEFT)
15
    {LCD_puts("Left",1);
16
    menutap = 5;
17
    }
18
  else if(tast == DOWN)
19
    {LCD_puts("DOWN",1);
20
    menutap = 50;
21
    }
22
  else if(tast == UP)
23
    {LCD_puts("UP",1);
24
      menutap = 6;
25
    }
26
  else if(tast == ENTER)
27
    {LCD_puts("enter",1);
28
      menutap = 8;
29
    }
30
  else if(tast == FALSE)
31
    {LCD_puts("false",1);
32
          
33
    }
34
  
35
  */
36
  
37
  
38
  
39
    switch (menutap)
40
    {
41
    
42
    case 1: if(tast==DOWN)
43
          {menutap = 2;
44
          tast = 0; 
45
          }
46
        LCD_puts("TAP 1",1);
47
        break;
48
        
49
    case 2: if(tast==UP)
50
          {
51
          menutap = 1;
52
          tast =0;
53
          }
54
        else if(tast==DOWN)
55
          {menutap = 3;
56
          tast = 0;
57
          }
58
        
59
          LCD_puts("TAP 2",1);
60
          
61
          break;
62
    
63
    case 3: if(tast == UP)
64
          {menutap = 2;
65
          tast = 0;
66
          }
67
        LCD_puts("TAP 3",1);
68
        break;
69
        
70
    }
71
}

von Falk B. (falk)


Lesenswert?

@ Jabber Wock (jabber)

>Im Grunde geht es, nur wenn ich Taster DOWN drücke dann saust das ganze
>Menü durch, von unten nach oben das gleiche. Manchmal geht es
>allerdings! Warum???

Du musst die Flanke der Tastendrücke erkennen und in tast speichern

>Der obere testcode läuft einwandfrei.

Liegt wharschienlich am umgebenden Programm.

>durch. Deshalb wollte ich "tast" wieder auf 0 setzen aber das juckt ihn
>überhaupt nicht.

Wahrscheinlich weil deine Routine den vom Interrupt aus wieder 
überschreibt.

MFG
Falk

von Jabber W. (jabber)


Lesenswert?

Hi, also ich werte die Taster hiermit aus. Ist das nicht ok? Ist 
eigentlich aus dem Tutorial nur halt im timer.
Wie müsste es denn aussehen?
1
ISR(TIMER0_OVF_vect)
2
{
3
  
4
if  (!(PINB & (1 << PB4)) ) 
5
  { tast = ENTER;
6
    
7
  }
8
else if (!(PINB & (1 << PB6)) ) 
9
  { tast = UP;
10
    
11
  }
12
else if (!(PINB & (1 << PB7)) )
13
  { tast = DOWN;
14
    
15
  }
16
else if (!(PINE & (1 << PE2))) 
17
  { tast = LEFT;
18
    
19
  }
20
else if (!(PINE & (1 << PE3))) 
21
  { tast = RIGHT;
22
    
23
  }
24
else 
25
  {
26
    tast= FALSE;
27
  }
28
29
TCNT0 = 0x64;

von Karl H. (kbuchegg)


Lesenswert?

Tu dir selbst einen Gefallen und benutzte diese
Tastaturroutinen. Sie sind full prove, unterstützen
die Unterscheidung von langen und kurzen Tastendrücken
und können auch einen Autorepeat.

Wenn du diese Funktionen im Einsatz hast, wirst du für
Tastenabfragen nie wieder was anderes verwenden wollen.

http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29

von Ich hab's! (Gast)


Lesenswert?

> Tastaturroutinen. Sie sind full prove, unterstützen

http://dict.leo.org/ende?search=fully%20proven ?

Jetzt hab ich's:

http://dict.leo.org/ende?search=fool-proof

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.