Forum: Mikrocontroller und Digitale Elektronik 3x4 Tastatur Matrix Routine


von raxor (Gast)


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!

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von raxor (Gast)


Lesenswert?

Ah Super vielen Dank! Ich werds probieren :)

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.