Загрузка данных
#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();
}