Muszę wykryć, czy przełącznik został naciśnięty dłużej niż przez określony czas, bez użycia jakichkolwiek rejestrów Timera w moim osadzonym kodzie.
Aby wykryć normalne naciśnięcie przełącznika, używam usuwania oprogramowania w następujący sposób.
int buttonPress (void)
{
static int downCount = 0; // static = value nie jest tracona między wywołaniami.
int currentButton = ((IO0PIN & 0x00000200) == 0x00000200);
if (currentButton) {// przycisk nie działa
if (downCount == 5) {// przycisk nie działa od 5 zliczeń
downCount ++; // zwiększ licznik, aby nie uruchomić następnym razem
powrót 1;
} else {// niektóre liczą się inne niż 5
if (downCount < 5) // zwiększ, jeśli jest mniej niż 5
downCount ++;
}
Przycisk} else {// jest włączony
downCount = 0;
}
return 0;
}
Chciałbym jednak sprawdzić, czy ten przycisk został naciśnięty przez 5 sekund lub dłużej. Problem, z którym się zmagam, polega na tym, że nie mogę policzyć do 300 000, a jeśli to nie zostanie osiągnięte, wróć do pierwotnego downCount
5, aby oznaczyć jako normalne naciśnięcie przycisku.
(Ponieważ taktowanie mojego mikrokontrolera wynosi 60 MHz, osiągnięcie 300 000 zajmie 5 sekund).
Bawiłem się następującą logiką, jednak w przypadku pokazanym poniżej, ze względu na wprowadzenie instrukcji while
, liczę do 300 000 niezależnie od tego, jak długo przycisk był wciśnięty.
if (currentButton) {// button is down
if (downCount == 5) {// przycisk nie działa od 5 zliczeń
downCount ++; // zwiększ licznik, aby nie uruchomić następnym razem
while (downCount > 5) {
if (debounce == 300000) {
flag_5SEC = 1;
} else if (usuń < 300000) {
debounce ++;
}
}
powrót 1;
} else {// niektóre liczą się inne niż 5
if (downCount < 5) // zwiększ, jeśli jest mniej niż 5
downCount ++;
}
}
Jakieś wskazówki lub sugestie, jak wykonać to zadanie?
Note: Chcę wyraźnie wykryć dłuższe naciśnięcie przełącznika w powyższym kodzie odbijającym, ponieważ robienie czegokolwiek innego może mieć niekorzystny wpływ na resztę kodu, który ktoś wcześniej napisał.
Udało mi się ukończyć powyższe zadanie przy użyciu timerów, jednak od tego czasu używam wszystkich rejestrów timera (i dopasowuję dostępne rezystory) do ważniejszych zadań w ramach tego samego projektu.
Nie muszę wykrywać dokładnego opóźnienia, po prostu jeśli przycisk był wciśnięty dłużej niż, powiedzmy, 2-3 sekundy.
Komentarz @DiBosco wyjaśnia więcej:
Więc mówisz, że jeśli naciśniesz przełącznik dla, powiedzmy, dwudziestu zliczeń i zostanie zwolniony, który działa jak normalne naciśnięcie, które wykonuje jedną funkcję, i jeśli zostanie naciśnięty i przytrzymany przez około dwie sekundyspełnia inną funkcję ...