Strona 1 z 1
Przycisk rozróżniający długie i krótkie wciśnięcie
: 18 mar 2017, 23:29
autor: niveasoft
Kod chyba komentuje się sam. Może w osobnym wątku napiszę o konfiguracji Timerów.
' 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
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 21 lis 2023, 12:19
autor: marekszy
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
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 21 lis 2023, 13:17
autor: niveasoft
If Flaga = 0 Then Flaga = 1 Else Flaga = 0 'ON/OFF
LED = Flaga
To najprostszy zapis który się rozwija do tego..
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
I w tym rozwiniętym pewnie mozesz sobie więcej rzeczy robić.
Czyli ten kod z pierwszego postu przerabiasz tak że musisz dodac End If
If Sw_cnt > 3 Then Toggle Led_1
Zamieniasz na
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
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 22 lis 2023, 10:23
autor: marekszy
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ą
'*****************************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*****************
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 23 lis 2023, 11:09
autor: marekszy
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ł ?
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 23 lis 2023, 13:44
autor: niveasoft
Nie wiem co tam może byc za problem, ale napisz jakie dokładnie piny. Są na tym samym porcie?
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 23 lis 2023, 21:52
autor: marekszy
PIND.0 , PIND.1 , PIND.2
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 24 lis 2023, 4:29
autor: niveasoft
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...
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
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 24 lis 2023, 12:02
autor: marekszy
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
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
Re: Przycisk rozróżniający długie i krótkie wciśnięcie
: 24 lis 2023, 17:29
autor: marekszy
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
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