Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define DEBOUNCE 20 // button debouncer, how many ms to debounce, 5+ ms is usually plenty
- // here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc
- //byte buttons[] = {4, 9, 12, A0}; // the analog 0-5 pins are also known as 14-19
- byte buttons[] = {2, 3,}; // the analog 0-5 pins are also known as 14-19
- // This handy macro lets us determine how big the array up above is, by checking the size
- #define NUMBUTTONS sizeof(buttons)
- // we will track if a button is just pressed, just released, or 'currently pressed'
- volatile byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];
- void setup() {
- byte i;
- // set up serial port
- Serial.begin(9600);
- Serial.print("Button checker with ");
- Serial.print(NUMBUTTONS, DEC);
- Serial.println(" buttons");
- // pin13 LED
- pinMode(13, OUTPUT);
- pinMode(5, OUTPUT);
- pinMode(6, OUTPUT);
- pinMode(7, OUTPUT);
- // Make input & enable pull-up resistors on switch pins
- for (i=0; i < NUMBUTTONS; i++)
- { pinMode(buttons[i], INPUT_PULLUP);
- digitalWrite(buttons[i], HIGH);
- }
- // Run timer2 interrupt every 15 ms
- TCCR2A = 0;
- TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;
- //Timer2 Overflow Interrupt Enable
- TIMSK2 |= 1<<TOIE2;
- }
- SIGNAL(TIMER2_OVF_vect) {
- check_switches();
- }
- void check_switches()
- {
- static byte previousstate[NUMBUTTONS];
- static byte currentstate[NUMBUTTONS];
- static long lasttime;
- byte index;
- if (millis() < lasttime){ // we wrapped around, lets just try again
- lasttime = millis();
- }
- if ((lasttime + DEBOUNCE) > millis()) {
- // not enough time has passed to debounce
- return;
- }
- // ok we have waited DEBOUNCE milliseconds, lets reset the timer
- lasttime = millis();
- for (index = 0; index < NUMBUTTONS; index++){
- currentstate[index] = digitalRead(buttons[index]); // read the button
- /*
- Serial.print(index, DEC);
- Serial.print(": cstate=");
- Serial.print(currentstate[index], DEC);
- Serial.print(", pstate=");
- Serial.print(previousstate[index], DEC);
- Serial.print(", press=");
- */
- if (currentstate[index] == previousstate[index]) {
- if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
- // just pressed
- justpressed[index] = 1;
- digitalWrite(7, LOW);
- }
- else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
- // just released
- justreleased[index] = 1;
- digitalWrite(7, HIGH);
- }
- pressed[index] = !currentstate[index]; // remember, digital HIGH means NOT pressed
- }
- //Serial.println(pressed[index], DEC);
- previousstate[index] = currentstate[index]; // keep a running tally of the buttons
- }
- }
- void loop() {
- for (byte i = 0; i < NUMBUTTONS; i++){
- if (justpressed[i]) {
- justpressed[i] = 0;
- Serial.print(i, DEC);
- Serial.println(" Just pressed");
- // remember, check_switches() will CLEAR the 'just pressed' flag
- }
- if (justreleased[i]) {
- justreleased[i] = 0;
- Serial.print(i, DEC);
- Serial.println(" Just released");
- // remember, check_switches() will CLEAR the 'just pressed' flag
- }
- if (pressed[i]) {
- Serial.print(i, DEC);
- Serial.println(" pressed");
- // is the button pressed down at this moment
- }
- }
- }
Add Comment
Please, Sign In to add comment