const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {13, 12, 14, 27};
byte colPins[COLS] = {26, 25, 33, 32};
String inputString = "";
int lastButton0Time = 0;
int lastButton1Time = 0;
int lastButton2Time = 0;
int lastButton3Time = 0;
int lastButton4Time = 0;
int lastButton5Time = 0;
int lastButton6Time = 0;
int lastButton7Time = 0;
int lastButton8Time = 0;
int lastButton9Time = 0;
char getKey() {
for (byte row = 0; row < ROWS; ++row) {
digitalWrite(rowPins[row], LOW);
for (byte col = 0; col < COLS; ++col) {
if (!digitalRead(colPins[col])) {
delay(50);
while (!digitalRead(colPins[col]));
digitalWrite(rowPins[row], HIGH);
return keys[row][col];
}
}
digitalWrite(rowPins[row], HIGH);
}
return '\0';
}
void setup() {
Serial.begin(9600);
for (byte row = 0; row < ROWS; ++row) {
pinMode(rowPins[row], OUTPUT);
digitalWrite(rowPins[row], HIGH);
}
for (byte col = 0; col < COLS; ++col) {
pinMode(colPins[col], INPUT_PULLUP);
}
}
void loop() {
char key = getKey();
if (key != '\0') {
if (key == '1') {
int now = millis();
if (now - lastButton1Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'A') {
inputString.setCharAt(inputString.length() - 1, 'B');
} else if (lastChar == 'B') {
inputString.setCharAt(inputString.length() - 1, 'C');
} else if (lastChar == 'C') {
inputString.setCharAt(inputString.length() - 1, 'C');
}
}
} else {
inputString += 'A';
}
lastButton1Time = now;
} else if (key == '2') {
int now = millis();
if (now - lastButton2Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'A') {
inputString.setCharAt(inputString.length() - 1, 'B');
} else if (lastChar == 'B') {
inputString.setCharAt(inputString.length() - 1, 'C');
} else if (lastChar == 'C') {
inputString.setCharAt(inputString.length() - 1, '2');
}
}
} else {
inputString += 'A';
}
lastButton2Time = now;
} else if (key == '3') {
int now = millis();
if (now - lastButton3Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'D') {
inputString.setCharAt(inputString.length() - 1, 'E');
} else if (lastChar == 'E') {
inputString.setCharAt(inputString.length() - 1, 'F');
} else if (lastChar == 'F') {
inputString.setCharAt(inputString.length() - 1, '3');
}
}
} else {
inputString += 'D';
}
lastButton3Time = now;
} else if (key == '4') {
int now = millis();
if (now - lastButton4Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'G') {
inputString.setCharAt(inputString.length() - 1, 'H');
} else if (lastChar == 'H') {
inputString.setCharAt(inputString.length() - 1, 'I');
} else if (lastChar == 'I') {
inputString.setCharAt(inputString.length() - 1, '4');
}
}
} else {
inputString += 'G';
}
lastButton4Time = now;
} else if (key == '5') {
int now = millis();
if (now - lastButton5Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'J') {
inputString.setCharAt(inputString.length() - 1, 'K');
} else if (lastChar == 'K') {
inputString.setCharAt(inputString.length() - 1, 'L');
} else if (lastChar == 'L') {
inputString.setCharAt(inputString.length() - 1, '5');
}
}
} else {
inputString += 'J';
}
lastButton5Time = now;
} else if (key == '6') {
int now = millis();
if (now - lastButton6Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'M') {
inputString.setCharAt(inputString.length() - 1, 'N');
} else if (lastChar == 'N') {
inputString.setCharAt(inputString.length() - 1, 'O');
} else if (lastChar == 'O') {
inputString.setCharAt(inputString.length() - 1, '6');
}
}
} else {
inputString += 'M';
}
lastButton6Time = now;
} else if (key == '7') {
int now = millis();
if (now - lastButton7Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'P') {
inputString.setCharAt(inputString.length() - 1, 'Q');
} else if (lastChar == 'Q') {
inputString.setCharAt(inputString.length() - 1, 'R');
} else if (lastChar == 'R') {
inputString.setCharAt(inputString.length() - 1, 'S');
} else if (lastChar == 'S') {
inputString.setCharAt(inputString.length() - 1, '7');
}
}
} else {
inputString += 'P';
}
lastButton7Time = now;
} else if (key == '8') {
int now = millis();
if (now - lastButton8Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'T') {
inputString.setCharAt(inputString.length() - 1, 'U');
} else if (lastChar == 'U') {
inputString.setCharAt(inputString.length() - 1, 'V');
} else if (lastChar == 'V') {
inputString.setCharAt(inputString.length() - 1, '8');
}
}
} else {
inputString += 'T';
}
lastButton8Time = now;
} else if (key == '9') {
int now = millis();
if (now - lastButton9Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == 'W') {
inputString.setCharAt(inputString.length() - 1, 'X');
} else if (lastChar == 'X') {
inputString.setCharAt(inputString.length() - 1, 'Y');
} else if (lastChar == 'Y') {
inputString.setCharAt(inputString.length() - 1, 'Z');
} else if (lastChar == 'Z') {
inputString.setCharAt(inputString.length() - 1, '9');
}
}
} else {
inputString += 'W';
}
lastButton9Time = now;
} else if (key == '0') {
int now = millis();
if (now - lastButton0Time < 500) {
if (inputString.length() > 0) {
char lastChar = inputString.charAt(inputString.length() - 1);
if (lastChar == ' ') {
inputString.setCharAt(inputString.length() - 1, '0');
}
}
} else {
inputString += ' ';
}
lastButton0Time = now;
} else {
inputString += key;
}
Serial.println(inputString);
}
}