Skip to content

Instantly share code, notes, and snippets.

@TIny-Hacker
Last active May 6, 2024 00:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TIny-Hacker/b94e819852312e4a1c28b48647eaa80a to your computer and use it in GitHub Desktop.
Save TIny-Hacker/b94e819852312e4a1c28b48647eaa80a to your computer and use it in GitHub Desktop.
Key debouncing with timer
#include <keypadc.h>
#include <time.h>
int main(void) {
// Ensure no key is pressed when the program is first opened
while(kb_AnyKey());
bool keyPressed = false;
// Keep track of an offset for timer stuff
clock_t clockOffset = clock();
// Key detection loop
while(!kb_IsDown(kb_KeyClear)) {
// If no key is pressed, reset timer and variable for keeping track of if a key is held down.
if (!kb_AnyKey() && keyPressed) {
keyPressed = false;
clockOffset = clock();
}
// If no key is being held, allow an input
// If a key is being held, introduce a small delay between inputs. In this example the delay is
// CLOCKS_PER_SEC / 32, but it can be changed to what feels most natural.
if (kb_AnyKey() && (!keyPressed || clock() - clockOffset > CLOCKS_PER_SEC / 32)) {
// Reset clockOffset for accurate debounce time.
clockOffset = clock();
// Do whatever you want with key inputs here
// If this is the first instance of an input after a release (the key has not already been held
// down for some time), wait for a longer delay to ensure the user wants to continue holding down
// the key and creating more inputs. In this example the delay is CLOCKS_PER_SEC / 4, but it can
// be changed to what feels most natural.
if (!keyPressed) {
while (clock() - clockOffset < CLOCKS_PER_SEC / 4 && kb_AnyKey()) {
kb_Scan();
}
}
// Now we know that the user is holding down a key (If not, we'll reset keyPressed back to false
// at the beginning of the loop.
keyPressed = true;
}
}
return 0;
}
@mateoconlechuga
Copy link

should really be using CLOCKS_PER_SECOND rather than magic numbers

@TIny-Hacker
Copy link
Author

Thanks, should be better now :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment