sequentielle returns bei Keypad Multi Presses

OP #4893645
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ß!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.