Denne application note beskriver nogenlunde det, jeg ønsker, skønt jeg ikke kører det interruptstyret (der nok var det smarteste) - jeg har ikke porte fri til interruptbrug, alle porte er i brug.
formatting link
Denne applikationnote er endnu smartere, og sparer samtidigt en port:
formatting link
Men kodemængden er dog rimelig stor, samt i assempler, jeg lykkeligt har glemt alt om, hvordan virker, så en simpel C-kode til håndtering af den første applikationkode - bare uden interruptfunktionen beskriver nok meget det jeg gerne vil. Så er det jo nærmest blot at gentage denne kode for den anden port.>--
Hvilket jo desværre fører os tilbage til mit oprindelige spørgsmål nemlig, om der er en, der ligger inde med et kodeeksempel i C, der kan afkode et tastetryk i en matrice... :-)
I en 4x4 matrix er de 4 ledninger output og de andre fire ledninger input. De fire input ledninger har pullup til Vcc (Evt inbygget i MPU'en) og de 4 output er også Vcc i hviletilstand.
Når du scanner tager du på skift og lægger en af de 4 output til 0 volt og læser de 4 input, hvis et af input er 0, så er en tast nedtrykket i din matrix, lige hvor input/output krydser.
Den løsning havde jeg også overvejet. Og de 0.7V spændingsfald skulle jo ikke gøre, at controlleren ikke kan detektere korrekte niveauer, når man køre 5V
Der er ingen grund til det, hvis du kun regner med at bruge en tast af gangen. For at undgå kortslutning af to output kan man programmere MPU'en til at bruge oc output og pullup (2 taster samtidig er ok), eller sætte en modstand i serie med hver udgang (2 taster samtidig kan give forkert aflæsning). Eneste problem er så at 3 samtidige taster kan se ud som 4 taster og det kan kun løses med dioder.
De ovenstående problemer vil kun opstå ved bestemte tastkombinationer, i mange tilfælde vil 2 og 3 taster sagtens kunne aflæses.
Det jeg så har sprunget over er debounching, som kan være nødvendigt. Det klares ved at forlange at en tast skal være nede i over 20 ms (værien er lidt afhængig af hvilken type tast du bruger), før den bliver rapporteret som en tast. Det kan klares ved at gemme den gamle portaflæsning i en array og hvis aflæsningen skifter, så vent 10 ms og læs igen, hvis den stadig er skiftet, så accepteres tasttrykket.
Grunden til at det kan være nødvendigt er at kontakter ikke bare tænder og slukker, de står faktisk og hopper mellem tændt/slukket en del gang, lige når man skifter.
Hvis du scanner langsomt, vil du selvfølgelig ikke se det, men jeg har tit gemt tastscannet i samme rutine som multiplexer et led display og så er mit scan ret hurtigt.
Det er jo lige det, jeg har ledt efter :-) Men funktionen bit_is_set(), hvor finder jeg den? Den er ikke at finde i CodeVision, som jeg anvender. Findes den i AVR-GCC?
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.