#include "button.h" #include "logic.h" #include "led.h" #include but_no_fix_t but_start; bool start_pressed = false; void empty_hendler(); static void but_start_down_handler(void); // void but_init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); but_start.GPIOx = GPIOA; but_start.GPIO_Pin = GPIO_PIN_4; but_start.timeDelay = 2; but_start.pressHandler = but_start_down_handler; but_start.unpressHandler = empty_hendler; but_start.counterActivation = 0; but_start.timeActivation = 40; but_start.fActivation = false; but_start.stateOld = but_get_state(&but_start); // Переключатель "строка/одиночный" GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } // void empty_hendler() {} // void button_run(void) { bu_no_fix_handler(&but_start); } // void bu_no_fix_handler(but_no_fix_t* button) { uint8_t temp; if (button->stateNew != BUT_NO_DEFINE) { temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin); if (temp == 0) // определяем текущее (новое) состояние кнопки button->stateNew = BUT_ON; else button->stateNew = BUT_OFF; if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние } else { button->counterDelay++; // запускаем счетчик на задержку if (button->counterDelay > button->timeDelay) // задержка закончилась { button->counterDelay = 0; temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin); button->counterActivation = 0; if (temp == 0) // определяем текущее (новое) состояние кнопки { button->stateNew = BUT_ON; button->unpressHandler(); } else { button->stateNew = BUT_OFF; button->pressHandler(); } } } button->stateOld = button->stateNew; } // Возвращает сотояние ключа BUTTON_STATE_t but_get_state(but_no_fix_t *button) { return (BUTTON_STATE_t)HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin); } static void but_start_down_handler(void) { // Режим "одиночный" if (but_is_string() == false) { logic_single(); } else { LED_FREQ_OFF logic_string(); } start_pressed = true; //printf("Button\r\n"); } // bool but_is_string(void) { return (bool)HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6); }