#include "main.h" #include "init.h" volatile uint32_t ms_ticks = 0; volatile uint8_t mode = 0; // 0 - режим красного, 1 - режим синего void Delay(volatile uint32_t nCount) { while(nCount--) {} } // Обработчик системного таймера (вызывается каждую 1 мс) void SysTick_Handler(void) { ms_ticks++; } // Обработчик прерывания от кнопки void EXTI0_IRQHandler(void) { // Проверяем флаг прерывания if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // Программный антидребезг (задержка) Delay(100000); // Если кнопка все еще нажата if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) { mode = !mode; // Инвертируем режим // Гасим оба диода, чтобы начать цикл заново чисто GPIO_ResetBits(GPIOD, GPIO_Pin_14 | GPIO_Pin_15); ms_ticks = 0; // Сброс таймера цикла } // Очищаем флаг прерывания EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { LEDs_ini(); Button_ini(); EXTI_Config(); // Настройка SysTick на 1 мс (если частота ядра 168МГц или другая - функция сама посчитает) SysTick_Config(SystemCoreClock / 1000); while(1) { if (mode == 0) { // Режим Красный: Период 8000 мс (4с горит, 4с не горит) if ((ms_ticks % 8000) < 4000) GPIO_SetBits(GPIOD, GPIO_Pin_14); else GPIO_ResetBits(GPIOD, GPIO_Pin_14); } else { // Режим Синий: Период 3000 мс (1.5с горит, 1.5с не горит) if ((ms_ticks % 3000) < 1500) GPIO_SetBits(GPIOD, GPIO_Pin_15); else GPIO_ResetBits(GPIOD, GPIO_Pin_15); } } }