Forum: Mikrocontroller und Digitale Elektronik sequentielle returns bei Keypad Multi Presses


von Elias *. (green_phanta)


Lesenswert?

Hi,

ich habe ein 8x8 Keypad-Matrix und einen SX1509 Port Expander welcher 
Matrix Scanning unterstützt. Die zugehörige Library hat Funktionen 
definiert, welche mir die aktuellen Reihen und Spalten zurückgibt. 
Hierfür verwendet der Code Bitwise Operations:

Bei einem Interrupt wird die Funktion readKeypad() ausgeführt und gibt 
mir einen 16-Bit Wert zurück. Diese 16 Bits repräsentieren den Zustand 
der 8 Reihen und Spalten (1: An, 0: Aus):
1
<--COL--> <--ROW-->
2
1111 1111 0000 0000


Dieser Wert wird in die Funktionen getRow() und getCol() übergeben:
1
// getRow(): This function returns the first active row from the return value of readKeypad().
2
3
byte SX1509::getRow(unsigned int keyData)
4
{
5
  byte rowData = byte(keyData & 0x00FF);
6
7
  for (int i=0; i<8; i++)
8
  {
9
    if (rowData & (1<<i))
10
      return i;
11
  }
12
  return 0;
13
}
14
15
// getCol(): This function returns the first active column from the return value of readKeypad().
16
17
byte SX1509::getCol(unsigned int keyData)
18
{
19
  byte colData = byte((keyData & 0xFF00) >> 8);
20
21
  for (int i=0; i<8; i++)
22
  {
23
    if (colData & (1<<i)) 
24
      return i;
25
  }
26
  return 0;
27
}

Nun ich bin noch recht neu mit Bitwise Operation aber den Code verstehe 
ich. Mein Problem ist das ich das Verhalten nicht verstehe. Eigentlich 
sollte wie der Hersteller schon richtig kommentiert nur die ERSTE 
Reihe/Spalte die Active Low geschalten wurde zurückgegeben werden. Da 
ich aber Multi-Keypresses benötige muss ich nicht nur die erste 
Aktive-Low Spalten sondern auch alle folgenden zurückgeben (sofern sie 
auch active-low sind).

Das komische ist aber, bei getRow() funktioniert das wunderbar. Wenn ich 
das im Serial ausgebe passiert das:
1
   // Single Press Taste A
2
   row: 1
3
   row: 1
4
   row: 1
5
   row: 1
6
   row: 1
7
   row: 1
8
   // Single Press Taste B
9
   row: 2
10
   row: 2
11
   row: 2
12
   row: 2
13
   row: 2
14
   // Multi Press Taste A + B
15
   row: 1
16
   row: 2
17
   row: 1
18
   row: 2
19
   row: 1
20
   row: 2
21
   row: 1
22
   row: 2
23
   row: 1
24
   row: 2

Bei getCol() wird aber immer nur die erste active-low Spalte 
zurückgegeben:
1
   // Single Press Taste A
2
   col: 0
3
   col: 0
4
   col: 0
5
   col: 0
6
   // Single Press Taste B
7
   col: 1
8
   col: 1
9
   col: 1
10
   col: 1
11
   // Multi Press Taste A + B
12
   col: 0
13
   col: 0
14
   col: 0
15
   col: 0
16
   col: 0


Ich verstehe nicht, warum sich diese zwei Funktionen unterschiedlich 
verhalten? Beziehungsweise, hat jemand eine Idee, wie mir getCol() auch 
sämtliche Aktiven Reihen hintereinander zurückgibt?

Ich hoffe ich hab das einigermaßen verständlich beschrieben. Danke für 
eure Hilfe.

Gruß!

: Bearbeitet durch User
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.