#include "core.h"

short num1, num2, result;
char dig1, dig2, operation1, operation2;
char tempx, tempy, i;

void setup() {
  initPort('F', "OUTPUT");
  initPort('K', "OUTPUT");
  initPort('C', "OUTPUT");
  initPort('A', "INPUT");
}

void loop() {
  dig1 = keypad_select();
  num1 = convert_symbol_to_number(dig1);
  while ((dig1 != '+') || (dig1 != '-') || (dig1 != '*') || (dig1 != '/')) {
    dig1 = convert_symbol_to_number(dig1);
    DisplayLogic("one digit display");
    tempx = sevenSegment(dig1);
    output(tempx);
    delay_ms(150);
    dig1 = keypad_select();
    if (is_numeric(dig1) == 1) {
      num1 *= 10;
      num1 += convert_symbol_to_number(dig1);
    } else {
      break;
    }
  }

  operation1 = keypad_select();
  DisplayLogic("clear display");
  delay_ms(150);

  dig2 = keypad_select();
  num2 = convert_symbol_to_number(dig2);
  while ((dig2 != '+') || (dig2 != '-') || (dig2 != '*') || (dig2 != '/')) {
    dig2 = convert_symbol_to_number(dig2);
    DisplayLogic("one digit display");
    tempx = sevenSegment(dig2);
    output(tempx);
    delay_ms(150);
    dig2 = keypad_select();
    if (is_numeric(dig2) == 1) {
      num2 *= 10;
      num2 += convert_symbol_to_number(dig2);
    } else {
      break;
    }
  }

  operation2 = keypad_select();
  DisplayLogic("clear display");
  delay_ms(150);

  if (operation1 == '+') {
    if (operation2 == '=') {
      result = num1 + num2;
      if (result < 10) {
        DisplayLogic("one digit display");
        tempx = sevenSegment(result);
        output(tempx);
        delay_ms(150);
      } else if (result >= 10) {
        if (result < 100) {
          for (i = 0; i < 5; i++) {
            DisplayLogic("one digit display");
            tempy = find_desired_digit(result, 1);
            tempx = sevenSegment(tempy);
            output(tempx);
            delay_ms(70);
            DisplayLogic("tenth digit display");
            tempy = find_desired_digit(result, 2);
            tempx = sevenSegment(tempy);
            output(tempx);
            delay_ms(70);
            DisplayLogic("clear display");
          }
        } else if (result >= 100) {
          if (result < 1000) {
            for (i = 0; i < 5; i++) {
              DisplayLogic("one digit display");
              tempy = find_desired_digit(result, 1);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("tenth digit display");
              tempy = find_desired_digit(result, 2);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("hundreth digit display");
              tempy = find_desired_digit(result, 3);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("clear display");
            }
          } else if (result >= 1000) {
            if (result < 10000) {
              for (i = 0; i < 5; i++) {
                DisplayLogic("one digit display");
                tempy = find_desired_digit(result, 1);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("tenth digit display");
                tempy = find_desired_digit(result, 2);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("hundreth digit display");
                tempy = find_desired_digit(result, 3);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("thousands digit display");
                tempy = find_desired_digit(result, 4);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("clear display");
              }

            } else if (result >= 10000) {
              DisplayLogic("four digit display");
              tempx = sevenSegment('e');
              output(tempx);
            }
          }
        }
      }
    }
  } else if (operation1 == '-') {
    if (operation2 == '=') {
      result = num1 - num2;
      if (result >= 0) {
        if (result < 10) {
          DisplayLogic("one digit display");
          tempx = sevenSegment(result);
          output(tempx);
          delay_ms(150);
        } else if (result >= 10) {
          if (result < 100) {
            for (i = 0; i < 5; i++) {
              DisplayLogic("one digit display");
              tempy = find_desired_digit(result, 1);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("tenth digit display");
              tempy = find_desired_digit(result, 2);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("clear display");
            }
          } else if (result >= 100) {
            if (result < 1000) {
              for (i = 0; i < 5; i++) {
                DisplayLogic("one digit display");
                tempy = find_desired_digit(result, 1);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("tenth digit display");
                tempy = find_desired_digit(result, 2);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("hundreth digit display");
                tempy = find_desired_digit(result, 3);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("clear display");
              }
            } else if (result >= 1000) {
              if (result < 10000) {
                for (i = 0; i < 5; i++) {
                  DisplayLogic("one digit display");
                  tempy = find_desired_digit(result, 1);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("tenth digit display");
                  tempy = find_desired_digit(result, 2);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("hundreth digit display");
                  tempy = find_desired_digit(result, 3);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("thousands digit display");
                  tempy = find_desired_digit(result, 4);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("clear display");
                }

              } else if (result >= 10000) {
                DisplayLogic("four digit display");
                tempx = sevenSegment('e');
                output(tempx);
              }
            }
          }
        }
      } else if (result < 0) {
        result = result * (-1);
        if (result < 10) {
          for (i = 0; i < 5; i++) {
            DisplayLogic("one digit display");
            tempx = sevenSegment(result);
            output(tempx);
            delay_ms(70);
            DisplayLogic("tenth digit display");
            tempx = sevenSegment('-');
            output(tempx);
            delay_ms(70);
            DisplayLogic("clear display");
          }
        } else if (result >= 10) {
          if (result < 100) {
            for (i = 0; i < 5; i++) {
              DisplayLogic("one digit display");
              tempy = find_desired_digit(result, 1);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("tenth digit display");
              tempy = find_desired_digit(result, 2);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("hundreth digit display");
              tempx = sevenSegment('-');
              output(tempx);
              delay_ms(70);
              DisplayLogic("clear display");
            }
          } else if (result >= 100) {
            if (result < 1000) {
              for (i = 0; i < 5; i++) {
                DisplayLogic("one digit display");
                tempy = find_desired_digit(result, 1);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(50);
                DisplayLogic("tenth digit display");
                tempy = find_desired_digit(result, 2);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(50);
                DisplayLogic("hundreth digit display");
                tempy = find_desired_digit(result, 3);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(50);
                DisplayLogic("thousands digit display");
                tempx = sevenSegment('-');
                output(tempx);
                delay_ms(50);
                DisplayLogic("clear display");
              }
            } else if (result >= 1000) {
              DisplayLogic("four digit display");
              tempx = sevenSegment('e');
              output(tempx);
            }
          }
        }
      }
    }
  } else if (operation1 == '*') {
    if (operation2 == '=') {
      result = num1 * num2;
      if (result < 10) {
        DisplayLogic("one digit display");
        tempx = sevenSegment(result);
        output(tempx);
        delay_ms(150);
      } else if (result >= 10) {
        if (result < 100) {
          for (i = 0; i < 5; i++) {
            DisplayLogic("one digit display");
            tempy = find_desired_digit(result, 1);
            tempx = sevenSegment(tempy);
            output(tempx);
            delay_ms(70);
            DisplayLogic("tenth digit display");
            tempy = find_desired_digit(result, 2);
            tempx = sevenSegment(tempy);
            output(tempx);
            delay_ms(70);
            DisplayLogic("clear display");
          }
        } else if (result >= 100) {
          if (result < 1000) {
            for (i = 0; i < 5; i++) {
              DisplayLogic("one digit display");
              tempy = find_desired_digit(result, 1);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("tenth digit display");
              tempy = find_desired_digit(result, 2);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("hundreth digit display");
              tempy = find_desired_digit(result, 3);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("clear display");
            }
          } else if (result >= 1000) {
            if (result < 10000) {
              for (i = 0; i < 5; i++) {
                DisplayLogic("one digit display");
                tempy = find_desired_digit(result, 1);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("tenth digit display");
                tempy = find_desired_digit(result, 2);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("hundreth digit display");
                tempy = find_desired_digit(result, 3);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("thousands digit display");
                tempy = find_desired_digit(result, 4);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("clear display");
              }
            } else if (result >= 10000) {
              DisplayLogic("four digit display");
              tempx = sevenSegment('e');
              output(tempx);
            }
          }
        }
      }
    }
  } else if (operation1 == '/') {
    if (operation2 == '=') {
      result = num1 % num2;
      if (result >= 0) {
        if (result < 10) {
          DisplayLogic("one digit display");
          tempx = sevenSegment(result);
          output(tempx);
          delay_ms(150);
        } else if (result >= 10) {
          if (result < 100) {
            for (i = 0; i < 5; i++) {
              DisplayLogic("one digit display");
              tempy = find_desired_digit(result, 1);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("tenth digit display");
              tempy = find_desired_digit(result, 2);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("clear display");
            }
          } else if (result >= 100) {
            if (result < 1000) {
              for (i = 0; i < 5; i++) {
                DisplayLogic("one digit display");
                tempy = find_desired_digit(result, 1);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("tenth digit display");
                tempy = find_desired_digit(result, 2);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("hundreth digit display");
                tempy = find_desired_digit(result, 3);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(70);
                DisplayLogic("clear display");
              }
            } else if (result >= 1000) {
              if (result < 10000) {
                for (i = 0; i < 5; i++) {
                  DisplayLogic("one digit display");
                  tempy = find_desired_digit(result, 1);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("tenth digit display");
                  tempy = find_desired_digit(result, 2);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("hundreth digit display");
                  tempy = find_desired_digit(result, 3);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("thousands digit display");
                  tempy = find_desired_digit(result, 4);
                  tempx = sevenSegment(tempy);
                  output(tempx);
                  delay_ms(70);
                  DisplayLogic("clear display");
                }

              } else if (result >= 10000) {
                DisplayLogic("four digit display");
                tempx = sevenSegment('e');
                output(tempx);
              }
            }
          }
        }
      } else if (result < 0) {
        result = result * (-1);
        if (result < 10) {
          for (i = 0; i < 5; i++) {
            DisplayLogic("one digit display");
            tempx = sevenSegment(result);
            output(tempx);
            delay_ms(70);
            DisplayLogic("tenth digit display");
            tempx = sevenSegment('-');
            output(tempx);
            delay_ms(70);
            DisplayLogic("clear display");
          }
        } else if (result >= 10) {
          if (result < 100) {
            for (i = 0; i < 5; i++) {
              DisplayLogic("one digit display");
              tempy = find_desired_digit(result, 1);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("tenth digit display");
              tempy = find_desired_digit(result, 2);
              tempx = sevenSegment(tempy);
              output(tempx);
              delay_ms(70);
              DisplayLogic("hundreth digit display");
              tempx = sevenSegment('-');
              output(tempx);
              delay_ms(70);
              DisplayLogic("clear display");
            }
          } else if (result >= 100) {
            if (result < 1000) {
              for (i = 0; i < 5; i++) {
                DisplayLogic("one digit display");
                tempy = find_desired_digit(result, 1);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(50);
                DisplayLogic("tenth digit display");
                tempy = find_desired_digit(result, 2);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(50);
                DisplayLogic("hundreth digit display");
                tempy = find_desired_digit(result, 3);
                tempx = sevenSegment(tempy);
                output(tempx);
                delay_ms(50);
                DisplayLogic("thousands digit display");
                tempx = sevenSegment('-');
                output(tempx);
                delay_ms(50);
                DisplayLogic("clear display");
              }
            } else if (result >= 1000) {
              DisplayLogic("four digit display");
              tempx = sevenSegment('e');
              output(tempx);
            }
          }
        }
      }
    }
  }
}  
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
sevseg1:DIG1
sevseg1:DIG2
sevseg1:DIG3
sevseg1:DIG4
sevseg1:COM
sevseg1:CLN
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4