mikrocontroller.net

Forum: Compiler & IDEs Problem mit Tastenabfrage


Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
    }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)
   ....

   for(;;)
     PORTC = ~PINB;
 }
}

das ist die Einfachlösung. Einfach den Zustand aller Taster auf die LEDs 
geben.
....

   for(;;) {

     leds = 0;
     keys = ~PINB;

     if( keys & ( 1 << 0 ) )
       leds |= ( 1 << 0 );

     if( keys & ( 1 << 1 ) )
       leds |= ( 1 << 1 );

     if( keys & ( 1 << 2 ) )
       leds |= ( 1 << 2 );

     if( keys & ( 1 << 3 ) )
       leds |= ( 1 << 3 );

     if( keys & ( 1 << 4 ) )
       leds |= ( 1 << 4 );

     if( keys & ( 1 << 5 ) )
       leds |= ( 1 << 5 );

     if( keys & ( 1 << 6 ) )
       leds |= ( 1 << 6 );

     if( keys & ( 1 << 7 ) )
       leds |= ( 1 << 7 );
     
     PORTC = leds;
   }

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.