Forum: Mikrocontroller und Digitale Elektronik 4x4 Keymatrix Starthilfe (PIC 16F877A)


von Gerhard H. (oderlachs)


Angehängte Dateien:

Lesenswert?

Liebe Freunde !

Ich brauche mal wieder einen "Tritt" zum Start. Ich möchte eine 
Matrix-Keyabfrage programmieren, gut ich hätte mir irgendwo was Fertiges 
kopieren und verwenden können, aber ersten möchte ich was eigenes so 
machen zum anderen auch verstehen.
Die Matrixschaltung ist im Foto ersichtlich, oder hier ein Manualauszug 
als PDF-Seite : http://oderlachs.de/forum/key_matrix.pdf

Ich weiss das ich die ROWS-Pins nacheinander auf LOW setzen muss, 
innerhalb dieser Schleife muss ich dann auch noch die 4 Col-Pins jeweils 
abfragen.

Ich würde es gerne in C schreiben, aber am Anfang meiner "PIC-Aera"  tue 
ich doch etwas schwer, weil ich doch sonst AVR Chips verwende.

Vor allen habe ich noch Probleme mit der Datenrichtungsfestlegung 
(TRISTx)

Vielleicht, kann ja wer so nett sein, mir ein wenig beim Start zu 
helfen.

Wie schon erwähnt, falls es von Wichtigkeit ist, benutze ich MPLab mit 
den XC8 als Compiler, den PIC16F877A und das Experimentierbord ist ein 
EasyPIC-40, sowie ein PICKit 3 von Sure - Electronics.

Vielen Dank schon mal für eventuelle Hilfe
und GRüsse

Gerhard

: Bearbeitet durch User
von Thomas E. (picalic)


Lesenswert?

Gerhard H. schrieb:
> Ich weiss das ich die ROWS-Pins nacheinander auf LOW setzen muss,
> innerhalb dieser Schleife muss ich dann auch noch die 4 Col-Pins jeweils
> abfragen.

Kann man so machen, geht aber auch anders, z.B. alle Rows gleichzeitig 
auf 0, dann im 2. Schritt die 0 einer ggf. gedrückten Taste auf den Rows 
ausgeben und die Colum-Pins einlesen.

Das mit dem TRISx ist doch nicht kompliziert - eine "0" im TRIS-Register 
macht die Portleitung zum Ausgang, eine "1" zum Eingang (Eselsbrücke: 0 
sieht aus, wie ein "O" = Output, 1 wie ein "I" -> Input)

Beim PIC noch wichtig: wenn der Pin auch eine Analogfunktion hat (z.B. 
AD-Eingang), muß diese durch eine 0 im entsprechenden ANSEL-Register 
ausgeschaltet werden, da nach einem Reset alle Pins erstmal "analog" 
sind.
Auf analog geschaltete Pins liefern immer eine digitale 0 beim Lesen!

von MaWin (Gast)


Lesenswert?

Gerhard H. schrieb:
>
> Ich würde es gerne in C schreiben, aber am Anfang meiner "PIC-Aera"  tue
> ich doch etwas schwer, weil ich doch sonst AVR Chips verwende.
>
> Vor allen habe ich noch Probleme mit der Datenrichtungsfestlegung
> (TRISTx)

Na das weisst du doch schon:

> Ich weiss das ich die ROWS-Pins nacheinander auf LOW setzen muss,

ROWs sind also offenbar Ausgänge

> innerhalb dieser Schleife muss ich dann auch noch die 4 Col-Pins jeweils
> abfragen.

COLs sind also offenbar Eingänge (mit 1k pull up).

TRISB=0x0F;

Und wenn man ein Hauptprogramm hat, geht die Abfrage einfach
1
char row, key, pressed[4], col;
2
void main(void)
3
{
4
    row=0;
5
    pressed[0]=pressed[1]=pressed[2]=pressed[3]=0;
6
    while(1) // Programm Hauptschleife
7
    {
8
        PORTB=~(0x10<<row); // Zeile auswählen
9
        key=~PORTB&0x0F; // Spalten einlesen
10
        for(col=0;col<4;col++) if((key&~pressed[row])&(1<<col))
11
        {
12
            // Taste KEY 4*row + col gerade runtergedrückt
13
        }
14
        pressed[row]=key;
15
        delayms(10);
16
        row=(row+1)%4;
17
    }
18
}

von Gerhard H. (oderlachs)


Lesenswert?

Danke für das Beispiel werde mal weiter mit probieren.
Die PullUps sind 10k, aber das dürfte ja nix machen.

Gruss und Dank vorerst

Gerhard

: Bearbeitet durch User
von Gerhard H. (oderlachs)


Lesenswert?

Tut mir leid, aber mit dem Beispiel kann ich gar nix anfangen, ausser 
das die 7 Led(PORTD), die die Tasten-Nummer binär anzeigen sollen 
dauernt 24 anzeigen.

Egal werde das Beispiel-Gerüst aber weiter verwenden , vielleicht 
schaffe ich es ja .

Gruss & Danke
 Gerhard

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Gerhard H. schrieb:
> Ich würde es gerne in C schreiben, aber am Anfang meiner "PIC-Aera"  tue
> ich doch etwas schwer, weil ich doch sonst AVR Chips verwende.

wie würde denn deine Tastenroutine in C für einen AVR Chip aussehen? 
Zeig mal.

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Hallo Gerhard,

hier hätte ich Dir eine ganz einfache 4x4 Matrix ohne Entprellung für 
den PIC18F46K80 in C. Der müsste aber auch bei einem PIC16F877A laufen. 
Allerdings habe die Dinger nur mit einem CC5X Compiler und dem Assembler 
programiert.

Grüße
Ingo

von Gerhard H. (oderlachs)


Lesenswert?

Wegstaben V. schrieb:
> Gerhard H. schrieb:
>> Ich würde es gerne in C schreiben, aber am Anfang meiner "PIC-Aera"  tue
>> ich doch etwas schwer, weil ich doch sonst AVR Chips verwende.
>
> wie würde denn deine Tastenroutine in C für einen AVR Chip aussehen?
> Zeig mal.

Leider konnte ich das Beispiel, das ich für den ATMega32 geschrieben 
habe, noch nicht praktisch testen.
Ich muss mir erst das Keymatrix vom PIC Board an das STK500 
"Basteln"(verdrahten)

Aber hier im Link der Code dafür:

http://oderlachs.de/forum/code/KeyMatrix44.html

Gruss und Dank

Gerhard

PS:
@Ingo : Da hast mich aber als PIC ABC-Schützen mit nem Panzer überrollt 
(lach)
Na ich danke trotzdem für den vielen Code, kann ja nur daraus lernen.

Gruss
Gerhard

: Bearbeitet durch User
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.