SUGESTIA
cieszę się, że jak napisałeś działa ci to gdy używasz 2 przycisków .... OK
a teraz chcesz jeden przycisk do załączania wyłączania tego samego urządzenia, diody LED itp
masz więc dwa rozwiązania, ale zanim je podam to polecam ci przypomnieć sobie jak działa nadawanie z pilota. Gdy nasz ludzki paluch wciśnie klawisz nawet na krótko, to i tak nasz paluch jest powolny i w międzyczasie pilot wypuści serię ramek podczerwieni oddzielonych odstępami zwanymi GAP. Tak więc do odbiornika niech w najgorszym przypadku dolecą dwie ramki - to już sam rozumiesz co się stanie, gdy napiszesz coś takiego
Kod:
if( 5==command ) PORTA ^= (1<<PA0);
załóżmy że po kliknięciu klawisza nr.5 chcemy zmienić stan diody LED na przeciwny, a dioda podłączona do PORTA PA0
pierwsza ramka zmieni stan czyli dioda zgaśnie ale ta druga znowu zmieni i dioda się zapali
.... jak niechcący nadlecą 3 ramki to uda ci się ją zmienić prawidłowo ale jak 4 ramki to znowu źle - więc trzeba byłoby wciąż myśleć i starać się SZYBKO klikać klawisz - co nieraz przy niektórych pilotach i grubych gumach jest ciężke do realizacji
więc:
1. musisz albo sam wprowadzać dla każdego takiego IF'a dodać tzw własną maszynę stanów i zapamiętywać ostatnią operację żeby zareagować zawsze TYLKO na pierwszą ramkę która nadleci
2. postarać się jednak o drugą książkę:
http://atnel.pl/jezyk-c-pasja-programowania.htmli poczytać w niej 1-szy rozdział , który dopiero opisuje POCZERWIEŃ od A do Z...
a prezentowane tam biblioteki są już nie DYDAKTYCZNE jak w pierwszej książce ale pełne niesamowicie potrzebnych gadżetów. Więc pomyśl sobie - taka biblioteka do obsługi RC5 i nie tylko RC5 przekazuje tobie poza command i address jeszcze taki tajemniczy parametr jak key_time. Wiesz co to jest ? To jest piękny licznik nadlatujących ramek OnLine, więc rozwiązanie twojego kłopotu jest OD RĘKI bez konieczności tworzenia oddzielnych maszyn stanu jak w punkcie wyżej, z tymi bibliotekami twój IF() mógłby wyglądać teraz tak:
Kod:
if( 5==command && !key_time ) PORTA ^= (1<<PA0);
widzisz to? sprawdzamy pięknie teraz nie tylko czy wciśnięty klawisz nr 5 ale też czy to właśnie ramka nr. ZERO
.... więc nie ma to szans już zareagować na 2-gą, 3-cią , 4-tą irt
co więcej - jakbyś chciał np aby jakaś opcja została załączona po dłuższym czasie np 3 sekund (tzn klawisz na pilocie trzeba przytrzymać 3 sekundy żeby coś przełączyć to napiszesz:
Kod:
if( 5==command && 12==key_time ) PORTA ^= (1<<PA0);
czyli gdy klawisz 5 i ramka nr. 12 ... bo np 12 ramek nadleci w czasie 3 sekund
rozumiesz ? I teraz dla każdego klawisza oddzielnie możesz wykorzystywać wciąż tę samą zmienną key_time jak chcesz i jak ci się żywnie podoba.
Takich bibliotek to ja już używam w swoich komercyjnych projektach - są przepięknie dopracowane a jeszcze opisane od podstaw jak je budować - modyfikować itp itd
dlatego szczerze polecam drugą książkę i podczerwień w niej opisaną (mój temat konik) .... no ale jeszcze wiele innych ciekawych rzeczy jest.