#include <LiquidCrystal.h>
#include <Keypad.h>
//unsigned int nums[8] = {0,0,0,0,0,0,0,0}; //stores number inputs
long nums[8] = {0,0,0,0,0,0,0,0}; //stores number inputs
char oper[7] = {' ',' ',' ',' ',' ',' ',' '}; //stores operations to be preformed
int num_index = 0; // prevents overflow of nums array
int op_index = 0; // prevents overflow of oper array
String temp = ""; //string to store input
int tnum; // stores temp num to append to nums array
//key pad setup
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {53, 51, 49, 47};
byte colPins[KEYPAD_COLS] = {52, 50, 48, 46};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
void setup(){
Serial.begin(9600); // startmonitor
Serial.println("Started: ");
}
void loop() {
if(num_index == 8){
Serial.println("\nAt calc max");
calc();
clear();
}
char key = keypad.getKey(); // key from keypad press
if(key){
switch(key){
case '#':
Serial.println("=");
save(' ');
calc();
clear();
break;
case 'C':
Serial.print("*");
save('*');
break;
case 'A':
Serial.print("+");
save('+');
break;
case 'D':
Serial.print("/");
save('/');
break;
case 'B':
Serial.print("-");
save('-');
break;
case '*':
Serial.println("Clearing");
clear();
break;
default:
Serial.print(key);
temp += key;
}
}
}
void save(char op){ // saves the data to the arrays
oper[op_index] = op;
tnum = temp.toInt();
nums[num_index] = tnum;
temp = "";
if(op_index != 7){
op_index += 1;
}
num_index += 1;
}
void clear(){
for (int i =0; i < 8; i++){
Serial.print(nums[i]);
Serial.print(" , ");
}
Serial.print("\n");
for (int i =0; i < 7; i++){
Serial.print(oper[i]);
Serial.print(" , ");
}
Serial.print("\n");
//needed code
num_index = 0;
op_index = 0;
for (int i =0; i < 8; i++){
nums[i] = 0;
}
for (int i =0; i < 7; i++){
oper[i] = ' ';
}
temp = "";
}
//int sgn(long x){
// return x==0?1:abs(x)/x;
//}
void calc(){ // begins calculations
long ans = nums[0];
float rem = 0.0;//remainer
//changed from int to long to support 9999*9999
long tempans = 0;
for (int i = 0; i < op_index; i++){
switch(oper[i]){
case '+':
//ans += nums[i + 1];
tempans = (ans+rem)+nums[i + 1];
rem = (ans+rem)+nums[i + 1]-tempans;
ans = tempans;
break;
case '-':
//if (ans < nums[i + 1]){
// Serial.println("Ans Neg, Pos Only");
// return;
//}
//else{
//ans -= nums[i + 1];
tempans = (ans+rem)-nums[i + 1];
rem = (ans+rem)-nums[i + 1]-tempans;
ans = tempans;
break;
//}
case '*':
//ans *= nums[i + 1];
if (rem > 0){
tempans = (ans+rem)*nums[i + 1];
}
else{
tempans=ans*nums[i + 1];
}
//tempans = (ans+rem)*nums[i + 1];
rem = (ans+rem)*nums[i + 1]-tempans;
ans = tempans;
break;
case '/':
if (nums[i + 1] == 0){
Serial.println("Divide By zero!");
return;
}
else{
//ans /= nums[i + 1];
//float temprem=((ans+rem) % nums[i+1])/nums[i+1];
tempans = (ans+rem)/nums[i + 1];
rem = (ans+rem)/nums[i + 1]-tempans;
ans = tempans;
break;
}
case ' ':
int tempdec = floor(rem*100+0.5);
String outstring = "";
if (tempdec > 0){
outstring = String(String(ans)+"."+String(tempdec));
}
else{
outstring = String(ans);
}
//Serial.println(ans+rem);
Serial.println(outstring);
//Serial.println("\n");
//Serial.println(rem);
return;
}
}
Serial.println(ans);
}