
Potrzebna jest tylko zmiana podejścia do tematu. Taka zmiana myślenia.
Widziałem już kody gdzie by dodać sterowanie pilotem powtarzano kod sterujący poszczególnymi funkcjami.
Jest to niepotrzebne.
Programy obsługi lepiej jest pisać tak by reagowały na wartość jakichś zmiennych, a nie konkretne sprzętowe zdarzenie.
Poniższy program reaguje na zmiany wartości zmiennej Control.
Na samym końcu pętli zmienna ta ma wartość zero. Kiedy pętla zaczyna swój kolejny bieg poszczególne Suby sprawdzają czy ktoś nie wcisnął przycisku, czy ktoś nie pokręcił enkoderem lub ktoś nie wcisnął przycisku pilota.
Jeśli coś takiego ma miejsce to zmiennej Control przypisują odpowiednią wartość.
Dla przykładu naciśnięcie przycisku plus na urządzeniu, naciśnięcie "plus volume" na pilocie lub pokrecenie enkoderem w prawo będzie skutkowało tym samym. W zmiennej Control zapisana zostanie wartość Plus_sig (Plus_signal) wczesniej zdefiniowany jako Alias dla wartosci 3
Stworzenie Aliasów nic nie kosztuje. Jest to tylko dla nas. Kod łatwiej czytać, trudniej o pomyłkę a kompilator patrzy na to jak na "3"

Później w programie, by nie rozpatrywać wszystkich przypadków niepotrzebnie, sprawdzamy czy w ogóle cokolwiek wciśnięto. Jeśli tak to reagujemy na konkretną wartość zmiennej
Pisząc tak jakieś Menu łatwo możesz potem je przenieść, lub dodać, na przykład sterowanie poprzez Bluetooth
Wystarczy by Sub obsługujący BT wpisał wartośći do zmiennej Control

Code: [Zaznacz cały] [Rozwiń/Zwiń]
- ' PROGRAM POZWALA NA KONTROLĘ URZĄDZENIA
- ' POPRZEZ ENKODER, PRZYCISKI I PILOTA
- $regfile = "m328pdef.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 16
- $framesize = 64
- Config Submode = New
- '************ NA POTRZEBY PILOTA RC5 *****************
- Config Rc5 = Pind.2
- Config Pind.2 = Input : Set Portd.2
- Config Int0 = Falling : Enable Int0 : On Int0 Remote_int
- Dim Get_remote As Byte , Address As Byte , Command As Byte
- '************ ZMIENNE ENKODERA *****************
- Dim Turn As Byte
- Links Alias 1 : Rechts Alias 2
- Enc_sw Alias Pind.3 'jakiś przycisk enkodera
- '************ PRZYCISKI URZĄDZENIA *****************
- Dim Przyciski As Byte
- Plus_sw Alias Pind.4
- Minus_sw Alias Pind.5
- Okay_sw Alias Pind.6
- '************ ZMIENNE DO KONTROLI *****************
- Dim Control As Byte
- Short_push Alias 1
- Long_push Alias 2
- Plus_sig Alias 3
- Minus_sig Alias 4
- '******************************************************
- Sub Sprawdz_przyciski()
- Select Case Przyciski
- Case 1 : Control = Long_push 'długie naciśnięcie
- Case 2 : Control = Short_push 'krókie naciśnięcie
- Case 3 : Control = Plus_sig 'przycisk zwiększający wartości
- Case 4 : Control = Minus_sig 'przycisk zmniejszający wartości
- End Select
- End Sub
- Sub Sprawdz_enkoder()
- Select Case Turn
- Case Links : Control = Minus_sig 'pokręcenie w lewo
- Case Rechts : Control = Plus_sig 'pokręcenie w prawo
- End Select
- End Sub
- Sub Odbierz_rc5()
- Getrc5(address , Command)
- Command = Command And &B01111111
- Select Case Command
- Case 12 : Control = Long_push 'przycisk ON/OFF
- Case 16 : Control = Minus_sig '-Volume
- Case 17 : Control = Plus_sig '+Volume
- Case 50 : Control = Short_push 'przycisk OK/MENU
- End Select
- Get_remote = 0
- Enable Int0
- End Sub
- '####################################################
- Enable Interrupts
- Do
- 'teraz w swoim programie po kolei sprawdzasz
- 'czy nie naciśnięto przycisku, pokrecono enkoderem,
- 'albo może odebrano coś z pilota ;)
- Call Sprawdz_przyciski()
- Call Sprawdz_enkoder()
- If Get_remote = 1 Then Call Odbierz_rc5()
- 'sprawdzamy czy nadszedł jakiś sygnał
- If Control <> 0 Then
- 'tutaj może reagować na WARTOŚĆ ZMIENNEJ "CONTROL"
- '---------------------------------------
- Select Case Control
- Case Long_push
- 'długie wciśnięcie przycisku enkodera bądź Okay lub przycisk ON/OFF pilota
- Case Short_push
- 'krótkie wciśnięcie przycisku enkodera bądz Okay lub przycisk OK/MENU pilota
- Case Plus_sig
- 'przycisk zwiększający wartości, przycisk +Volume pilota lub enkoder w prawo
- Case Minus_sig
- 'przycisk zmniejszający wartość, przycisk -Volume pilota lub enkder w lewo
- End Select
- '---------------------------------------
- End If
- Control = 0 'zerujemy zmienną
- Loop
- Remote_int:
- Disable Int0
- Get_remote = 1
- Return
Pin odbiornika podłączony jest do pinu INT0.
W ten sposób nie sprawdzamy w kółko czy pilot coś nadaje bo to zamula program.
Kiedy pilot coś nada. W przerwaniu ustawiam tylko flagę i wyłączam przerwanie bo pilot będzie kilkakrotnie zmieniał stan pinu.
Kiedy kod zostanie odebrany to obsługa tego przerwania zostanie ponownie włączona.
Procedurę trochę okroiłem, ale nie wszystko na raz
