Trzeba zacząć od tego że ustawione przez Ciebie przerwanie co 16ms jest niepraktyczne. Wygodniej liczyłoby się 5ms i przydałby sie do enkodera, albo nawet 10ms w ostateczności do przycisków.
Przypuśćmy, że ustawiasz przerwanie na 5ms. W nim ustawiasz tylko flagę i wracasz. W pętli głównej widząc ustawioną flage możesz sobie spokojnie dodawać po 5ms i mieć później inne czasy.
Teraz jednak widzisz flagę więc każesz mu sprawdzić przycisk. Dla przycisku przyda się pomocniczy, ale tylko dla niego, bajt który będzie liczył czas wciśnięcia.
Jeśli przycisk jest wciśnięty każesz mu zwiększyć wartość tego Bajtu o jeden.
Kiedy znów mija 5ms o czym informuje Cie flaga znów sprawdzasz przycisk.
Jeśli wcisniety to każesz mu zwiększyć wartość znanego nam bajtu
Teraz może przyjść do głowy "co będzie jak będę trzymał za długo". Można to rozwiązać na wiele sposobów. Jednym może być podjęcie decyzji, ze skoro tak długo trzymany jest przycisk to jest to długie wciśniecie i warto już wyzerowac bajt i coś zrobić
Kiedy jednak sprawdzamy przycisk i jest on juz puszczony kiedy go odwiedzamy to sprawdzamy ile ma ten zwiększany zawsze bajt. Jeśli ma mniej niż 5 to by oznaczało że naciśniecie było jakies niepewne bo 5x5ms ..no niby 25ms
Takie bym odrzucił jako drganie styków ponieważ zawsze przy puszczonym przycisku zerujemy też ten bajt. Drgania więc będa na przemian zwiększały o maksimum kilka i od razu kasowały bajt.
Kiedy jednak licznik ma na przykład 10 i przycisk jest puszczony to uznaję to za krótkie przyciśnięcie..
Piszę tak z głowy i o wielu rzeczach mogłem zapomnieć.
Zaloguj się, aby zobaczyć kod
Coś w ten deseń
W zależności co potrzebne można to napisać z góry na dół inaczej, ale ten przykład miał pokazać o co chodzi. Z czasami możesz poeksperumentować. Może nawet te 16ms się nada. Spróbuj krótkim naciśnieciem wlączyć jakaś diode a długim wyłaczyć.