#define DELAY_TIMER_BTN B00000001 // Button on A0
#define PROG_SEL_BTN B00000010 // Button on A1
#define START_BTN B00000100 // Button on A2
unsigned long prevmillis; // for debounce period
unsigned char prevData; // previous reading of buttons
unsigned char prevTog; // toggle memory
unsigned char actSta; // buttons state
void setup() { // pullups on pins A0,A1,A2
PORTC |= B00000111; // A3, A4, A5 as output
DDRC |= B00111000; //
Serial.begin(115200); //
Serial.println(F("go ! press a button")); //
} //
void isButtonPressed() {
if (millis() - prevmillis < 2) return; // too soon to even look again (set to 20 IRL)
prevmillis = millis(); // 20ms debounce delay reached
unsigned char newData = ~PINC & B00000111; // 0 when pressed, internal pullup on pins A0, A1, A2
unsigned char prevSta = actSta; // momentary save for toggle (see prevTog below)
unsigned char actOn = newData & ~prevData; // calculate PRESSED transitioning bits
unsigned char actOff = ~newData & prevData; // calculate RELEASED transitioning bits, thanks alto777
actSta = newData & prevData; // calculate STATE of buttons
prevTog ^= ~prevSta & actSta; // calculate TOGGLE
prevData = newData; // bump along the history
if (actOn & DELAY_TIMER_BTN) Serial.println(F("DELAY just pressed"));
if (actOn & PROG_SEL_BTN) Serial.println(F("PROG just pressed"));
if (actOn & START_BTN) Serial.println(F("START just pressed"));
if (actOff /* & DELAY_TIMER_BTN*/) Serial.println(F("released"));
digitalWrite(A5, prevTog & START_BTN); // toggle START/STOP red led
digitalWrite(A4, actSta); // when any button pressed, green led ON
}
void loop() { // 1 to 16 BUTTONS, reliable debounce,
isButtonPressed(); // buttons info : state, fronts down & up, toggle,
} // multiple buttons can be pressed at a time