embedded-systems-labs/calculator/README.md
2025-12-25 11:14:36 +03:00

72 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lab 2 — Calculator (OLED + Keypad)
## 1. Цель работы
Сделать калькулятор на STM32 с вводом через клавиатуру и выводом на OLED (128×64):
- ввод числа **A**
- выбор операции (**+ / - / \***)
- ввод числа **B**
- вывод результата
- повтор последней операции по нажатию `#` в режиме результата
## 2. Аппаратная часть
**МК:** STM32F407VGTx (CubeIDE проект)
**Периферия:**
- OLED по I2C (`hi2c1`)
- Клавиатура через I2C-экспандер **PCA9538**
- UART (USART6) для отладки/логов
## 3. Управление
Кнопки:
- `0..9` — ввод цифр
- `*`:
- в вводе A: перейти к выбору операции (по умолчанию `+`)
- в вводе B: переключить операцию `+ → - → * → + ...`
- в результате: “использовать результат как A” и перейти к вводу B
- `#`:
- в вводе A: очистка (reset)
- в вводе B: вычислить результат (`=`)
- в результате: повтор последней операции (repeat)
## 4. Стейт-машина
Состояния:
- `STATE_INPUT_A`
- `STATE_INPUT_B`
- `STATE_RESULT`
```mermaid
stateDiagram-v2
[*] --> INPUT_A
INPUT_A --> INPUT_A: digit
INPUT_A --> INPUT_B: '*' (если есть ввод A)
INPUT_A --> INPUT_A: '#' (clear)
INPUT_B --> INPUT_B: digit
INPUT_B --> INPUT_B: '*' (смена операции)
INPUT_B --> RESULT: '#' (посчитать)
RESULT --> RESULT: '#' (repeat)
RESULT --> INPUT_B: '*' (result -> A, ввод B)
RESULT --> INPUT_A: digit (начать заново)
```
## 5. Отображение на OLED
Экран рисуется функцией `update_display()`:
* справа — подсказка “клавиатуры”
* слева — текущее число/выражение/результат и подсказки по `*`/`#`
## 6. Скриншоты
я забыл сфоткать :(
## 7. Выводы
* Реализован ввод двух операндов и выполнение операций `+`, `-`, `*`.
* Сделан понятный UI на OLED и повтор последней операции в режиме результата.
* Управление сведено к минимальному набору клавиш.