Pewnie wielu z Was zaawansowanych użytkowników mikrokontrolerów, uśmiechnie się z politowaniem czytając ten post. Myślę jednak że początkującym jak ja, może się przydać.
Jestem już stary i pamiętam takie rzeczy jak mechaniczne kodery DEC na BCD montwane w urządzeniach pomiarowych, które służyły do nastaw dzielników częstotliwości czy innych takich...
Niedawno zaskoczyła mnie konieczność wykonania sterownika z dużą ilością peryferiów i dużą ilością klawiszy. Mimo iż zastosowałem Atmega128, to nie wiele mi zostało zasobów żeby obsłużyć 7 klawiszy.
Do głowy mi przyszło najbardziej dla mnie oczywiste rozwiązanie, czyli klawiatura BCD (przez analogię do starych mechanicznych koderów działających właśnie w kodzie BCD). Jednak pomyślałem że przewalę internet może istnieje coś prostszego i bardziej nowoczesnego niż ta metoda starsza od torfu...?
Znalazłem w necie rozwiązania oparte na:
1 klawiaturze analogowej
2 klawiatura matrycowa
3 klawisze pojedyncze podłączane bezpośrednio do pinów kontrolera
Przykładów powyższych rozwiązań jest cała masa w necie, natomiast pomysłu który mi przyszedł do głowy, praktycznie nie znalazłem. Natknąłem się dosłownie na dwa takie rozwiązania zakamuflowane głęboko jak by to było jakieś niezwykle dziwne i nietypowe. Podczas gdy wydawać by się mogło że to najbardziej oczywiste rozwiązanie. Może ja nie umiem w internety i źle szukałem.
Tak czy inaczej postanowiłem wrzucić na nasze forum moją metodę na dużo klawiszy na małej ilości pinów
Może się przyda komuś kto jest w potrzebie.
Panowie i Panie fachowcy, ten post jest dla początkujących
tak wygląda fragment schematu budowanego przezemnie sterownika, a dokładnie fragment z klawiaturą
jak widać, użyłem trzech pinów procka i 12 zwyczajnych diod krzemowych podłączonych do tych pinów w porządku kodu BCD.
Z trzech pinów uzyskałem w ten sposób 7 klawiszy. z Czterech pinów będziemy mogli mieć 16 klawiszy czyli już lepiej niż klawiatura matrycowa która potrzebuje całego portu.
Diody które podpięte są do pinów portów, są uporządkowane zgodnie z kodem binarnym:
8421 w negacji czyli
111 = 0 żaden przycisk nie wciśnięty stany wysokie na wszystkich pinach
110 = 1 wciśnięty przycisk 1
101 = 2 wciśnięty przycisk 2
100 = 3
011 = 4
010 = 5
001 = 6
000 = 7
Można dodać czwarty pin itd....
Żeby to obsłużyć programowo, przyszły mi do głowy dwa sposoby. Pierwszy najbardziej oczywisty i chyba najprostszy dla takiego początkującego jak ja to po prostu sprawdzanie stanu wszystkich trzech pinów jak w tym przykładzie:
Przygotowałem sobie makra dla trzech pinów ja akurat miałem do dyspozycji 3 kolejne piny tego samego portu, ale to generalnie bez znaczenia. Można użyć dowolnych pinów które pozostały do użycia.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
w pętli głównej ustawiam kierunki i pociągam do VCC (na schemacie mam też rezystory podciągające na tych pinach)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i teraz pozostało stworzyć funkcję która będzie sprawdzać stany pinów
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
inna metoda obsługi takiej klawiatury to metoda tablicowa, której nie opracowałem
może ktoś zechce dopisać jakiś inny fajny kod do obsługi tej przedpotopowej metody klawiaturowania
Dla mnie warto było zapakować te diody żeby odzyskać kilka pinów procka.
Tak wygląda na mojej płytce:
Zdecydowałem się to tutaj opublikować nie żeby się chwalić, bo jestem naprawdę początkujący, ale tylko dla tego że nie ma wiele takich przykładów w internecie. Może dla tego że tak oczywiste jak podłączanie kwarca do procka?
Wada tej metody jest taka że nie da się użyć kombinacji klawiszowej, podobnie w metodzie z ADC czy matrycowej bez niezbędnych modyfikacji...
Mam nadzieję że komuś się przyda, a może ktoś zamieści bardziej prawidłową funkcję obsługi klawiatury BCD.