Forum: Mikrocontroller und Digitale Elektronik keypad matrix


von Alain F. (fox82)


Lesenswert?

Hallo Zusammen

Ich habe eine 3x4 Matrix so wie ein Codeschloss.

Wie kann ich diese am besten ansteuern? Bis jetzt habe ich immer nur 
immer einen Pin von Low zu High gezogen, kann mit dem Microcontroller 
auch zwei Pins verbinden und danach eine Aktion auslösen? z.B. Der 
Kontroler merkt wenn PD1 und PD2 zusammengeschalten sind.

Meine Idee: Ich möchte über einen Mikrocontroller und dem KeyPad die 
Keys in Binärcode zu einem anderen Controler schicken (0000001, 00000010 
etc) so kann ich muss ich anschliessend nur einen Pin am Hauptkontroller 
belegen.


Stehe gerade ein wenig auf dem Schlauch... Danke für die Hilfe.

Gruss Alain

von Markus L. (ichkg)


Lesenswert?

ich weiß nicht genau was du damit meinst aber normalerweise macht man 
das so das man alle taster in der zeile verbindet dann hat man 4 
leitungen und alle taster in einer spallte da bekommt man 3 leitungen

dann macht man das so das die spallten oder zeilen eine nach der anderen 
eingeschalten wird und dann abgefragt wird welcher butten in dieser 
spalte/zeile gedrückt ist dann schaltet man die nächste zeile/spalte ein 
usw.

mfG
IchKG

von Alain F. (fox82)


Lesenswert?

Hallo Danke für Antwort.

Dies ist mir schon klar! Nur:

Wenn ich z.B. die einte Zeile auf Ground hänge, dann kann ich über die 
Spalten 4x ein Impuls auf einen Eingang geben.

So wenn ich aber alle 3 Zeilen anschliessen möchte, dann haben die alle 
untereinander Verbindung.

Wie kann man das gescheit machen?

von Markus L. (ichkg)


Angehängte Dateien:

Lesenswert?

ich glaub du hast meine lösung nicht ganz verstanden

du schalltest einen pin vom µC ein der mit der ersten spalte verbunden 
ist
wenn du dann einen taster drückst fließt der strom von der ersten spalte 
durch den taster auf die jeweilige zeile so weißt du in welcher taster 
gedrückt ist auch wenn alle gedrückt sind:

nochmal
du brauchst 4 eingänge und 3 ausgänge am µC
du schaltest ausgang1 ein und schaust bei welchem eingang ein signal 
reinkommt wenn das erledigt ist schaltest du ausgang1 aus und ausgang2 
ein und schaust wieder bei welchem eingang ein signal reinkommt usw.
hab hier noch ein bild im anhang

mfG
IchKG

von Alain F. (fox82)


Lesenswert?

Ah Danke vielmals! So macht es sinn!

Werde es gleich ausprobieren.

Schöne Weihnachten!

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Schau mal bei sprut - 
http://sprut.de/electronic/pic/programm/tastlcd/tastlcd.html. Da wird 
sogar noch das Display mit angeschlossen. Mach ich bei allen meinen 
Projekten so und funktioniert prima. Ist allerdings für PIC. Kann man 
aber sicher auch auf AVR anwenden.

von Peter D. (peda)


Lesenswert?

Jau, da gibts viele Möglichkeiten.

Z.B. liest man 2-mal ein, erst die Spalten, dann die Zeilen, hier ein 
Beispiel für ne 4*4 Matrix:
1
#include <avr\io.h>
2
3
typedef unsigned char  u8;
4
typedef unsigned short u16;
5
#define NOP();  asm volatile("nop"::);
6
7
8
#define KEY_PIN         PINB
9
#define KEY_PORT        PORTB
10
#define KEY_DDR         DDRB
11
12
13
u8 keyscan( void )
14
{
15
  u8 col = 0, row = 0;
16
17
  KEY_PORT = 0xFF;
18
  KEY_DDR = 0xF0;
19
  KEY_PORT = 0x0F;
20
  NOP();                        // wait until input stable
21
  if( ~KEY_PIN & 1<<0 )
22
    col = 4;
23
  if( ~KEY_PIN & 1<<1 )
24
    col = 3;
25
  if( ~KEY_PIN & 1<<2 )
26
    col = 2;
27
  if( ~KEY_PIN & 1<<3 )
28
    col = 1;
29
  row = col;
30
  if( col ){
31
    KEY_PORT = 0xFF;
32
    KEY_DDR = 0x0F;
33
    KEY_PORT = 0xF0;
34
    NOP();
35
    if( ~KEY_PIN & 1<<4 )
36
      row = 5;
37
    if( ~KEY_PIN & 1<<5 )
38
      row = 9;
39
    if( ~KEY_PIN & 1<<6 )
40
      row = 13;
41
    if( ~KEY_PIN & 1<<7 )
42
      row = 17;
43
  }                             // 0 = no key
44
  return row - col;             // 1..16 = key
45
}

Wichtig ist, daß man die Pullups benutzt und die Ausgänge nur low, also 
über das Direction-Register, sonst gibts Datenkämpfe, wenn man mehrere 
Tasten gleichzeitig drückt.

Oder über einen Pin und Widerstände:

Beitrag "Tastenmatrix auslesen über nur 2 Leitungen"


Peter

von spess53 (Gast)


Lesenswert?

Hi

Siehe AVR-AppNotes AVR249, AVR242, AVR243, AVR245

MfG Spess

von Alain F. (fox82)


Angehängte Dateien:

Lesenswert?

Hallo Leute!

Habe es geschafft die Matrix anzusteuern!
Jetzt habe ich mal für jede Taste eine Frequenz erzeugt. Nun möchte ich
die Frequenz mit einem anderen Controller erfassen. Dies werde ich jetzt
versuchen und mich gegebenenfalls melden.

Gruss Alain

von Markus L. (ichkg)


Lesenswert?

schön das du ne lösung gefunden hast
aber:
hast du auch schon dran gedacht was passiert wenn mehrere taster 
gleichzeitig gedrückt werden?

mfG
IchKG

von Alain F. (fox82)


Lesenswert?

Hallo IchKG,

Ja es bleibt bei der ersten hängen! es hat ja while schleifen!
Oder es wird die Taste genommen, welche zuerst gedrückt wird.

Falls du meinst dass man Tastenkombinationen machen könnte, dies ist 
nicht vorgesehen. So wie Taste 1+2 für Menüaufruf etc.

Gruss Alain

von Markus L. (ichkg)


Lesenswert?

Ich mein das der Benutzter gleichzeitig 2 Tasten drückt
ob da dein µC drauf vorbereitet ist und hier eigentlich entscheiden muss 
welche er nehmen soll und sich dabei nicht aufhängt

von Alain F. (fox82)


Lesenswert?

Nein das passiert nicht, da ich das Programm über einen seperaten Mega 
laufen lasse. Der Hauptmega mit dem eigentlichen Programm wird dannach 
anhand der Frequenz die Taste zuweisen.

Gruss Alain

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.