3x4 Tastatur Matrix Routine

Gast #2483748
Lesenswert?
• ▲
▼
Hallo alle zusammen,

ich hab für ein Standard 3x4 Matrix Tastenfeld eine Routine geschrieben:

    // start matrix routine
    for (int i=1; i<4; i++)
    {
      if (i==1)
      {
        // set port 0 to check for 1, 4, 7, * at ports 4, 5, 6, 7
        PORTD= 0b00000001;

        if ( PIND & (1<<PIND4) )
          b1 = true;
        else
          b1 = false;

        if ( PIND & (1<<PIND5) )
          b4 = true;
        else
          b4 = false;

        if ( PIND & (1<<PIND6) )
          b7 = true;
        else
          b7 = false;

        if ( PIND & (1<<PIND7) )
          bStar = true;
        else
          bStar = false;

        PORTD= 0b00000000;

      }

      if (i==2)
      {
        // set port 1 to check for 2, 5, 8, 0 at ports 4, 5, 6, 7
        PORTD= 0b00000010;

        if ( PIND & (1<<PIND4) )
          b2 = true;
        else
          b2 = false;

        if ( PIND & (1<<PIND5) )
          b5 = true;
        else
          b5 = false;

        if ( PIND & (1<<PIND6) )
          b8 = true;
        else
          b8 = false;

        if ( PIND & (1<<PIND7) )
          b0 = true;
        else
          b0 = false;

        PORTD= 0b00000000;
      }

      if (i==3)
      {
        // set port 2 to check for 3, 6, 9, # at ports 4, 5, 6, 7
        PORTD= 0b00000100;

        if ( PIND & (1<<PIND4) )
          b3 = true;
        else
          b3 = false;

        if ( PIND & (1<<PIND5) )
          b6 = true;
        else
          b6 = false;

        if ( PIND & (1<<PIND6) )
          b9 = true;
        else
          b9 = false;

        if ( PIND & (1<<PIND7) )
          bSharp = true;
        else
          bSharp = false;

        PORTD= 0b00000000;
      }
    }
    // matrix routine end


Das funktioniert auch soweit... leider hab ich aber das Problem das wenn 
ich mehrere Tasten in der Horizontale betätige (also zum Beispiel 1,2,3) 
alle bits (b1, b2, b3) zurückgesetzt werden obwohl aber das Gegenteil 
passieren soll.

Findet jemand den Fehler in meinem Programm... ich hab schon ewig 
rumprobiert. Wäre super ;-)

Vielen Dank und Grüße!
Moderator Persönliche Seite #2483773
Lesenswert?
• ▲
▼
raxor schrieb:
> Das funktioniert auch soweit... leider hab ich aber das Problem das wenn
> ich mehrere Tasten in der Horizontale betätige (also zum Beispiel 1,2,3)
> alle bits (b1, b2, b3) zurückgesetzt werden obwohl aber das Gegenteil
> passieren soll.

Wenn Du drei Tasten in der Horizontalen gleichzeitig drückst, schließt 
Du 3 AVR-Ausgänge kurz.... der stärkere gewinnt. Das dürften die beiden 
sein, die dabei auf 0 gehen.

Wenn solche gleichzeitigen Tastendrücke gebraucht werden, mussst Du 
entweder Dioden einlöten oder mit Pull-Up/Down-Widerständen arbeiten, 
wobei Du die inaktiven Spalten auf Eingang statt Ausgang setzt, damit 
sie nicht gegeneinander treiben.

Antwort schreiben

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.

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.