3x4 Matrix Tastatur mit PCF 8574 auslesen

Gast
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.
Gast
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
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
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
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

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.