Forum: Mikrocontroller und Digitale Elektronik Tastenmatrix


von Mr-400-Volt (Gast)


Lesenswert?

Hallo, ich habe mir eine Tastenmatrix mit 3*4 Tasten aufgebaut. Wie 
frage ich die Tasten am besten mit Bascom ab ? Ich wollte es 
folgendermaßen machen:
Port D0-D2 --> Martix
Port D3-D6 --> Matrix

Zwei schleifen ineinander laufen lassen, eine bis 3 und die innere bis 
4.
Nacheinander D0-D2 auf Low schalten und D3-D6 abfragen. Ist das so 
möglich ?

Danke !!!

von Stefan G. (steg13)


Lesenswert?


von Mr-400-Volt (Gast)


Angehängte Dateien:

Lesenswert?

Hmmmm, ich habe mal ein kleines Programm angehangen. Normalerweise müßte 
doch die Taste unten/links abgefragt werden. Der angezeigte wert 
wechselt aber immer zwischen 0 und 1. Bei gedrückter Taste bleibt er auf 
0, bei nichtgedrückter wechselt er immer...........

von jojansen (Gast)


Lesenswert?

Config KBD, Getkbd().
Habe ich die Tage ausprobiert und funktionert.
Wurde hier schon öfters erwähnt: RTFM = lies die Hilfe (nicht nur 
flüchtig)
:-) Johannes

von Sonic (Gast)


Lesenswert?

Hi, habe hier eine 4x4-Matrix in C abgefragt. Vielleicht kannst du's ja 
umsetzen.


if (PINA != 15)                // nur bei gedrückter Taste abfragen
  {
    PORTA = 0b00001111;            // Spalten abfragen
    _delay_us(1);
    Ergebnis = PINA;

    DDRA = 0b00001111;
    PORTA = 0b11110000;

    PORTA = 0b11110000;            // Zeilen abfragen
    _delay_us(1);
    Ergebnis += PINA;            // Zeilen und Spalten verknüpfen

    DDRA = 0b11110000;
    PORTA = 0b00001111;            // Port-Ausgangszustand 
wiederherstellen

    switch (Ergebnis)
      {
      case 119: T_Byte = '0'; break;    // Bitmuster auswerten und Byte 
zuweisen
      case 123: T_Byte = '.'; break;
      case 125: T_Byte = '-'; break;
      case 126: T_Byte = 'E'; break;
      case 183: T_Byte = '1'; break;
      case 187: T_Byte = '2'; break;
      case 189: T_Byte = '3'; break;
      case 190: T_Byte = 'C'; break;
      case 215: T_Byte = '4'; break;
      case 219: T_Byte = '5'; break;
      case 221: T_Byte = '6'; break;
      case 222: T_Byte = 'D'; break;
      case 231: T_Byte = '7'; break;
      case 235: T_Byte = '8'; break;
      case 237: T_Byte = '9'; break;
      case 238: T_Byte = 'F'; break;
      default : T_Byte = ' '; break;
      }

    for(unsigned char i=0;i<15;i++)                // Pause 15 x 10ms = 
150ms (entprellung)
      {
        _delay_ms(160);                    // 255ms/16MHz=16ms
      }
  }

von Mr-400-Volt (Gast)


Lesenswert?

Ich habe aber eine 3*4 Matrix. Setzt Bascom eine 4*4 voraus ?

von Sonic (Gast)


Lesenswert?

Nö, ich hatte halt nur eine 4x4. Ich wollte vorschlagen, einen Port (8 
bit) zu benutzen. 4 bit für die Spalten, 4 bit für die Zeilen. 
Abwechselnd die Zeilen auf Ausgang '0' und die Spalten mit Pullup 
abfragen. Dann das Ganze umdrehen, die Spalten auf Ausgang '0' und die 
Zeilen mit Pullup abfragen. Diese Ergebnisse addiert ergibt den Code für 
die gedrückte(n) Taste(n). Wieviel Zeilen oder Spalten deine Tastatur 
ist unerheblich, muss halt beim Programmieren maskiert werden.

von Mr-400-Volt (Gast)


Angehängte Dateien:

Lesenswert?

Hab es so gelöst....................

von Sonic (Gast)


Lesenswert?

Funktitoniert. Aber warum bit für bit? Geht doch auch parallel (2 
Abfragen), siehe meinen Quelltext oben. Must nur die unbenutzten bits 
per UND-Verknüpfung 'rausmaskieren.

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.