systemy alarmowe telewizja przemysłowa kontrola dostępu sklep internetowy schematy montażowe instrukcjo, pcdgląd z kamor on-lino
Listing 119 pokazuje natomiast funkcję umożliwiającą ustawienie szybkości repetycji klawiatury. W krytycznym momencie przerwania muszą zostać chwilowo zablokowane - zgłoszenie przerwania w chwili operowania na zmiennych repetycji klawiszy mogłoby wywołać wygenerowanie błędnego komunikatu. Po zdefiniowaniu, funkcję system kbdRepeatSpeed należy zadeklarować w pliku system.h. Powinieneś już poradzić sobie z tym bez trudu. W razie problemów podeprzyj się listingiem 118.
Listing 120 pokazuje serce obsługi klawiatury. Funkcja ta sprawdza stan jednego klawisza i na tej podstawie generuje odpowiednie komunikaty. Zwracam Twoją uwagę na fakt, że komunikat danej akcji klawisza SW2 ma zawsze kod o 1 większy niż komunikaty klawisza SW1.
Aby moduł klawiatury ożył, konieczne jest wywoływanie prostej funkcji widocznej na listingu 121 co 40ms. Wykorzystamy w tym celu przerwanie licznika. W tym miejscu klawiaturę możemy uznać za przygotowaną do pracy.
Timer systemowy w naszym przypadku jest pomyślany w taki sposób, aby generował przerwanie co lOms. Tak więc co czwarte przerwanie będziemy wywoływać funkcję obsługującą klawiaturę. Aktualnie będziemy robić tylko tyle - później zakres zadań będzie rozszerzany. Do generowania przerwań wykorzystamy timer 2. Listing 122 pokazuje funkcję obsługi jego przerwania, zajmującą się klawiaturą.
ABC... C switch-case
Instrukcja switch-case jest dość podobna w działaniu do BASCOM-owej instrukcji CASE jednak, co może zaskoczyć, w C ma ona nieco mniejsze możliwości. Składnia instrukcji switch-case jest następująca:
Swi tch(wyrażenie)
case wartość i:
instrukcje case wartoćć_2:
instrukcje
default:
i rsr.ru keje
}
Wyrażenie musi w wyniku dawać wartość całkowitą. Jeśii wśród wymienionych przypadków znajdze się wartość, która odpowiada wartości wyrażenia, wykonany zostanie skok do punktu, w którym się ona znajduje. Uważaj teraz - instrukcje sąwykonywune aż do natknięcia się na instrukcję break (wyjście z klamry switch), return (zakończenie całej funkcji) łub ewentualnie goto (skok do podanej etykiety). Oznacza tn, że jeśli nie wydamy odpowiedniego rozkazu, nastąpi przejście do naslępnego przypadku i wykonanie jego instrukcji - ta możliwość czasami się przydaje.
Przypadek default jest opcjonalny. Jeśli zostanie wprowadzony, instrukcje w nim zawarte zostaną wykonane, jeśli żaden z poprzednich przypadków nie pasuje do wartości wyrażenia. W innym przypadku instrukcja switch się zakończy.
Przykłady: iisling i26 oraz 134
Listing 124 - generowanie opóźnień za pomocą przerwania systemowego
// Zmienna do generowania opóźnień,
// zmniejszana do 0 co lOms statite
// Funkcje obsługi opóźnienia inline void system_delayS«t(uint3_t delay) {
svstem_delay - delay;
inline uint8 z sysremdelayGetCyoid)
return system_delav;
V0id system_delayMake(uinc8_t delay)
system_delaySet(delay); wtiile(o l* system_delayGetO) (}
obsługa timera sys 5R(TIMER2 COMP vect)
Statlc uintbt ticks
Jprzyspieszenie działanTa]
■ dela1
Listing 123 - inicjacja Umera 2 do pracy
// inicjacja timera systemoweoo
TCCR2 - 1«WC-M21 /*CTC*/ I
l«CB2? | l«cs21 | l«cs2D /*clk:1024*/;
OCF.2 «• 78; // około lOms
// Przerwania
TIMSK ■ 1«0CIE2 /^porównania z timer a sei();
2V;
W tej chwili możemy wykonać już niewielką modyfikację systemu, lak aby współgrał praw idłowo 7 nowym sposobem obsługi klawiatury. Jedyna różnica pojaw i się tutaj w chwili oczekiwania na przycisk wyboru języka. Zamiast wykorzystanej poprzednio funkcji sw_wuit wpisz kod z listingu 125. Porównaj go z listingiem 107. W tym prostym przypadku nowy kod jest hardziej rozbudowany. Jednak już kod z listingu 126 pozwala nam odczuć zalety rozwiązania. Widzimy tutaj aplikację, która ma zliczać naciśnięcia oraz przytrzymania przycisków. Kierunek zliczania zależy od wybranego przycisku. Przy zliczaniu naciśnięć wykorzystano automatyczną rcpetycję.
7T
uint8 z delay // co 40m5 pr;
(...)
// Generowanie opóźnień if(delay 1* 0)
(
-delay;
system_delav * delay;
»
■ł+tioks;
l.isting 121 - lim kej a przeprowadzająca skanowanie wszystkich klawiszy
ISR oznacza dokładnie to samo co SIG-N AL w porzednich częściach kursu. Makro ISR powinno być stosowane w nowych programach.
Aby nasze przerwanie było wywoływane zgodnie z życzeniem, musimy dokonać jeszcze konfiguracji części peryferii. Jak to zrobić, możesz zobaczyć na lisitngu 123. Umieszczony na nim kod powinien znaleźć się zaraz za inicjacją wyświetlacza w funkcji system run.
Dodamy teraz drobne, poznane już ułatwienie, które tworzyliśmy w chwili obsługi wyświetlacza multipleksowane-go: wykorzystamy cykliczne przerwanie systemowe do generowania opóźnień. Ideę przedstawia listing 124. Trzy funkcje obsługujące opóźnienie wymagają deklaracji w pliku system, h.
Statlc inline VOid Ły3Lsi(i_kbclMakeScan(void)
kbć_ProcessKey(KED_UP, l«SWl); kbc_ProcessKe/(KBD DOWN, 1«SW2);
)
I istini» 122 - przerwanie Umera systemowego
ISR (? I MER2 COMP_ve c t)
{
Statlc uint3_L licks - 0;
// co 40ms przerwanie klawiatury if(ticks X 4 ■ 0)
system kbdMaksScan();
// Zliczanie kolejnego przerwania ++cicks:
Listing 125— zmiana w sposobie oczekiwania na wybór języka w systemie
// Oczekiwanie na przycisk for(;;)
uint8_t msg;
msq = s y s”em_msgWa11Fo r Q;
1f (msg = IDM_SW'JP)
{
largsys_Select(0); break;
}
if(msg = IDM_SWDCWN)
I
lang3yo_Sclcct(1); break;
Elektronika dla Wszystkich Sierpień2006 43