#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
uint8_t colPins[COLS] = { 5, 4, 3, 2 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pins connected to R1, R2, R3, R4
char keys[ROWS][COLS] = {
{ '1', '2', '3', '+' },
{ '4', '5', '6', '-' },
{ '7', '8', '9', '*' },
{ '=', '0', 'C', '/' }
};
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String n1 = "", n2 = "";
char o = ' ';
void setup() {
lcd.init();
Serial.begin(9600);
lcd.backlight();
}
double cal(double num1, char ope, double num2) {
switch (ope) {
case '+':
return num1 + num2;
break;
case '-':
return num1 - num2;
break;
case '*':
return num1 * num2;
break;
case '/':
return num1 / num2;
break;
}
}
void updateDisplay() {
lcd.setCursor(1, 0);
lcd.print(n1);
if (o != ' ') {
lcd.setCursor(0, 1);
lcd.print(String(o));
}
lcd.setCursor(1, 1);
lcd.print(n2);
}
void loop() {
char key = keypad.getKey();
switch (key) {
case '+':
case '-':
case '*':
case '/':
o = key;
break;
case 'C':
n1 = "";
n2 = "";
o = ' ';
break;
case '=':
lcd.clear();
n1 = cal(n1.toDouble(), o, n2.toDouble());
n2 = "";
o = ' ';
break;
default:
if (o == ' ') n1 += String(key);
else n2 += String(key);
}
updateDisplay();
}