Калькулятор на Arduino с LCD 16×2 и матричной клавиатурой 4×4 (обучение работе с Proteus)
В данной статье рассматривается создание простого калькулятора на Arduino с использованием матричной клавиатуры 4×4 и ЖК-дисплея 16×2.
Проект разработан специально для обучения работе с симулятором Proteus и демонстрирует обработку пользовательского ввода, отображение математического выражения и пошаговое вычисление результата.
Скетч реализует полноценный калькулятор с поддержкой операций сложения, вычитания, умножения и деления. Верхняя строка дисплея используется для отображения вводимого выражения, а нижняя — для текущего числа или результата. Такой подход делает работу калькулятора наглядной и удобной для пользователя.
Назначение проекта
Цель проекта — показать практическую реализацию калькулятора на Arduino без использования сторонних библиотек для клавиатуры:
- опрос матричной клавиатуры 4×4 вручную;
- обработка цифровых и управляющих клавиш;
- вывод выражения и результата на LCD 16×2;
- пошаговое вычисление без приоритета операций;
- структурированная и понятная логика программы.
Проект отлично подходит для учебных целей, лабораторных работ и начального изучения взаимодействия Arduino с устройствами ввода и вывода.
Используемые компоненты
- Arduino UNO;
- Матричная клавиатура 4×4;
- ЖК-дисплей 16×2 (HD44780);
- Соединительные провода;
- Proteus 8 или 9 с поддержкой Arduino.
Принцип работы программы
Клавиатура подключена напрямую к цифровым пинам Arduino. Четыре строки настроены как выходы, а четыре столбца — как входы с INPUT_PULLUP. При опросе очередная строка притягивается к LOW, после чего проверяется состояние столбцов.
Каждое нажатие клавиши возвращает символ: цифру, оператор или управляющую команду. Программа обрабатывает ввод поэтапно, не используя сложный парсер выражений.
- цифры формируют текущее число;
- операторы применяют предыдущее вычисление;
- кнопка C полностью сбрасывает состояние;
- кнопка = завершает вычисление и выводит результат.
Вычисления выполняются последовательно, в порядке ввода, что упрощает алгоритм и делает код максимально наглядным.
Организация вывода на LCD
Для удобства пользователя дисплей разделён логически:
- верхняя строка — отображение вводимого выражения;
- нижняя строка — текущее число или итоговый результат.
Перед каждой перерисовкой строки полностью очищаются. Это предотвращает наложение старых символов и обеспечивает корректное отображение текста.
Arduino-скетч
#include <LiquidCrystal.h>
#include <ctype.h>
// === KEYPAD ===
#define r1 0
#define r2 1
#define r3 2
#define r4 3
#define c1 4
#define c2 5
#define c3 6
#define c4 7
char keys[4][4] = {
{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'C','0','=','+'}
};
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
// === СОСТОЯНИЕ ===
String expr = ""; // верхняя строка (ВВОД)
long acc = 0; // аккумулятор
long num = 0; // текущий ввод
char op = 0;
bool first = true;
// === SETUP ===
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);
pinMode(i + 4, INPUT_PULLUP);
}
lcd.begin(16, 2);
lcd.clear();
}
// === ЧТЕНИЕ КЛАВИШ ===
char getKey() {
for (int r = 0; r < 4; r++) {
digitalWrite(r, LOW);
for (int c = 0; c < 4; c++) {
if (!digitalRead(c + 4)) {
while (!digitalRead(c + 4));
digitalWrite(r, HIGH);
return keys[r][c];
}
}
digitalWrite(r, HIGH);
}
return 0;
}
// === ПЕРЕРИСОВКА ===
void draw() {
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(expr);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(num);
}
// === ВЫЧИСЛЕНИЕ ===
void apply() {
if (first) {
acc = num;
first = false;
} else {
switch (op) {
case '+': acc += num; break;
case '-': acc -= num; break;
case '*': acc *= num; break;
case '/': if (num) acc /= num; break;
}
}
}
void loop() {
char k = getKey();
if (!k) return;
// ЦИФРЫ
if (isdigit(k)) {
num = num * 10 + (k - '0');
expr += k;
draw();
return;
}
// СБРОС
if (k == 'C') {
expr = "";
acc = 0;
num = 0;
op = 0;
first = true;
draw();
return;
}
// ОПЕРАТОР
if (k == '+' || k == '-' || k == '*' || k == '/') {
apply();
op = k;
num = 0;
expr += k;
draw();
return;
}
// РАВНО
if (k == '=') {
apply();
num = acc;
draw();
// подготовка к новому выражению
expr = "";
acc = 0;
op = 0;
first = true;
}
}
Работа проекта в Proteus
В симуляции Proteus калькулятор полностью работоспособен: нажатие клавиш приводит к мгновенному обновлению дисплея, а результат вычислений отображается без задержек. Проект не требует подключения Arduino к реальному компьютеру.
Запуск проекта в Proteus
- распакуйте архив с проектом;
- откройте файл .pdsprj;
- проверьте путь к файлу .hex в свойствах Arduino;
- нажмите Run Simulation;
- используйте клавиатуру для ввода выражений.
Если что-то не работает
Если возникают проблемы с запуском проекта или непонятен принцип работы, рекомендуется пройти базовый урок по Proteus.
Подробно разобран первый проект в Proteus:
Первый проект в Proteus — мигание светодиода