LCD Menü mit switch case

OP #709704
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
}
#709716
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
OP #709776
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;
#709777
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren