72 lines
2.5 KiB
Markdown
72 lines
2.5 KiB
Markdown
# 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 и повтор последней операции в режиме результата.
|
||
* Управление сведено к минимальному набору клавиш.
|