Ajamamototakie
Wrzucam cały główny program + include, bo nie chce mi się go ciąć, ot leń ze mnie i tyle
Przy okazji w ramach gratisu"wieczny" kalendarz na lata 2000-2255 obliczający dzień tygodnia (procedura
calc_weekday) w zdaję się mniej niż 100 cykli, a nie jakieś badziewie z AVT, które potrzebuje na to kilku sekund(!). No i jeszcze pare pierdółek - w sumie to jest część wypasionego zegara LCD z kontrolerem PLL do nadajnika.
Tabuacja jest na 4. W ramach mojego "zboczenia" lingwistycznego wszystkie komentarze są po angielsku
Obsługa klawiatury jest mieszana: wszystko, co jest związane z odmierzaniem czasu jest w przerwaniu timera0 (zaczyna się od etykiety
noclock)
Cała "logika" jest w głównej pętli programu zaraz na początku (etykieta
main)
Najpierw do zmiennej
buttons ładowane są stany odczytane z linii portu (aliasy BLEFT, BRIGHT itd. to właśnie linie portów odpowiadające poszczególnym przyciskom) Taki sposób odczytu czyni program bardzo uniwersalnym - można w tym miejscu wstawić dowolną procedurę odczytującą stany klawiszy.
Dalej jest cała logika - na podstawie stanów przycisków i pozostałych zmiennych odnoszących się do klawiatury "składana" jest zmienna
bexec, określająca, które funkcje należy wykonać (specjalnie napisałem "które", bo program radzi sobie z dowolną ilością klawiszy wciśniętych naraz). Poszczególne bity zmiennej
bexec odpowiadają funkcjom przyporządkowanym do klawiszy. I tak - jeżeli klawiszowi odpowiada bit 3 w zmiennej
buttons, to po jego naciśnięciu zostanie ustawiony bit 3 w zmiennej
bexec.
Na podstawie zawartości
bexec wywoływane są procedury obsługi poszczególnych klawiszy.
Algorytm jest dość zawiły, ale jakoś pokrótce postaram się opisać przynajmniej jak działa z punktu widzenia użytkownika, w rzeczywistości wygląda to nieco inaczej.
Przede wszstkim - każdemy przyciskowi z osobna można przypisać funkcję autopowtarzania (zmienna
bautorep)
Przyciski zachowują się tak jak klawiatura komputera - jeżeli dla przycisku uaktywniona jest funkcja autopowtarzania, to po pierwszym naciśnięciu natychmiast wywoływana jest odpowiadająca mu funkcja, potem przycisk pozostaje nieaktywny przez czas określony przez stałą
iclock2d (jednostką jest 10ms, ale można zmienić). Po upłynięciu tego czasu, jeżeli przycisk jest wciąż wciśnięty, funkcja wywoływana jest ponownie. Od tej pory wywoływanie powtarza cię co okres wyznaczony przez stałą
iclock2r (jednostka 10ms), aż do momentu, gdy klawisz zostanie zwolniony.
Dla klawiszy, które nie mają funkcji autopowtarzania procedura wywoływana jest tylko raz po naciśnięciu klawisza i przytrzymywanie go nie pomaga
Jeżeli aktualnie powtarzany jest jakiś klawisz (autopowtarzanie) i wciśnięty zostanie kolejny, to ten jeden raz opóżnienie autopowtarzania dla przytrzymywanego klawisza będzie równe
iclock2d zamiast
iclock2r. takie uproszczenie w niczym nie przeszkadza, a i program nie musi być dzięki temu niepotrzebnie rozbudowany.
W momencie, gdy klawisz zostaje zwolniony rozpoczyna się odmierzanie czasu "martwego" (stała
iclock0 jednostka 0.25ms, domyślnie 40ms), przez który przycisk nie reaguje na naciskanie.
Wszystkie właściwości klawiatury można modyfikować "w locie", dotyczy to zarówno funkcji autopowtarzania, jak i czasów opóźnień, z tym że te ostatnie należało by w tedy zapisywać jako zmienne, a nie stałe.
Całość jest tak zorganizowana, że praca programu nie jest przerywana, całe odmierzanie czasu odbywa się w tle.
No i zastosowany algorytm eliminuje "za jednym zamachem" drgania powstałe zarówno przy naciskaniu, jak i zwalnianiu klawisza.
W tej wersji obsługiwane jest maksymalnie 8 klawiszy, dodanie kolejnych sprowadza się do powtórzenia kilka razy (po jednym na każde 8 klawiszy) tego samego kodu (a właściwie tylko "logiki" i małej modyfikacji przerwania)
Żeby wykorzystać procedurę we własnym programie trzeba wyciąć wszystko od etykiety
main do komentarza "Clock and date incrementing", oraz wszystkie fragmenty, do których kod ten sie odwołuje (przerwanie!). Ważna jest też procedura inicjalizująca zmienne.
Przerwanie wywoływane jest co 250µs, można z powodzeniem użyć innej częstotliwości, trzeba wtedy tylko dobrać odpowiednio stałe opóźnień.
The Koniec