Scanning af 4x4 matrix med AVR

Feb 10, 2007 37 Replies

Hejsa



Jeg skal igang med et projekt, hvor jeg anvender en AVR controller. Denne skal bl.a. kunne scanne to 4x4 matrix keypads. Koden hertil laves i C. Jeg mangler dog en application note til scanning af disse keypads. Det er ikke noget problem at finde en med et kodeeksempel i assembler, men er der nogen, der kan henvise til en i C, eller selv har lavet noget tilsvarende, jeg må have lov til at se, vil det glæde mig meget.


Mvh. Tomas

Tomas . skrev:

Scanning af keypad? Du kan enten lave polling eller interrupt drevet. Ved du hvordan et keypad virker?

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Mikkel Lund skrev:

Tja, det virker vel ved, at nogle porte er sat til output og andre til input - så sendes der på skift til 1 output af gangen, og derefter checkes, alle input, for at se, hvilket der er ændret...

Mvh. Tomas

Tomas . skrev:

Nej sådan virker det ikke som standart. Normalt er er en linje per række og per kolonne. Så sampler man på alle linjer, finde de to linjer der noget andet end de andre. De passer så med række og kolonne til den knap der er trykket. Så hvis du har nok input ben kan du bruge 8 til at dekode et 4x4 keypad, og hvis du har processor kraft til overs kan du polle på linjerne, så behøves du ikke noget ekstra hardware.

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Mikkel Lund skrev:

Man har vel aldrig pinne nok :-) Jeg har lavet det, så jeg bruger en 8-bit port til at scanne et

4x4 keypad. Dette skal jeg så have 2 gange.
Mvh. Tomas

Tomas . skrev:

Okay. Så ville jeg bruge en 16 kanals MUX, dvs man kommer til at bruge 4 pins til adresse og en til at læse med.

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

En 16 kanals MUX? Den har da kun 1 input/output i forhold til de

16... Det må du hellere beskrive nærmere. Jeg benytter ellers en ATmega8515 til jobbet, så jeg har 2 porte ledig til de to 4x4 keypads.
Mvh. Tomas

Hvorfor 2 gange, kan du ikke genbruge output pinde til at scanner nummer

2 keypad med?

Tomas . skrev:

Undskyld det skulle være en demux.

Hvad er problemet så? En pad per port!

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Hvordan ved man så, hvilket keypad, der er trykket på?

Mvh. Tomas

Mikkel Lund skrev:

de

Det giver mere mening.

porte

Desværre nej. Jeg skal stadig have to stk. 4x4 keypads som input - altså i alt 32 knapper.

Mvh. Tomas

Tomas . skrev:

Jamen Tomas du har jo lige skrevet: "Jeg har lavet det, så jeg bruger en 8-bit port til at scanne et

4x4 keypad. Dette skal jeg så have 2 gange."

Du kan altså koble to 4x4 keypads til 2 porte (2x8bit).

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Mikkel Lund skrev:

Ja, det er også det, jeg gør, men det giver jo omregnet også to knapper pr. bit.

Mvh. Tomas

Tomas . skrev:

JA, hvad er det du vil???

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Ved at du *IKKE* genbruger input benene.

Så 4 bit ud til Y1 + Y2 (fordi Y1 = Y2)

Og 8 bit ind fra X1 og X2...

Mikkel Lund skrev:

også to

Sorry - Jeg prøver lidt tydeligere så...

På PORTA sidder 16 knapper. De 16 knapper er reelt 16 positionsmicroswitche.

På PORTD sidder et 4x4 keypad. Når en tast på PORTD påvirkes, skal en DC motor aktiveres. Denne vil gennem en gearing få en slæde til at bevæge sig. Under denne bevægelse, påvirkes en positionsswitch een af gangen. Motoren fortsætter med at køre indtil den positionsswitch med det samme nummer, som den tast, der tidligere blev trykket på, påvirkes.

Håber denne beskrivelse, hjælper på forståelsen af mit problem.

Mvh. Tomas

Tomas . skrev:

Okay, hvad er problemet så?

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Mikkel Lund skrev:

problem.

Tja, mangel på kode i C, der kan håndtere dette :-)

Mvh. Tomas

Tomas . skrev: >

Okay, I get it now :-)

Du skal vel bare starte fra en ende af: En routine der kan læse et keypad. En routine der kan styrer en motor. En routine der kan læse knapper.

Lide slamkode:

while(1){ if(keypad() != no_push){ run_motor(); while(switch() != key){} stop_motor(); } }

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Tomas . skrev: >

Okay, I get it now :-)

Du skal vel bare starte fra en ende af: En routine der kan læse et keypad. En routine der kan styrer en motor. En routine der kan læse knapper.

Lide slamkode:

while(1){ if(keypad() != no_push){ motor(run); while(switch() != key){} stop_motor(stop); } }

Hilsen Mikkel Lund "Sund fornuft, har aldrig stoppet en tosse" Jokeren i "Mænds ruin"

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required