//1) Predefined Section
#include <LiquidCrystal.h>
#include <Keypad.h>
/*********** LCD ************/
#define rs 12
#define en 13
#define d4 8
#define d5 9
#define d6 10
#define d7 11
LiquidCrystal lcd{rs, en, d4, d5, d6, d7};
/*********** Keypad ************/
#define rows 4
#define cols 4
char keys[rows][cols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
char rowPins[rows] = {0, 1, 2, 3};
char colPins[cols] = {4, 5, 6, 7};
Keypad calcKeypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
// Variables to store inputs
char key;
int num1 = 0;
int num2 = 0;
char op;
bool num1Entered = false;
bool opEntered = false;
//2) Setup Section
void setup()
{
lcd.begin(16, 2);
lcd.print("A=+,B=-,*=x,D=/");
}
//3) Loop Section
void loop()
{
key = calcKeypad.getKey();
if (key)
{
lcd.setCursor(0, 1);
if (!num1Entered && isdigit(key))
{
num1 = key - '0'; // Convert ascii value of key pressed to int
lcd.print(num1);
delay(100);
num1Entered = true;
}
else if (num1Entered && !opEntered && (key == 'A' || key == 'B' || key == '*' || key == 'D'))
{
op = key;
switch (op)
{
case 'A': lcd.print("+"); break;
case 'B': lcd.print("-"); break;
case '*': lcd.print("*"); break;
case 'D': lcd.print("/"); break;
}
delay(100);
opEntered = true;
}
else if (num1Entered && opEntered && isdigit(key))
{
num2 = key - '0'; // Convert ascii value of key pressed to int
lcd.print(num2);
delay(200);
lcd.setCursor(0,0);
lcd.print("A=+,B=-,*=x,D=/");
delay(500);
lcd.setCursor(0,1);
lcd.print("=");
int result;
switch (op)
{
case 'A': result = num1 + num2; break;
case 'B': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case 'D': result = (num2 != 0) ? num1 / num2 : 0; break;//so no runtime error
default: result = 0; break;
}
lcd.print(result);
//reset
num1Entered = false;
opEntered = false;
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A=+,B=-,*=x,D=/");
}
}
}