#include <LiquidCrystal_I2C.h>
#include <Keypad.h> // Download library for Keypad from https://github.com/Chris--A/Keypad
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x3F for a 16 chars and 2 line display
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three 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.
*/
byte rowPins[ROWS] = { 4, 5, 6, 7};// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 8, 9, 10, 11 }; // 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, Num3;
char key,action;
boolean result = false;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.clear();
lcd.backlight(); // Make sure backlight is on
lcd.begin(16, 2); //We are using a 16*2 LCD display
//lcd.print("DIY Calculator"); //Display a intro message
lcd.setCursor(0, 1); // set the cursor to column 0, line 1
//lcd.print("-CircuitDigest"); //Display a intro message
delay(2000); //Wait for display to show info
lcd.clear(); //Then clean it
attachInterrupt(digitalPinToInterrupt(19),M_plus,RISING); // function for creating external interrupts at pin19 on Rising (LOW to HIGH)
attachInterrupt(digitalPinToInterrupt(18),M_minus,RISING); // function for creating external interrupts at pin18 on Rising (LOW to HIGH)
attachInterrupt(digitalPinToInterrupt(3),MR,RISING); // function for creating external interrupts at pin3 on Rising (LOW to HIGH)
attachInterrupt(digitalPinToInterrupt(2),MC,RISING); // function for creating external interrupts at pin2 on Rising (LOW to HIGH)
}
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=Num3=0; result=false;}
if (key == '1') //If Button 1 is pressed
{Serial.println ("Button 1");
if (Number==0)
Number=1;
else
Number = (Number*10) + 1; //Pressed twice
}
if (key == '4') //If Button 4 is pressed
{Serial.println ("Button 4");
if (Number==0)
Number=4;
else
Number = (Number*10) + 4; //Pressed twice
}
if (key == '7') //If Button 7 is pressed
{Serial.println ("Button 7");
if (Number==0)
Number=7;
else
Number = (Number*10) + 7; //Pressed twice
}
if (key == '0')
{Serial.println ("Button 0"); //Button 0 is Pressed
if (Number==0)
Number=0;
else
Number = (Number*10) + 0; //Pressed twice
}
if (key == '2') //Button 2 is Pressed
{Serial.println ("Button 2");
if (Number==0)
Number=2;
else
Number = (Number*10) + 2; //Pressed twice
}
if (key == '5')
{Serial.println ("Button 5");
if (Number==0)
Number=5;
else
Number = (Number*10) + 5; //Pressed twice
}
if (key == '8')
{Serial.println ("Button 8");
if (Number==0)
Number=8;
else
Number = (Number*10) + 8; //Pressed twice
}
if (key == '#') // if equal is pressed
{Serial.println ("Button Equal");
Num2=Number;
Num3=Number;
result = true;
}
if (key == '3')
{Serial.println ("Button 3");
if (Number==0)
Number=3;
else
Number = (Number*10) + 3; //Pressed twice
}
if (key == '6')
{Serial.println ("Button 6");
if (Number==0)
Number=6;
else
Number = (Number*10) + 6; //Pressed twice
}
if (key == '9')
{Serial.println ("Button 9");//if key 9 is pressed
if (Number==0)
Number=9;
else
Number = (Number*10) + 9; //Pressed twice
}
if (key == 'A' || key == 'B' || key == 'C' || key == 'D') //Detecting Buttons on Column 4
{
Num1 = Number;
Number =0;
if (key == 'A') // key A for addition
{Serial.println ("Addition"); action = '+';}
if (key == 'B')//key B for Subtraction
{Serial.println ("Subtraction"); action = '-'; }
if (key == 'C')//key C for multiplication
{Serial.println ("Multiplication"); action = '*';}
if (key == 'D')//Key D for division
{Serial.println ("Devesion"); action = '/';}
delay(100);
}
}
void CalculateResult()
{
if (action=='+') // Addition operation
Number = Num1+Num2+Num3;
/*
if (mem_plus == 1){
mem_store = Number;
}else if(mem_minus ==1){
mem_store =mem_store-Number;
}
*/
if (action=='-')//subtraction operation
Number = Num1-Num2-Num3;
if (action=='*'){//Multiplication operation
if(Num3==0) Num3=1;
Number = Num1*Num2*Num3;
}
if (action=='/'){//Division operation
if(Num3==0) {Serial.println("Cannot divide by zero");}
Num3=1;
Number = Num1/Num2/Num3;
}
}
//Display the Results
void DisplayResult()
{
lcd.setCursor(0, 0); // set the cursor to column 0, line 1
lcd.print(Num1); lcd.print(action); lcd.print(Num2); lcd.print(action);lcd.print(Num3);
if (result==true)
{lcd.print(" ="); lcd.print(Number);} //Display the result
lcd.setCursor(0, 1); // set the cursor to column 0, line 1
lcd.print(Number); //Display the result
}
void M_plus(){
Serial.println("M+ is pressed");
int mem_plus = 1;
}
void M_minus(){
Serial.println("M- is pressed");
int mem_minus = 1;
}
void MR(){
Serial.println("MR is pressed");
int mr=1;
}
void MC(){
Serial.println("MC is pressed");
int mc=1;
}