/*
The main algorithm of the following program was written by irenx's site and I made changes to it.
irenx's website address: https://irenx.ir/arduino/calculator-arduino-keypad/
Many thanks for the good site irenx.
*/
#include <LiquidCrystal.h> //Header file for LCD from https://www.arduino.cc/en/Reference/LiquidCrystal
#include <Keypad.h> //Header file for Keypad from https://github.com/Chris--A/Keypad
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns
// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = { 0, 1, 2, 3 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 4, 5, 6, 7 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Create the Keypad
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; //Pins to which LCD is connected
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
long Num1,Num2,Number;
char key,action;
boolean result = false;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); //We are using a 16*2 LCD display
lcd.setCursor(3,0);
lcd.print("Calculator");
lcd.setCursor(3,1);
lcd.print("negin_b2001"); //Display a intro message
delay(2000); //Wait for display to show info
lcd.clear(); //Then clean it
}
void loop() {
key = kpd.getKey(); //storing pressed key value in a char
if (key!=NO_KEY)
DetectButtons();
if (result==true)
CalculateResult();
//DisplayResult();
}
void DetectButtons()
{
lcd.clear(); //Then clean it
if (key=='*'){ //If cancel Button is pressed
Serial.println ("Button Cancel"); Number=Num1=Num2=0; result=false;action=' ';}
//.........Key 1.........
if (key == '1'){ //If Button 1 is pressed
Serial.println ("Button 1");
if (Number==0){
Number=1;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 1; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 4.........
if (key == '4'){ //If Button 4 is pressed
Serial.println ("Button 4");
if (Number==0){
Number=4;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 4; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 7.........
if (key == '7'){ //If Button 7 is pressed
Serial.println ("Button 7");
if (Number==0){
Number=7;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else {
Number = (Number*10) + 7; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 0.........
if (key == '0'){
Serial.println ("Button 0"); //Button 0 is Pressed
if (Number==0){
Number=0;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 0; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 2.........
if (key == '2'){ //Button 2 is Pressed
Serial.println ("Button 2");
if (Number==0){
Number=2;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 2; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 5.........
if (key == '5'){
Serial.println ("Button 5");
if (Number==0){
Number=5;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 5; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 8.........
if (key == '8'){
Serial.println ("Button 8");
if (Number==0){
Number=8;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 8; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key #.........
if (key == '#'){
Serial.println ("Button Equal");
Num2=Number;
result = true;}
//.........Key 3.........
if (key == '3'){
Serial.println ("Button 3");
if (Number==0){
Number=3;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 3; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 6.........
if (key == '6'){
Serial.println ("Button 6");
if (Number==0){
Number=6;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 6; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key 9.........
if (key == '9'){
Serial.println ("Button 9");
if (Number==0){
Number=9;
if(Num1==0){
lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}
else{
Number = (Number*10) + 9; //Pressed twice
if(Num1==0){
lcd.print("");lcd.print(action);lcd.print(Number);}
else{
lcd.print(Num1);lcd.print(action);lcd.print(Number);}}}
//.........Key A || B || C || D.........
if (key == 'A' || key == 'B' || key == 'C' || key == 'D') //Detecting Buttons on Column 4
{
Num1 = Number;
Number =0;
if (key == 'A')
{Serial.println ("Addition"); action = '+';
lcd.print(Num1);lcd.print(action);}
if (key == 'B')
{Serial.println ("Subtraction"); action = '-';
lcd.print(Num1);lcd.print(action);}
if (key == 'C')
{Serial.println ("Multiplication"); action = '*';
lcd.print(Num1);lcd.print(action);}
if (key == 'D')
{Serial.println ("Devesion"); action = '/';
lcd.print(Num1);lcd.print(action);}
delay(100);
}
}
void CalculateResult()
{
if (action=='+'){
Number = Num1+Num2;
lcd.print(Num1);lcd.print(action);lcd.print(Num2);lcd.print("=");lcd.print(Number);
result=false;}
if (action=='-'){
Number = Num1-Num2;
lcd.print(Num1);lcd.print(action);lcd.print(Num2);lcd.print("=");lcd.print(Number);
result=false;}
if (action=='*'){
Number = Num1*Num2;
lcd.print(Num1);lcd.print(action);lcd.print(Num2);lcd.print("=");lcd.print(Number);
result=false;}
if (action=='/'){
Number = Num1/Num2;
lcd.print(Num1);lcd.print(action);lcd.print(Num2);lcd.print("=");lcd.print(Number);
result=false;}
}