#include <LiquidCrystal_I2C.h>
// LCD module connections (change these according to your setup)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Keypad connections (change these according to your setup)
const int ROW_NUM = 4; // Four rows
const int COLUMN_NUM = 4; // Four columns
const char NO_KEY = '\0'; // Representing no key pressed
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; // connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; // connect to the column pinouts of the keypad
int randomNumber;
int guessedNumber;
bool gameFinished = false;
void setup() {
lcd.begin(16, 2);
lcd.print("Number Guessing");
lcd.setCursor(0, 1);
lcd.print("Game!");
delay(2000);
randomSeed(analogRead(0)); // Initialize random seed
// Generate a random number between 1 and 100
randomNumber = random(1, 101);
lcd.clear();
lcd.print("Guess the number:");
}
void loop() {
char key = getKeypadInput();
// If the game is finished, reset the game and generate a new random number
if (gameFinished) {
gameFinished = false;
randomNumber = random(1, 101);
lcd.clear();
lcd.print("Guess the number:");
}
if (key != NO_KEY) {
if (key == '#') {
// User pressed '#' to submit the guessed number
if (guessedNumber == randomNumber) {
lcd.clear();
lcd.print("Correct!");
gameFinished = true;
} else if (guessedNumber < randomNumber) {
lcd.setCursor(0, 1);
lcd.print("Too Low! ");
} else {
lcd.setCursor(0, 1);
lcd.print("Too High! ");
}
} else {
// User entered a digit
guessedNumber = guessedNumber * 10 + (key - '0');
lcd.setCursor(0, 1);
lcd.print(guessedNumber);
}
}
}
// Function to read input from the keypad
char getKeypadInput() {
for (byte r = 0; r < ROW_NUM; r++) {
pinMode(pin_rows[r], OUTPUT);
digitalWrite(pin_rows[r], LOW);
for (byte c = 0; c < COLUMN_NUM; c++) {
pinMode(pin_column[c], INPUT_PULLUP);
}
delay(5); // Short delay for stability
for (byte c = 0; c < COLUMN_NUM; c++) {
if (digitalRead(pin_column[c]) == LOW) {
while (digitalRead(pin_column[c]) == LOW)
; // Wait for the key to be released
digitalWrite(pin_rows[r], HIGH);
return keys[r][c];
}
}
digitalWrite(pin_rows[r], HIGH);
}
return NO_KEY; // No key pressed
}