Forum: Compiler & IDEs Problem mit Tastenabfrage


von holger (Gast)


Lesenswert?

Hallo zusammen,
ich mache gerade meine ersten Gehversuche in C und AVR und habe im 
Internet ein Beispielprogramm zur Tasterabfrage gefunden welches ich 
abwandeln wollte. Im Beispiel sollte immer nur eine Leuchte leuchten (if 
(keys &2,4,8,0x10,0x20usw)
Ich möchte gerne zusätzlich dass beim gleichzeitigen Tastendrücken 
mehrere Leds leuchten

Taster 1+2 zusammen: LED1und2
Taster 3+1: Led3+1
Taster 3+2+1: Led3+2+1
und so weiter.
Ich schaffe es jedoch nicht dass mehrere Leds gleichzeitig leuchten.
Meiner Meinung nach bedeutet
if ( keys & 3 )
            led = 3; im untenstehenden Beispiel dass wenn Taster 1 +2 
gleichzeitig gedrückt ist, LED 1+2 leuchten müssen.
Was mache ich falsch?
Gruß
Holger

/*********************************************************************** 
*******
 Title:    Turn on LED when switch is pressed
 Author:   Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
 Date:     December 2002
 Software: AVR-GCC 3.3
 Hardware: AT90S8515 at 4 Mhz, STK200 compatible starter kit

 Description:
 This example demonstrates basic port input/output technic.
 If one of the switches on port B is pressed, the corresponding LED on 
port C is
 turned on.

************************************************************************ 
*******/
#include <inttypes.h>
#include <avr/io.h>


int main(void)
{
    uint8_t   led;
    uint8_t   keys;


    DDRC  = 0xff;                  // use all pins on PortC for output
    DDRB  = 0x00;                  // use all pins on port B for input

    PORTB = 0xff;                  // activate internal pull-up
    PORTC = 0x00;                  // set output high -> turn all LEDs 
off

    for (;;) {                     // loop forever
        keys = ~PINB;              // read input port with switches 
(active-low)

        if ( keys & 1 )
            led = 1;
        else if ( keys & 2 )
            led = 2;
    else if ( ( keys & 0x03 ) == 0x03 )
            led = 3;
        else if ( keys & 4 )
            led = 4;

    else if ( keys & 5 )
                    led = 5;
        else if ( keys & 6 )
            led = 6;
        else if ( keys & 7 )
            led = 7;

        else
            led = 0;

        if ( keys )
            PORTC = ~led;           // Set corresponding LED if switch 
pressed
    }
}

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:

>     else if ( keys & 5 )

Das hier maskiert dir NICHT das Bit für den 5. Taster heraus.
5 ist binär  00001001
Damit maskierst du dir also Bit 0 und Bit 3 frei.

Ausserdem darfst du hier nicht else if benutzen. Ansonsten müsstest du 
nämlich alle 256 Fälle, die man mit 8 Tastern erzeugen kann, abhandlen 
müssen :-)
1
   ....
2
3
   for(;;)
4
     PORTC = ~PINB;
5
 }
6
}

das ist die Einfachlösung. Einfach den Zustand aller Taster auf die LEDs 
geben.
1
....
2
3
   for(;;) {
4
5
     leds = 0;
6
     keys = ~PINB;
7
8
     if( keys & ( 1 << 0 ) )
9
       leds |= ( 1 << 0 );
10
11
     if( keys & ( 1 << 1 ) )
12
       leds |= ( 1 << 1 );
13
14
     if( keys & ( 1 << 2 ) )
15
       leds |= ( 1 << 2 );
16
17
     if( keys & ( 1 << 3 ) )
18
       leds |= ( 1 << 3 );
19
20
     if( keys & ( 1 << 4 ) )
21
       leds |= ( 1 << 4 );
22
23
     if( keys & ( 1 << 5 ) )
24
       leds |= ( 1 << 5 );
25
26
     if( keys & ( 1 << 6 ) )
27
       leds |= ( 1 << 6 );
28
29
     if( keys & ( 1 << 7 ) )
30
       leds |= ( 1 << 7 );
31
     
32
     PORTC = leds;
33
   }

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.