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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Elias *. (green_phanta)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.