byte previousPinStates = 0;
void print4Bits(byte b) {
for (int i = 3; i >= 0; --i) Serial.print(bitRead(b, i));
Serial.println();
}
void handleNibble(byte b) {
switch (b) {
case 0b0000:
// Do something for 0b0000
Serial.println("Case 0");
break;
case 0b0001:
// Do something for 0b0001
Serial.println("Case 1");
break;
case 0b0010:
// Do something for 0b0010
Serial.println("Case 2");
break;
case 0b0011:
// Do something for 0b0011
Serial.println("Case 3");
break;
case 0b0100:
// Do something for 0b0100
Serial.println("Case 4");
break;
case 0b0101:
// Do something for 0b0101
Serial.println("Case 5");
break;
case 0b0110:
// Do something for 0b0110
Serial.println("Case 6");
break;
case 0b0111:
// Do something for 0b0111
Serial.println("Case 7");
break;
case 0b1000:
// Do something for 0b1000
Serial.println("Case 8");
break;
case 0b1001:
// Do something for 0b1001
Serial.println("Case 9");
break;
case 0b1010:
// Do something for 0b1010
Serial.println("Case A");
break;
case 0b1011:
// Do something for 0b1011
Serial.println("Case B");
break;
case 0b1100:
// Do something for 0b1100
Serial.println("Case C");
break;
case 0b1101:
// Do something for 0b1101
Serial.println("Case D");
break;
case 0b1110:
// Do something for 0b1110
Serial.println("Case E");
break;
case 0b1111:
// Do something for 0b1111
Serial.println("Case F");
break;
default:
// Handle unexpected values
Serial.println("Unknown case");
break;
}
}
void setup() {
Serial.begin(115200);
DDRD &= B10000111; // pins D3, D4, D5, D6 as INPUT
PORTD |= B01111000; // pins D3, D4, D5, D6 HIGH <==> PULLUP
previousPinStates = ~(PIND >> 3)& 0b1111;
Serial.print("start state : "); print4Bits(previousPinStates);
}
void loop() {
byte nibble = ~(PIND >> 3) & 0b1111;
if (nibble != previousPinStates) {
Serial.print("new state : "); print4Bits(nibble);
previousPinStates = nibble;
handleNibble(nibble);
delay(20); // poor's man anti bounce
}
}