I need to detect if a switch has been pressed for longer than a set time, without using any Timer registers in my embedded code.
I am using software debouncing in the following manner to detect a normal switch press.
int buttonPress(void) {
static int downCount= 0; // static = value isn't lost between calls.
int currentButton = ((IO0PIN & 0x00000200) == 0x00000200);
if (currentButton ) { // button is down
if (downCount == 5) { // button has been down for 5 counts
downCount++; // increase the count so we don't trigger next time
return 1;
} else { // some count other than 5
if (downCount < 5) // increase if it's less than 5
downCount++;
}
} else { // button is up
downCount = 0;
}
return 0;
}
However, I would like to detect whether this button has been pressed for 5 seconds or longer. The problem I am facing is that I cannot seem to be able to count up to 300,000 and if this is not reached, fall back on the original downCount
of 5 to mark as a normal button press.
(Since the clock speed for my micro-controller is at 60 MHz, then it will take 5 seconds to reach 300,000.)
I have played around with some logic as follows, however in the case shown below,due to the introduction of the while
statement, I am counting up to 300,000 irrespectively of how long the button has been pressed.
if (currentButton ) { // button is down
if (downCount == 5) { // button has been down for 5 counts
downCount++; // increase the count so we don't trigger next time
while (downCount > 5) {
debounce++;
if (debounce == 300000) {
flag_5SEC = 1;
}
else if (debounce < 300000) {
debounce++;
}
}
return 1;
} else { // some count other than 5
if (downCount < 5) // increase if it's less than 5
downCount++;
}
}
Any tips or suggestions on how to go about this task?
Note: I want to detect for a longer switch press explicitly in the debouncing code above, since doing anything else may have adverse side-affects on the rest of the code, which someone else had previously wrote.