Загрузка данных


#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

LiquidCrystal lcd(13, 11, 10, 9, 1, 0);

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'A','3','2','1'},
  {'B','6','5','4'},
  {'C','9','8','7'},
  {'D','#','0','*'}
};

byte rowPins[ROWS] = {4, 3, 2, 12};      // строки
byte colPins[COLS] = {8, 7, 6, 5};       // столбцы
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

float firstNumber = 0;
float secondNumber = 0;
float result = 0;
char currentOperator = ' ';
String currentInput = "";
String firstNumberStr = "";
String secondNumberStr = "";
bool waitingForSecondNumber = false;
bool showResult = false;

void setup() {
  lcd.begin(16, 2);
  lcd.clear();
}

void loop() {
  char key = keypad.getKey();
  
  if (key) {
    handleKeyPress(key);
  }
}

void handleKeyPress(char key) {
  // Если показан результат, любая клавиша сбрасывает
  if (showResult) {
    resetCalculator();
    handleKeyPress(key); // Обрабатываем нажатую клавишу заново
    return;
  }
  
  // Цифры
  if (isdigit(key)) {
    if (!waitingForSecondNumber) {
      // Ввод первого числа
      currentInput += key;
      firstNumberStr = currentInput;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(firstNumberStr);
    } else {
      // Ввод второго числа
      currentInput += key;
      secondNumberStr = currentInput;
      lcd.setCursor(0, 1);
      lcd.print(secondNumberStr);
    }
  }
  
  // Операторы A(плюс), B(минус), C(умножение), D(деление)
  else if (key == 'A' || key == 'B' || key == 'C' || key == 'D') {
    if (!waitingForSecondNumber && firstNumberStr.length() > 0) {
      firstNumber = firstNumberStr.toFloat();
      
      // Преобразуем клавиши в операторы
      switch(key) {
        case 'A': currentOperator = '+'; break;
        case 'B': currentOperator = '-'; break;
        case 'C': currentOperator = '*'; break;
        case 'D': currentOperator = '/'; break;
      }
      
      // Выводим слово оператора в верхней строке после числа
      lcd.setCursor(firstNumberStr.length() + 1, 0);
      printOperatorWord(currentOperator);
      
      waitingForSecondNumber = true;
      currentInput = "";
    }
  }
  
  // Кнопка * как равно
  else if (key == '*') {
    if (waitingForSecondNumber && secondNumberStr.length() > 0) {
      secondNumber = secondNumberStr.toFloat();
      
      // Вычисляем результат
      calculateResult();
      
      // Выводим результат в нижней строке
      lcd.setCursor(0, 1);
      lcd.print(secondNumberStr);
      lcd.print(" РАВНО ");
      
      // Проверяем, целое ли число результат
      if (result == (int)result) {
        lcd.print((int)result);  // Выводим без десятичной части
      } else {
        lcd.print(result);  // Выводим с десятичной частью
      }
      
      showResult = true;
    }
  }
}

void calculateResult() {
  switch(currentOperator) {
    case '+':
      result = firstNumber + secondNumber;
      break;
    case '-':
      result = firstNumber - secondNumber;
      break;
    case '*':
      result = firstNumber * secondNumber;
      break;
    case '/':
      if (secondNumber != 0) {
        result = firstNumber / secondNumber;
      } else {
        result = 0;
        lcd.setCursor(0, 1);
        lcd.print("Error: Div by 0");
        delay(2000);
        resetCalculator();
      }
      break;
  }
}

void printOperatorWord(char op) {
  switch(op) {
    case '+':
      lcd.print("PLUS");
      break;
    case '-':
      lcd.print("МИНУС");
      break;
    case '*':
      lcd.print("УМНОЖИТЬ");
      break;
    case '/':
      lcd.print("РАЗДЕЛИТЬ");
      break;
  }
}

void resetCalculator() {
  firstNumber = 0;
  secondNumber = 0;
  result = 0;
  currentOperator = ' ';
  currentInput = "";
  firstNumberStr = "";
  secondNumberStr = "";
  waitingForSecondNumber = false;
  showResult = false;
  
  lcd.clear();
}