Multiplying two variables together not working

I'm making a calculator using a DUE and an LCD screen, and I'm having problems with the multiplying feature; for some reason the variables are not multiplying together, and I'm getting zero as a result. Could it be a problem with something else in the code? or is it a problem with this part? I only added this part of the code because I think it's the problem, as when I change it from multiplying to adding, it works fine. I'm not the best at programming, so any help would be appreciated.

  if (OperationType == 3) {
    Output = number * number2;
    number = Output;
    number2 = 0;
    delay(100);  
  }

Hello itsneon
Post your sketch, well formated, with well-tempered comments and in so called code tags "</>" to see how we can help.

Is Output zero?

Yes, I'm working on adding comments to the code so i can paste it all here for context.

I'll bet they are being multiplied together, but because of integer overflow, you are not getting the answer you expected.

Not the best at adding comments... or coding, hope this helps.

#include <LiquidCrystal.h>

const int rs = 7, en = 8, d4 = 9, d5 = 10, d6 = 11, d7 = 12;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const int Zero = 22;
const int One = 23;
const int Two = 24;
const int Three = 25;
const int Four = 26;
const int Five = 27;
const int Six = 28;
const int Seven = 29;
const int Eight = 30;
const int Nine = 31;

const int Addition = 40;
const int Subtraction = 41;
const int Multiplication = 42;
const int Division = 43;
const int Exponent = 44;
const int Dkwtn = 45;
const int Addsubtract = 46;
const int Equals = 47;
const int Clear = 48;
const int ledPin = 13;

int val = 0;
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;
int val6 = 0;
int val7 = 0;
int val8 = 0;
int val9 = 0;

int fct = 0;
int fct1 = 0;
int fct2 = 0;
int fct3 = 0;
int fct4 = 0;
int fct5 = 0;
int fct6 = 0;
int fct7 = 0;
int fct8 = 0;

int Operationthere = 0;
int OperationType = 0; // 1 = Addition
                       // 2 = Subtraction
                       // 3 = Multiplication
                       // 4 = Division
                       // 5 = Exponent
                       // 6 = Dkwtn

int FNactive = 0;
int Mnumber = 0;
int Mnumber1 = 10;

int Cnumber = 0;
int Cnumber2 = 0;

int FOS = 1;

int a = 0;
int Output = 0;


void setup() {

  lcd.begin(16, 2);

  pinMode(Zero, INPUT);
  pinMode(One, INPUT);
  pinMode(Two, INPUT);
  pinMode(Three, INPUT);
  pinMode(Four, INPUT);
  pinMode(Five, INPUT);
  pinMode(Six, INPUT);
  pinMode(Seven, INPUT);
  pinMode(Eight, INPUT);
  pinMode(Nine, INPUT);

  pinMode(Addition, INPUT);
  pinMode(Subtraction, INPUT);
  pinMode(Multiplication, INPUT);
  pinMode(Division, INPUT);
  pinMode(Exponent, INPUT);
  pinMode(Dkwtn, INPUT);
  pinMode(Addsubtract, INPUT);
  pinMode(Equals, INPUT);
  pinMode(Clear, INPUT);
}

void loop() {
  //val-val9 are the numbers and are all the same codewise, i am using normal buttons which have been put into a line on a breadborad.
  val = digitalRead(Zero);
  if (val == HIGH) {
    if (Operationthere == 1) { // if one of the operation buttons have been pressed, it clears the lcd.
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     Mnumber1 = 0;
    }
    if (FNactive == 0) {
     Mnumber = 0;
     FNactive = 1;
    }
    if (Mnumber1 < 10) { // if Mnumber is 10, (10 is for not is use, 0 but not 0) then it will make the numbers 0-9 into a full number.
      if(Mnumber > 0) { // for positive numbers
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 
      if(Mnumber < 0){ // for negative numbers
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {  // for the operations, (FOS stands for: first or second number), Cnumber(first number) and Cnumber2(second number) are used to add, subtract, ect, the numbers together.
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }

    Cnumber = Mnumber;
    Mnumber1 = 0;
    lcd.print("0");
    delay(500);

  }  

  val1 = digitalRead(One);
  if (val1 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 1;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 1;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }


    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }

    Mnumber1 = 0;
    lcd.print("1");
    delay(500);
  }

  val2 = digitalRead(Two);
  if (val2 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 2;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 2;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }

    Mnumber1 = 0;
    lcd.print("2");
    delay(500);
  }

  val3 = digitalRead(Three);
  if (val3 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 3;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 3;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }
    Mnumber1 = 0;
    lcd.print("3");
    delay(500);
  }

  val4 = digitalRead(Four);
  if (val4 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 4;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 4;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }
    
    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }
    Mnumber1 = 0;
    lcd.print("4");
    delay(500);

  }

  val5 = digitalRead(Five);
  if (val5 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 5;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 5;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }
    Mnumber1 = 0;
    lcd.print("5");
    delay(500);
  }

    val6 = digitalRead(Six);
  if (val6 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 6;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 6;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }

    Mnumber1 = 0;
    lcd.print("6");
    delay(500);
  }

    val7 = digitalRead(Seven);
  if (val7 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 7;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 7;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }
    Mnumber1 = 0;
    lcd.print("7");
    delay(500);

  }

  val8 = digitalRead(Eight);
  if (val8 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 8;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 8;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }

    Mnumber1 = 0;
    lcd.print("8");
    delay(500);

  }

  val9 = digitalRead(Nine);
  if (val9 == HIGH) {
    if (Operationthere == 1) {
      lcd.clear();
      Operationthere = 0;
    }
    if (FNactive == 1) {  
     // active
     Mnumber1 = 9;
    }
    if (FNactive == 0) {
     // not active
     Mnumber = 9;
     FNactive = 1;
    }
    if (Mnumber1 < 10) {
      if(Mnumber > 0) {
        Mnumber = (Mnumber * 10) + Mnumber1;
      } 

      if(Mnumber < 0){
      Mnumber = ((Mnumber * -10) + Mnumber1) * -1;} 
    }

    if(FOS == 1) {
      Cnumber = Mnumber;
    }
    if (FOS == 2) {
      Cnumber2 = Mnumber;
      FOS = 1;
    }

    Mnumber1 = 0;
    lcd.print("9");
    delay(500);
  }


 //fct-fct8 are the operations and are all basically the same, again, i am using normal buttons which have been put into a line on a breadborad.
  fct = digitalRead(Addition);
  if (fct == HIGH) {
    Operationthere = 1;    // for clearing the lcd when a number is typed
    OperationType = 1;     // tells the program what opration 

    FOS = 2;
    Mnumber = 0;
    Mnumber1 = 10; 
    FNactive = 0;



    lcd.clear();
    lcd.print("+");
    delay(500);
  }

  if (OperationType == 1) { // this is where the oprations happen
    Output = Cnumber + Cnumber2;
    Cnumber = Output;
    Cnumber2 = 0;
    delay(100);
  }

  fct1 = digitalRead(Subtraction);
  if (fct1 == HIGH) {
    Operationthere = 1;
    OperationType = 2;  


    FOS = 2;
    Mnumber = 0;
    Mnumber1 = 10;
    FNactive = 0;

    lcd.clear();
    lcd.print("-");
    delay(500);
  }

  if (OperationType == 2) {
    Output = Cnumber - Cnumber2;
    Cnumber = Output;
    Cnumber2 = 0;
    delay(100);
  }

  fct2 = digitalRead(Multiplication);
  if (fct2 == HIGH) {
    Operationthere = 1;
    OperationType = 3;  


    FOS = 2;
    Mnumber = 0;
    Mnumber1 = 10;
    FNactive = 0;


    lcd.clear();
    lcd.print("x");
    delay(500);
  }

  if (OperationType == 3) {
    Output = Cnumber * Cnumber2;
    Cnumber = Output;
    Cnumber2 = 0;
    delay(100);  
  }

  fct3 = digitalRead(Division);
  if (fct3 == HIGH) {
    Operationthere = 1;

    Cnumber = 0;
    Mnumber = 0;
    Mnumber1 = 10;
    FNactive = 0;

    lcd.clear();
    lcd.print("/");
    delay(500);
  }

  fct4 = digitalRead(Exponent);
  if (fct4 == HIGH) {
    Operationthere = 1;

    Cnumber = 0;
    Mnumber = 0;
    Mnumber1 = 10;
    FNactive = 0;

    lcd.clear();
    lcd.print("^");
    delay(500);
  }

  fct5 = digitalRead(Dkwtn);
  if (fct5 == HIGH) {
    Operationthere = 1;

    Cnumber = 0;
    Mnumber = 0;
    Mnumber1 = 10;
    FNactive = 0;

    lcd.clear();
    lcd.print(".");
    delay(500);
  }

  fct6 = digitalRead(Addsubtract);
  if (fct6 == HIGH) {

    lcd.clear();
    Mnumber = Mnumber * -1;
    Cnumber = Mnumber;
    Mnumber1 = 0;
    lcd.print(Mnumber);
    delay(500);
  }

  fct7 = digitalRead(Equals);
  if (fct7 == HIGH) {
    Operationthere = 1;
    OperationType = 0;
    Mnumber1 = 10;
    FNactive = 0;

    lcd.clear();
    lcd.print("="); 
    delay(600);
    lcd.clear();
    lcd.print(Output);

  }

  fct8 = digitalRead(Clear);
  if (fct8 == HIGH) {
    lcd.clear();
    lcd.print("Cleared");
    delay(2000);
    lcd.clear();

    Cnumber = 0;
    Cnumber = 0;
    OperationType = 0;    
    Mnumber = 0;
    Mnumber1 = 10;
    FNactive = 0;
    Output = 0;
  }
}


I am sorry, but your code is just not self-explaining. if you build a calculator logic, then the best thing you can do is to separate the logic of the calculator into its own struct. It is a suggestion of course, but from my perspective when your code turns into a hundred if-else chunks than it is not just unreadable, but you yourself will have problems identifying the bug's origin.

Are you shure that your calculator is working correct by using the datatype 'int'?

Yeah... I don't really use Arduino's that much as i suck a lot at programming, i don't know much about the Arduino program, really only the very basics. Originally, I was going to make a logic gate based 16 bit calculator that only used logic gates. But I'm sorry ebay, I'm not paying 60$ for one multiplier 16 bit IC from the 80s or something. I thought that i would take another shot at using an Arduino for this project, plus it is way easier and way better to do it this way instead of using transistor logic.

I tried changing the datatype, but it didn't work.

Use a logic analyzer to see what happens.

Insert Serial.println()´s at points of interrest.

1 Like

Yeah, I'm starting to think that is the problem.

Found the problem, the solution was waiting until the second number was not zero, here is the code if you are interested.

  if (OperationType == 3 && Cnumber2 != 0) {    

    Output = Cnumber * Cnumber2;
    Cnumber = Output;
    Cnumber2 = 0;

    delay(100);  
  }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.