#include "stm32f1xx.h"
#include "ssd1306.h"
// Определение пинов
#define OUTPUT_PIN GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 // Пин для выхода
#define INPUT_PIN GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 // Пин для входа
#define LED_PIN GPIO_PIN_13 // Пин для светодиода
#define BUTTON_UP_PIN GPIO_PIN_2 // Кнопка вверх
#define BUTTON_DOWN_PIN GPIO_PIN_3 // Кнопка вниз
#define BUTTON_SELECT_PIN GPIO_PIN_4 // Кнопка выбрать
// Объявление функций
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void DisplayMenu(uint8_t selected);
void RunProgram(uint8_t programIndex);
void CheckSignal(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
ssd1306_Init();
uint8_t menuIndex = 0;
while (1) {
DisplayMenu(menuIndex);
// Обработка кнопок
if (HAL_GPIO_ReadPin(GPIOB, BUTTON_UP_PIN) == GPIO_PIN_SET) {
menuIndex = (menuIndex + 1) % 4; // Предполагаем 4 пункта меню
HAL_Delay(200); // Дребезг
}
if (HAL_GPIO_ReadPin(GPIOB, BUTTON_DOWN_PIN) == GPIO_PIN_SET) {
menuIndex = (menuIndex - 1 + 3) % 4; // Предполагаем 4 пункта меню
HAL_Delay(200); // Дребезг
}
if (HAL_GPIO_ReadPin(GPIOB, BUTTON_SELECT_PIN) == GPIO_PIN_SET) {
RunProgram(menuIndex);
HAL_Delay(200); // Дребезг
}
}
}
void DisplayMenu(uint8_t selected) {
ssd1306_SetCursor(0,0);
ssd1306_WriteString("Menu", Font_7x10, White);
// Здесь добавить пункты меню
const char* menuItems[] = {" 32xx", " 42xx", " PILON_4TJ", "PILON_10TJ"};
for (uint8_t i = 0; i < 3; i++) {
if (i == selected) {
ssd1306_WriteString("> ", Font_7x10, White);
} else {
ssd1306_WriteString(" ", Font_7x10, White);
}
ssd1306_WriteString(menuItems[i], Font_7x10, White);
ssd1306_SetCursor(0, (i + 1) * 10);
}
ssd1306_UpdateScreen();
}
void RunProgram(uint8_t programIndex) {
// Здесь можно изменить количество пинов для входа в зависимости от программы
switch(programIndex) {
case 0:
// Запуск программы 1
CheckSignal();
break;
case 1:
// Запуск программы 2
CheckSignal();
break;
case 2:
// Запуск программы 3
CheckSignal();
break;
case 3:
// Запуск программы 4
CheckSignal();
break;
}
}
void CheckSignal(void) {
HAL_GPIO_WritePin(GPIOA, OUTPUT_PIN, GPIO_PIN_SET); // Установить выходной сигнал
// Задержка для установки сигнала
HAL_Delay(100);
GPIO_PinState outputState = HAL_GPIO_ReadPin(GPIOA, OUTPUT_PIN);
GPIO_PinState inputState = HAL_GPIO_ReadPin(GPIOB, INPUT_PIN);
if (outputState == inputState) {
HAL_GPIO_WritePin(GPIOC, LED_PIN, GPIO_PIN_SET); // Включить светодиод
ssd1306_Fill(Black);
ssd1306_SetCursor(0,0);
ssd1306_WriteString("OK", Font_7x10, White);
} else {
while (1) {
HAL_GPIO_TogglePin(GPIOC, LED_PIN); // Моргание светодиода
ssd1306_Fill(Black);
ssd1306_SetCursor(0,0);
ssd1306_WriteString("FAILED", Font_7x10, White);
HAL_Delay(500);
}
}
// Сброс состояния светодиода и обновление экрана
HAL_GPIO_WritePin(GPIOC, LED_PIN, GPIO_PIN_RESET);
ssd1306_UpdateScreen();
}
// Функция инициализации GPIO (добавить необходимые настройки)
static void MX_GPIO_Init(void) {
HAL_RCC_GPIOA_CLK_ENABLE();
HAL_RCC_GPIOB_CLK_ENABLE();
HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Настройка выходного пина
GPIO_InitStruct.Pin = OUTPUT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Настройка входного пина
GPIO_InitStruct.Pin = INPUT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// Настройка пина светодиода
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// Настройка кнопок
GPIO_InitStruct.Pin = BUTTON_UP_PIN | BUTTON_DOWN_PIN | BUTTON_SELECT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
// Функция конфигурации системного тактирования (добавьте необходимую конфигурацию)
void SystemClock_Config(void) {
// Настройте системные часы в соответствии с вашей схемой
}Loading
stm32-bluepill
stm32-bluepill
Loading
ssd1306
ssd1306