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ß!