Tastenabfrage in C

Gast #1550757
Ich versuche gerade in C eine Tastenabfrage zu erstellen.
Bei kurzem Druck soll eine Variable hochgezählt werden. Bei langem Druck 
soll die aktuelle Variable ins EEPROM gespeichert werden:
1
while(1)
2
  {
3
    PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
4
    if (bit_is_clear (PINB, PINB0))
5
    {
6
      if (bPortB) // wenn Taster gedrückt
7
      {
8
        dauer++;
9
          }
10
      else // wenn nicht gedrückt
11
      {
12
        if   (dauer > 10)
13
        {
14
          if (nKeyPress < 8)
15
          {
16
            nKeyPress++;
17
            bPortB = 0;
18
          }
19
          else
20
          {
21
            nKeyPress = 0;
22
            bPortB = 0;
23
          }
24
        }
25
        if   (dauer > 20) // wenn länger gedrückt
26
        {
27
          eeprom_write_byte(&eeFooByte, nKeyPress);
28
          dauer = 0;
29
          Warte (100);
30
        }
31
      }
32
      }
33
      else
34
    {
35
          bPortB = 1;
36
      }
37
  }
38
  return 0;
Ich komme nur einfach nicht klar damit.
Ist das der richtige Weg?
DerSchatten schrieb:

> Ich komme nur einfach nicht klar damit.
> Ist das der richtige Weg?

Dein Fragnment ist gar nicht so einfach zu analysieren.
Alles in allem erscheint es mir aber ünverhältnismässig kompliziert für 
die Funktion die es bereitstellt.

Benutze doch einfach die PeDa Entprellung. Die macht das was du vorhast, 
aus dem Stand.
http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29
Dein Hauptproblem wird wohl darin liegen, dass
1
     else // wenn nicht gedrückt
2
      {
3
        if   (dauer > 10)
dieser else Zweig nie betreten wird, da bPortB gar keine Chance hat 
jemals 0 zu werden. Dei einzigen Möglichkeiten dafür befinden sich 
allesamt im else Zweig selber.
Persönliche Seite
So kann ich das empfehlen, für jeden einfacher(es geht nur um die 
Formatierung.)
1
while(1){
2
        PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
3
        if (bit_is_clear (PINB, PINB0)){
4
                if (bPortB){ // wenn Taster gedrückt
5
                        dauer++;
6
                }
7
                else{ // wenn nicht gedrückt
8
                        if(dauer > 10){
9
                                if (nKeyPress < 8){
10
                                        nKeyPress++;
11
                                        bPortB = 0;
12
                                }
13
                                else{
14
                                        nKeyPress = 0;
15
                                        bPortB = 0;
16
                                }
17
                        }
18
                        if(dauer > 20){ // wenn länger gedrückt
19
                                eeprom_write_byte(&eeFooByte, nKeyPress);
20
                                dauer = 0;
21
                                Warte (100);
22
                        }
23
              }
24
        }
25
        else{
26
                bPortB = 1;
27
        }
28
}
29
return 0;
Gast
Hallo Karl,

hab mir das Beispiel angesehen und ausprobiert.
Erstmal 1:1 übernommen.

Das einzige was jedoch passiert ist, das die 3 LEDs sofort zu leuchten 
beginnen, mehr nicht.
So wie ich das verstanden habe sollen die ja erst leuchten wenn einer 
der 3 Taster gedrückt wird oder?
Was bewirkt hier ein langer Tastendruck?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.