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
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
|
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.
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
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
Hatte es bereits oben geschrieben. Arbeite mit Atmega 128 und schreibe mit C, nicht C++
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.
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?
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.