3x4 Matrix Tastatur mit PCF 8574 auslesen

Gast #4853138
Lesenswert?

Hallo,

schreibe Dir eine Bibliothek um mit dem PCF8574 lesend und schreibend 
auf die I/O Portpins zugreifen zu können.

Ich verwende einen AVR µC und die Idee: Peter Dannegger, 18.06.2011 aus 
dem Beitrag:
# Beitrag "Re: Tastenmatrix 3x4 Problem"

Die Codeidee habe ich erweitert und auch gleich eine Tastenentprellung 
über einen Zustandsautomaten hinzu gefügt.

Dazu wird noch ein Timer benötigt, den ich mit 1ms "Ticks" laufen lasse 
und daraus verschieden Software Events ableite.
Z.B. einen 10ms Event, der die Keypad Debounceroutine aufruft.

So sieht dann die Mainloop in einem Tesstprogramm mit LunaAVR aus:
1
do
2
 if ( T0.is_tick() ) then
3
    
4
  KEY_MATRIX34.Task()
5
    
6
  key = KEY_MATRIX34.get_key_pressed()
7
  if ( key ) then
8
   Lcd4.Cursor.Set(2,p)
9
   incr p
10
   when ( p > 16 ) do p = 1
11

12
   Lcd4.Char KEY_MATRIX34.gey_key_number( key )
13
  endif
14
 endif
15
loop
#4853153
Lesenswert?

Zum PCF allgemein:

Auf die Ausgänge eine 1 schreiben, damit sie als Eingänge nutzbar werden 
(Open Collector-Transistor sperrt).

Pullups/Pulldowns nicht vergessen an der Matrix.

Außerdem, auch eine nette Stolperfalle, nach Senden der 
Slave-Adresse+Read-Bit, um die Daten auszulesen: Im Controller kein ACK 
auslösen, da es nur ein Datenbyte gibt. Sprich ein No-Ack-Read.


Ansonsten kann ich ein CD4021 empfehlen. Ist günstiger als diese 
Portexpander, wenn man die Ausgangsfunktion nicht braucht und nur 
einlesen will... nur halt über SPI statt I2C.
Gast #4853195
Lesenswert?

Danke für eure Hilfe. Habe das von Peter dabei.
1
#include <avr\io.h>
2

3
#define NOP();  asm volatile("nop"::);
4

5

6
#define KEY_PIN         PINB
7
#define KEY_PORT        PORTB
8
#define KEY_DDR         DDRB
9

10
// Pin 0..3 = column 1..4
11
// Pin 4..6 = row 1..3
12

13

14
uint8_t keyscan( void )
15
{
16
  uint8_t col = 0, row = 0;
17

18
  KEY_PORT |= 0x7F;                     // all pullups on
19
  KEY_DDR = (KEY_DDR & 0x80) | 0x70;    // pin 6..4 = output
20
  KEY_PORT &= 0x8F;                     // pin 6..4 = output low
21
  NOP();                                // wait until inputs sampled
22
  if( ~KEY_PIN & 1<<0 )                 // if pin 0 = low
23
    col = 4;
24
  if( ~KEY_PIN & 1<<1 )
25
    col = 3;
26
  if( ~KEY_PIN & 1<<2 )
27
    col = 2;
28
  if( ~KEY_PIN & 1<<3 )
29
    col = 1;
30
  row = col;
31
  if( col ){                            // if column found, check row
32
    KEY_PORT |= 0x7F;                   // all pullups on
33
    KEY_DDR = (KEY_DDR & 0x80) | 0x0F;  // pin 3..0 = output
34
    KEY_PORT &= 0xF0;                   // pin 3..0 = output low
35
    NOP();                              // wait until inputs sampled
36
    if( ~KEY_PIN & 1<<4 )
37
      row = 5;
38
    if( ~KEY_PIN & 1<<5 )
39
      row = 9;
40
    if( ~KEY_PIN & 1<<6 )
41
      row = 13;
42
  }                                     // 0 = no key
43
  return row - col;                     // 1..12 = key
44
}

Da fehlt aber der PCF8574 bzw. die Ansteuerung des I2C Bus.
Werde auch die anderen Stellen anschauen.
LG Kli
Gast #4853375
Lesenswert?

Klausi schrieb:
> Oder hat jemand ein Beispiel dazu?

Warum nicht etwas Eigenleistung erbringen? Wenigstens
ein bisschen?

Hier auf der Seite gibt es eine I2C Lib, die braucht man
nur nehmen, minimal anpassen und schon kamn man I2C
lesen und schreiben.

Als zweiten Schritt liest man das Datenblatt des PCF8574,
dann weiss man wie Lesen und Schreiben dieses Bausteins
funktioniert.

Als dritten Schritt liest man wie eine Key-Matrix auszuwerten
ist, siehe PeDa, und hängt diese Auswertung an das Byte das
über den PCF8574 zu lesen und zu schreiben ist.

Eigentlich eine ganz einfache Vorgehensweise. Nur muss man
eben etwas mehr tun als nur "gugl" und "keymatrix" in den
Browser einzutippen.
Gast #4853404
Lesenswert?

Mit dem I2C Bus arbeite ich bereits. Kann Codes zu verschiedenen Sachen 
reinstellen, bzw. steht schon einiges drin.
Habe so ein kleines Verständnisproblem bei der Auswertung der 
Tastermatrix. Benutze bereits Auswertungen für 8x Taster mit I2C.
Da die Organisation einer Matrix 3 x 4 ist, müssen doch immer 2 Taster 
ausgewertet werden? Was passiert wenn ich gleichzeitig 2 oder mehr 
Taster drücke?
Gast #4853458
Lesenswert?

In dem Beitrag von PeDa wird eine Matrix mit Dioden verwendet. Wie er 
schreibt sind die aber nicht nötig, wenn ich 3 oder mehr schalten will?
In der Taster Matrix die verwende und sicher auch viele andee sind vom 
hersteller keine eingebaut. es ist eine Kontaktfolie (Platine) drin, 
wodurch ein nachrüsten sehr schwer wird.
Joachim, hast du den Hinweis auf die Seite 2 mal geschickt?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren