/*
6x8 keypad with 74HC595 shift register
AnonEngineering 5/26/25
From a question by biillyb
Arduino | general — 4:05 PM 5/24/25
Diodes should be added to prevent ghosting.
See https://www.gammon.com.au/forum/?id=14175
*/
const int COLS = 6;
const int ROWS = 8;
const int COL_PINS[] = {9, 8, 7, 6, 5, 4};
const int DATA_PIN = 10;
const int LATCH_PIN = 11;
const int CLOCK_PIN = 12;
int btnState[COLS * ROWS];
int oldBtnState[COLS * ROWS];
int getBtnNumber() {
int btnNumber = 0;
for (int row = 0; row < ROWS; row++) {
scanRow(row);
for (int col = 0; col < COLS; col++) {
int btnIdx = (col + (row * COLS));
btnState[btnIdx] = digitalRead(COL_PINS[col]);
if (btnState[btnIdx] != oldBtnState[btnIdx]) {
oldBtnState[btnIdx] = btnState[btnIdx];
if (btnState[btnIdx] == HIGH) {
btnNumber = (btnIdx) + 1;
//Serial.print("Row: ");
//Serial.print(row);
//Serial.print("\tCol: ");
//Serial.print(col);
//Serial.print("\tButton: ");
//Serial.println(btnNumber);
}
delay(20); // debounce
}
}
}
return btnNumber;
}
void scanRow(int rowNum) {
int data = 0;
data = 1 << rowNum;
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, data);
digitalWrite(LATCH_PIN, HIGH);
}
void setup() {
Serial.begin(115200);
for (int i = 0; i < COLS; i++) {
pinMode(COL_PINS[i], INPUT);
}
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
}
void loop() {
int btnNumber = getBtnNumber();
if (btnNumber) {
Serial.print("Button: ");
Serial.println(btnNumber);
}
}