embedded-systems-labs/calculator
2025-12-25 11:14:36 +03:00
..
.settings initial commit 2025-12-25 11:09:27 +03:00
Debug initial commit 2025-12-25 11:09:27 +03:00
Drivers initial commit 2025-12-25 11:09:27 +03:00
Inc initial commit 2025-12-25 11:09:27 +03:00
Src initial commit 2025-12-25 11:09:27 +03:00
startup initial commit 2025-12-25 11:09:27 +03:00
.cproject initial commit 2025-12-25 11:09:27 +03:00
.cproject_org initial commit 2025-12-25 11:09:27 +03:00
.mxproject initial commit 2025-12-25 11:09:27 +03:00
.project initial commit 2025-12-25 11:09:27 +03:00
.project_org initial commit 2025-12-25 11:09:27 +03:00
mx.scratch initial commit 2025-12-25 11:09:27 +03:00
README.md report update 2025-12-25 11:14:36 +03:00
SDK_Keyboard Debug.launch initial commit 2025-12-25 11:09:27 +03:00
SDK_Keyboard_converter.log initial commit 2025-12-25 11:09:27 +03:00
SDK_Keyboard.ioc initial commit 2025-12-25 11:09:27 +03:00
SDK_Keyboard.xml initial commit 2025-12-25 11:09:27 +03:00
SDK11M.cfg initial commit 2025-12-25 11:09:27 +03:00
STM32F407VGTx_FLASH.ld initial commit 2025-12-25 11:09:27 +03:00

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