Taster auf und abwärts zählen

Gast #1978622
Lesenswert?

Hallo,

ich versuche hier 2 Taster, jeweils einen für hoch und den anderen für 
runter auf eine 7 Segment Anzeige auszugeben. Jedoch scheiterts schon 
daran, dass ich es nicht hinbekomme bei einem Tasterdruck die Variable 
menuValue nur um einen erhöht wird! Er soll von 1-9 hoch und runter 
zählen können! 0x1 ist hoch und 0x2 ist runter.

Danke!!
1
int main()
2
{
3
    static int menuValue = 1;
4
    int pushButtons;
5
    int pushCnt = 0;
6
    
7
    
8
    menu();
9
    do{
10
        pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);
11
        if(pushButtons && 0x01)
12
        {    
13
            pushCnt++;
14
            if(pushCnt > 8)
15
                if(menuValue < 9)
16
                {
17
                    menuValue++;
18
                    pushCnt = 0;
19
                    usleep(10000);
20
                }
21
        }
22
        if(pushButtons && 0x02)
23
        {
24
            pushCnt++;
25
            if(pushCnt > 8)
26
                if(menuValue >= 1)   
27
                {     
28
                    menuValue--;
29
                    pushCnt = 0;
30
                    usleep(10000);
31
                }
32
        }
33
        else if(pushButtons && 0x03)
34
            break;
35
        printf("%i %i\n",menuValue, pushCnt);
36
        usleep(10000);
37
//        IOWR_16DIRECT(IO_OUT_7_SEGMENT_BASE, 0, 0x40);
38
//        buttonState();
39
    }while(1);
#1978674
Lesenswert?

Das hier

        pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);

klingt nach einer mehr oder weniger direkten Port Abfrage.

Damit macht dein Programm aber:
  Solange eine Taste gedrückt ist, mache ....

und nicht
  Bei einem Tastendruck mache ...

Das ist ein Unterschied, wie bei den Scheibenhebern im Auto.
Da gibt es welche, auf die drückt man kurz drauf und die Scheibe fährt 
ganz nach oben. Und es gibt welche, bei denen bewegt sich die Scheibe 
nur dann, wenn man den Taster gedrückt hält.
#1979430
Lesenswert?

Holzi schrieb:
> Wie realisiere ich
> das am logischsten in C?

Z.B. mit meiner Entprellroutine (s.o.).

Die Anpassung auf andere CPUs ist ganz leicht, nur der Timerinterrupt 
(Init, Syntax) muß angepaßt werden.

So eine zentrale Entprellroutine ist ein echter Zeitsparer. Man muß sich 
nie wieder mit Entprellen und Flanke erkennen abquälen. Man kann sich 
voll auf die eigentliche Aufgabe konzentrieren.
Das Zeitsparen ist sogar doppelt: Der Entwickler spart Zeit und die CPU 
auch (keine Delayloops).


Peter
Gast #1979444
Lesenswert?

danke gelöst!
1
pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);
2
    segment7(menuValue);
3
    if((pushButtons & 0x01) && (button1Mode == TRUE))
4
    {    
5
        if(menuValue < 9)
6
        {
7
            button1Mode = FALSE;
8
            menuValue++;
9
        }
10
    }
11
    if(!(pushButtons & 0x01))
12
        button1Mode = TRUE;
13
    if((pushButtons == 0x02) && (button2Mode == TRUE))
14
    {
15
        if(menuValue > 1)   
16
        {     
17
            button2Mode = FALSE;
18
            menuValue--;
19
        }
20
    }
21
    if(!(pushButtons & 0x02))
22
        button2Mode = TRUE;

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