- ' KOD PRZY KRÓTKIM NACIŚNIĘCIU ZMIENIA STAN LED_1, A PRZY DŁUGIM LED_2.
- $regfile = "m16def.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 16
- $framesize = 128
- Config Submode = New
- Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
- Config Lcd = 16x2
- Cursor Off , Noblink
- Cls
- Config Porta.6 = Output : Led_1 Alias Porta.6
- Config Porta.7 = Output : Led_2 Alias Porta.7
- Config Porta.0 = Input : Set Porta.0 : Switch Alias Pina.0
- Dim Sw_cnt As Byte , Lock As Byte
- Config Timer2 = Timer , Prescale = 1024 , Compare = Disconnect , Clear_timer = 1
- COMPARE2 = 77 '10ms @8MHz/1024
- Lcd "Test..."
- Do
- If TIFR.OCF2 = 1 Then 'minęło 10ms, flagę ustawia Timer
- TIFR.OCF2 = 1 'flagi kasuje się wpisując jeden, nie zero
- If Switch = 0 Then 'jeśli wciśnięto przycisk
- If Lock = 0 Then 'a jeszcze nie ma blokady
- If Sw_cnt < 50 Then 'tu jesteśmy co 10ms i jeśli jeszcze nie osiągneliśmy granicy
- Incr Sw_cnt 'to dodajemy do licznika Sw_cnt
- Else 'jeśli granica osiągnięta
- Lock = 1 'zablokuj dodawanie aż do puszczenia przycisku
- Toggle Led_2 '->zmień stan drugiej diody
- End If
- End If
- Else 'kiedy zwalniamy przycisk
- If Lock = 0 Then 'a nie było to długie wciśnięcie
- If Sw_cnt > 3 Then Toggle Led_1 'sprawdź czy to nie drganie styków 3x10ms = 30ms
- End If '->zmień stan pierwszej diody
- Lock = 0 : Sw_cnt = 0 'wyłącz blokadę i zeruj licznik
- End If
- End If
- Loop
- End
Przycisk rozróżniający długie i krótkie wciśnięcie
- niveasoft
- Posty: 1253
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Przycisk rozróżniający długie i krótkie wciśnięcie
Kod chyba komentuje się sam. Może w osobnym wątku napiszę o konfiguracji Timerów.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
-
- Posty: 112
- Rejestracja: 20 lis 2016, 20:21
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
Witam
Przyciski długi / krótki działają fajnie , ale jak dopisać aby jedno długie naciśnięcie załączyło led a drugi raz wyłączyło led.
W tej chwili toogle to załatwia (zmiana stanu na przeciwny), a potrzebuje aby wykonać jeszcze inne procedury.
Dałem else ale wyrzuca mi błąd
Przyciski długi / krótki działają fajnie , ale jak dopisać aby jedno długie naciśnięcie załączyło led a drugi raz wyłączyło led.
W tej chwili toogle to załatwia (zmiana stanu na przeciwny), a potrzebuje aby wykonać jeszcze inne procedury.
Dałem else ale wyrzuca mi błąd
- niveasoft
- Posty: 1253
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- If Flaga = 0 Then Flaga = 1 Else Flaga = 0 'ON/OFF
- LED = Flaga
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- If Flaga = 0 Then
- Flaga = 1
- 'tu można Set LED, ale można lepiej
- Else
- Flaga = 0
- 'tu można Reset LED, ale można lepiej
- End If
- LED = Flaga 'tak jest oszczędniej
Czyli ten kod z pierwszego postu przerabiasz tak że musisz dodac End If
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- If Sw_cnt > 3 Then Toggle Led_1
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- If Sw_cnt > 3 Then
- If Flaga = 0 Then
- Flaga = 1
- 'tu można Set LED, ale można lepiej
- Else
- Flaga = 0
- 'tu można Reset LED, ale można lepiej
- End If
- LED = Flaga 'tak jest oszczędniej
- End If ' <<< dodane
-
- Posty: 112
- Rejestracja: 20 lis 2016, 20:21
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
Dzięki
działa tak jak chciałem, w sumie będą jeszcze 2 takie przyciski sw_ motor i sw_zegar ale to już raczej nie będzie problemu ,
pozmieniałem czasy dla przycisków bo wcisnąłem to do przerwania 4ms
zerknij czy to tak w miarę zgodnie ze sztuką
działa tak jak chciałem, w sumie będą jeszcze 2 takie przyciski sw_ motor i sw_zegar ale to już raczej nie będzie problemu ,
pozmieniałem czasy dla przycisków bo wcisnąłem to do przerwania 4ms
zerknij czy to tak w miarę zgodnie ze sztuką

Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '*****************************petla glowna************************************
- Do
- If Flaga_4ms = 1 Then 'co 4ms
- Flaga_4ms = 0
- if poz_menu_temp = 0 then Wysw = T
- if poz_menu_temp = 1 then wysw = Tu
- if flaga_temp = 1 then
- poz_menu_temp = 1
- set led_temp
- end if
- If flaga_temp = 0 then
- poz_menu_temp = 0
- reset led_temp
- end if
- If sw_temp = 0 Then
- If Lock = 0 Then
- If Sw_cnt < 200 Then
- Incr Sw_cnt
- Else
- Lock = 1
- If flaga_temp = 0 then
- Flaga_temp = 1
- else
- Flaga_temp = 0
- end if
- End If
- End If
- Else
- If Lock = 0 Then
- If Sw_cnt > 10 Then
- Toggle Led_zegar
- End If ' to tylko do testu krotkiego wcisniecia
- end if
- Lock = 0 : Sw_cnt = 0
- End If
- gosub wyswietlanie
- end If
- If Flaga_100ms = 1 Then
- Flaga_100ms = 0
- end if
- If Flaga_1s = 1 Then
- Flaga_1s = 0
- gosub temperatura
- end If
- Loop
- End
- '***************petla glowna koniec*****************
-
- Posty: 112
- Rejestracja: 20 lis 2016, 20:21
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
Jednak jest problem z dołożeniem kolejnych 2 przycisków sw_motor i sw_zegar o tych samych funkcjach co sw_temp , masz może jakiś pomysł ?
- niveasoft
- Posty: 1253
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
Nie wiem co tam może byc za problem, ale napisz jakie dokładnie piny. Są na tym samym porcie?
-
- Posty: 112
- Rejestracja: 20 lis 2016, 20:21
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
PIND.0 , PIND.1 , PIND.2
- niveasoft
- Posty: 1253
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
Proste jak swiński ogon. Sprawdza się cały port maskując nieużywane piny.
W ten sposób można sobie nawet sprawdzać wciśnięcie dwóch lub trzech przycisków na raz.
Zamiast sw_temp, sw_zegar i sw_motor dodajesz dwie zmienne typu byte Switches i Sw_mem.
Switches służy do odczytu całego portu a Sw_mem pamięta co było wciśniete jak już zwolnisz przycisk czyli przy krótkim naciśnięciu.
Te trzy przyciski rozróżniasz potem w Select Case.
Nie namawiam, ale ja to u siebie trzymam w osobnym SUB Przyciski bo jak kod ma potem kilkanaście tysiecy linii kodu to łatwiej jest sie poruszać po subach. Może w Mega8 sie takie zwykłe liniowe rozwiązanie jeszcze obroni...
W ten sposób można sobie nawet sprawdzać wciśnięcie dwóch lub trzech przycisków na raz.
Zamiast sw_temp, sw_zegar i sw_motor dodajesz dwie zmienne typu byte Switches i Sw_mem.
Switches służy do odczytu całego portu a Sw_mem pamięta co było wciśniete jak już zwolnisz przycisk czyli przy krótkim naciśnięciu.
Te trzy przyciski rozróżniasz potem w Select Case.
Nie namawiam, ale ja to u siebie trzymam w osobnym SUB Przyciski bo jak kod ma potem kilkanaście tysiecy linii kodu to łatwiej jest sie poruszać po subach. Może w Mega8 sie takie zwykłe liniowe rozwiązanie jeszcze obroni...
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim Switches As Byte , Sw_mem As Byte
- Const Sw_mask = &B0000_0111 'PIND.0-PIND.2
- Switches = Pind And Sw_mask 'sprawdz trzy przyciski na raz
- If Switches <> Sw_mask Then 'jesli ktorykolwiek wcisniety
- Sw_mem = Switches 'zapamietaj dla opcji zwolnienia przycisku
- If Lock = 0 Then
- If Sw_cnt < 200 Then
- Incr Sw_cnt
- Else
- Lock = 1
- Select Case Sw_mem
- Case &B0000_0110 'PIND.0
- 'sw_temp
- Case &B0000_0101 'PIND,1
- 'sw_zegar
- Case &B0000_0011 'PIND.2
- 'sw_motor
- End Select
- End If
- End If
- Else
- If Lock = 0 Then
- If Sw_cnt > 10 Then
- Select Case Sw_mem
- Case &B0000_0110 'PIND.0
- Toggle Led_zegar
- 'sw_temp
- Case &B0000_0101 'PIND,1
- Toggle Led_zegar
- 'sw_zegar
- Case &B0000_0011 'PIND.2
- Toggle Led_zegar
- 'sw_motor
- End Select
- End If
- End If
- Lock = 0 : Sw_cnt = 0
- End If
-
- Posty: 112
- Rejestracja: 20 lis 2016, 20:21
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
działa z trzema przyciskami ale powiedz jak teraz wystawić flagi - Flaga_temp dla sw_temp /Flaga_zegar dla sw_zegar / Flaga_motor dla sw_motor
tak ,żeby można pozbyć się toggle tak jak to miałem wcześniej
tak ,żeby można pozbyć się toggle tak jak to miałem wcześniej
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- if flaga_temp = 1 then
- poz_menu_temp = 1
- set led_temp
- end if
- If flaga_temp = 0 then
- poz_menu_temp = 0
- reset led_temp
- end if
- If sw_temp = 0 Then
- If Lock = 0 Then
- If Sw_cnt < 200 Then
- Incr Sw_cnt
- Else
- Lock = 1
- If flaga_temp = 0 then
- Flaga_temp = 1
- else
- Flaga_temp = 0
- end if
- End If
- End If
- Else
- If Lock = 0 Then
- If Sw_cnt > 10 Then
- Toggle Led_zegar
- End If ' to tylko do testu krotkiego wcisniecia
- end if
- Lock = 0 : Sw_cnt = 0
- End If
-
- Posty: 112
- Rejestracja: 20 lis 2016, 20:21
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
tak to zrobiłem i działa , może nie jest to pięknie ale..., potrzebuję jeszcze dodać blokowanie przycisków aby po wybraniu jednego kolejny zadziałał dopiero po wyjściu z pierwszego
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Do
- If Flaga_4ms = 1 Then 'co 4ms
- Flaga_4ms = 0
- if poz_menu_temp = 0 then Wysw = T
- if poz_menu_temp = 1 then wysw = Tu
- if poz_menu_motor = 1 then wysw = motor
- if poz_menu_zegar = 1 then wysw = zegar
- Const Sw_mask = &B00011100 'PIND.0-PIND.2
- Switches = Pind And Sw_mask 'sprawdz cztery przyciski na raz
- If Switches <> Sw_mask Then 'jesli ktorykolwiek wcisniety
- Sw_mem = Switches 'zapamietaj dla opcji zwolnienia przycisku
- If Lock = 0 Then
- If Sw_cnt < 200 Then
- Incr Sw_cnt
- Else
- Lock = 1
- Select Case Sw_mem
- Case &B00010100 'PIND.3 sw_temp
- If flaga_temp = 0 then
- Flaga_temp = 1
- Flaga_zegar =0
- Flaga_motor = 0
- else
- Flaga_temp = 0
- Flaga_zegar =0
- Flaga_motor = 0
- end if
- if flaga_temp = 1 then
- poz_menu_temp = 1
- 'wysw = tu
- migaj_t = 1
- end if
- If flaga_temp = 0 then
- poz_menu_temp = 0
- migaj_t = 0
- end if
- Case &B00011000 'PIND,2 sw_zegar
- If flaga_zegar = 0 then
- Flaga_zegar = 1
- Flaga_motor =0
- Flaga_temp = 0
- else
- Flaga_temp = 0
- Flaga_zegar =0
- Flaga_motor = 0
- end if
- if flaga_zegar = 1 then
- poz_menu_zegar = 1
- 'wysw = zegar
- migaj_z = 1
- end if
- If flaga_zegar = 0 then
- poz_menu_zegar = 0
- poz_menu_temp = 0
- migaj_z = 0
- end if
- Case &B00001100 'PIND.4 sw_motor
- If flaga_motor = 0 then
- Flaga_motor = 1
- Flaga_zegar =0
- Flaga_temp = 0
- else
- Flaga_temp = 0
- Flaga_zegar =0
- Flaga_motor = 0
- end if
- if flaga_motor = 1 then
- poz_menu_motor = 1
- migaj_m = 1
- end if
- If flaga_motor = 0 then
- poz_menu_motor = 0
- poz_menu_temp = 0
- migaj_m = 0
- end if
- End Select
- End If
- End If
- Else
- If Lock = 0 Then
- If Sw_cnt > 10 Then
- Select Case Sw_mem
- Case &B00010100 'PIND.3 sw_temp
- Toggle Led_temp
- Case &B00011000 'PIND,2 sw_zegar
- Toggle Led_zegar
- 'sw_zegar
- Case &B00001100 'PIND.4 sw_motor
- Toggle Led_motor
- 'sw_motor
- End Select
- End If
- End If
- Lock = 0 : Sw_cnt = 0
- End If
- Gosub Miganie_t
- Gosub Miganie_m
- Gosub Miganie_z
- gosub wyswietlanie
- end If