Forum: Mikrocontroller und Digitale Elektronik 3x4 Matrix Tastatur mit PCF 8574 auslesen


von Klausi (Gast)


Lesenswert?

Hallo Gemeinde
Wie kann ich ein 3x4 Matrix Tastatur mit einem PCF8574 in C auslesen?
Habe einige Artikel dazu gefunden. Leider einiges in Python oder Basic.
Leider nichts konkretes dazu. Oder hat jemand ein Beispiel dazu?
Kl

von Gugeldepp (Gast)


Lesenswert?


von Klugscheißer (Gast)


Lesenswert?


von Karl M. (Gast)


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

von Robin S. (der_r)


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.

von Klausi (Gast)


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

von Klaus R. (klara)


Lesenswert?

Klausi schrieb:
> Da fehlt aber der PCF8574 bzw. die Ansteuerung des I2C Bus.
> Werde auch die anderen Stellen anschauen.

Dann sollte man schon verraten unter welchem System Du arbeitest.
mfg klaus

von Klausi (Gast)


Lesenswert?

Hatte es bereits oben geschrieben. Arbeite mit Atmega 128 und schreibe 
mit C, nicht C++

von Gugeldepp (Gast)


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.

von Klausi (Gast)


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?

von Joachim B. (jar)


Lesenswert?

Beitrag "Re: matrix am pcf8574"
Beitrag "matrix am pcf8574"

noch nicht probiert, aber wenn PeDa sagt es klappt dann vertraue ich 
ihm.

http://playground.arduino.cc/Main/I2CPortExpanderAndKeypads

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Da die Organisation einer Matrix 3 x 4 ist, müssen doch immer
> 2 Taster ausgewertet werden?

Es müssen immer 3 oder 4 gleichzeitig ausgewertet werden.

> Was passiert wenn ich gleichzeitig 2 oder mehr Taster drücke?

Kommt drauf an, welche Taster gedrückt werden und ob die Matrix Dioden 
enthält.

https://www-user.tu-chemnitz.de/~heha/Mikrocontroller/Tastenmatrix.htm

von Klausi (Gast)


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?

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.