| .. | ||
| .settings | ||
| Debug | ||
| Drivers | ||
| Inc | ||
| Src | ||
| startup | ||
| .cproject | ||
| .cproject_org | ||
| .mxproject | ||
| .project | ||
| .project_org | ||
| mx.scratch | ||
| README.md | ||
| SDK_Keyboard Debug.launch | ||
| SDK_Keyboard_converter.log | ||
| SDK_Keyboard.ioc | ||
| SDK_Keyboard.xml | ||
| SDK11M.cfg | ||
| STM32F407VGTx_FLASH.ld | ||
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: перейти к выбору операции (по умолчанию
#:- в вводе A: очистка (reset)
- в вводе B: вычислить результат (
=) - в результате: повтор последней операции (repeat)
4. Стейт-машина
Состояния:
STATE_INPUT_ASTATE_INPUT_BSTATE_RESULT
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 и повтор последней операции в режиме результата.
- Управление сведено к минимальному набору клавиш.