Na podstawie Mirkowych poradników i swoich przemyśleń napisałem taki programik. Jest on wycięty z owiele wiekszego wiec może być coś nie tak

Wszystko miałem w różnych plikach ale w skrócie powinno to tak chodzić.
Jest struktura która opisuje właściwości wejścia:
Typ wejścia: NO/NC
Czas krótkiego naciśnięcia:xxx[ms]
Czas długiego naciśnięcia: xxx[ms]
Podczas wywołania krótkiego naciśnięcia jest wywoływana jedna akcja, Jak naciśniesz długo to inna akcja i krótkie naciśnięcie jest pomijane.
Jezeli wejscie jest typu NO to stan aktywny jest zwarciem wejscia, jezeli wejscie jest typu NC to stanem aktywnym jest rozwarcie wejscia.
Funkcja rozpoznaje zbocza narastające i opadające

Prześledź listing a na pewno znadzjdziesz odpowiedz na swoje pytanie

Funkcje nie są za bardzo elastyczne tak jak to robi zawsze Mirek albo bardzij doswiadczeni koledzy

Ale wszystko działa
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcja opisująca akcje związane z przyciskiem:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Możesz zmodygikować funkcję i użyć callback, wówczas byś wpisywał wskaźnik do funkcji...
Na listingu akcję ze zboczem opadającym masz w mijscu, gdzie jest opis:
//ZBOCZE OPADAJACE - koniec "stanu aktywnego" wejścia NC
------------------------ [ Dodano po: 6 minutach ]Rysunki pomagające zrozumieć kod



------------------------ [ Dodano po: 15 minutach ]AndreAs napisał(a):
Zaraz , zaraz czy ja dobrze zrozumiałem , tworze funkcję zmiany stanu wejścia z dwoma argumentami jeden to stan aktualny , drugi stan jaki był przed naciśnięciem klawisza a w ciele funkcji załatwić sprawe instrukcjami warunkowymi if i else , a Tp zrealizować na Timer0 .Jeżeli się mylę to mnie popraw bardzo proszę . Dzieki z góry.
Dobrze mówisz

Poniżej przedstawiem pseudokod dla wejścia Typu NO (Normal Open).
Jeżeli przycisk jest naciśnięty i zostanie puszczony to funkcja zwróci 1, w przeciwnym wypadku będzie zwracała 0;
FunkcjaZmianyStanu()
{
Stan_aktualny= stan_chwila(T);
Stan_wczesnijszy=Stan_aktualny;
if (Stan_aktualny==0 AND Stan_wczesnijszy==1) return 1; else return 0;
}
while()
{
If( FunkcjaZmianyStanu() ) DIODA_TOG; // Jeżeli zbocze opadające zmień stan diody na przeciwny
}
------------------------ [ Dodano po: 19 minutach ]W tym pseudokodzie nie uwzględniłem drgań styków. Masz to bardzo dobrze opisane w Mirkowych poradnikach. Muszisz powprowadzać małe Timerki.
Próbkowanie wejść możesz zrobić w przerwaniach od Timera jest to lepsze rozwiązania ponieważ czasy próbkowania będą stałe niezależne od pętli głównej while i jej obiegów.