#include "MDR32Fx.h"
#include "core_cm3.h"
#include "MDR32F9Qx_config.h"
#include "MDR32F9Qx_rst_clk.h"
#include "MDR32F9Qx_port.h"
#include "system_MDR32F9Qx.h"
static PORT_InitTypeDef PortInit;
volatile uint32_t ms_tick = 0;
void SysTick_Handler() {
ms_tick++;
}
// Обычная задержка (оставим для инициализации, если надо)
void delay_mss(uint32_t ms) {
uint32_t start = ms_tick;
while ((ms_tick - start) < ms);
}
int main () {
// 1. Инициализация тактирования
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA, ENABLE);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);
// 2. Настройка кнопки (PORTC, Pin 0)
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_FUNC = PORT_FUNC_PORT;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PortInit.PORT_Pin = (PORT_Pin_0);
PORT_Init(MDR_PORTC, &PortInit);
// 3. Настройка светодиодов (PORTA)
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_Pin = PORT_Pin_All;
PORT_Init(MDR_PORTA, &PortInit);
// 4. Настройка SysTick
SysTick->LOAD = (8000000/1000) - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
// Переменные для управления анимацией
int step = 0; // Текущий шаг анимации (0-5)
uint8_t is_paused = 0; // Флаг паузы
uint8_t last_btn_state = 1; // Предыдущее состояние кнопки (1 - отпущена)
uint32_t last_move_time = 0; // Время последнего переключения светодиодов
PORT_Write(MDR_PORTA, PORT_Pin_All); // Гасим всё в начале
while(1) {
// --- БЛОК КНОПКИ ---
uint8_t current_btn = PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0);
// Ловим момент нажатия (было 1, стало 0)
if (current_btn == 0 && last_btn_state == 1) {
is_paused = !is_paused; // Переключаем паузу
delay_mss(200); // Защита от дребезга (простая задержка)
}
last_btn_state = current_btn;
// --- БЛОК АНИМАЦИИ ---
if (is_paused == 0) {
// Если не на паузе, проверяем: прошла ли 1 секунда (1000 мс)?
if ((ms_tick - last_move_time) >= 1000) {
if (step >= 0 && step <= 3) {
// Твоя логика сталкивания
uint32_t mask = (1 << step) | (1 << (7 - step));
PORT_Write(MDR_PORTA, ~mask);
}
else if (step == 4) {
// Твоя логика: Все горят
PORT_Write(MDR_PORTA, 0x00);
}
else if (step == 5) {
// Твоя логика: Все погасли
PORT_Write(MDR_PORTA, 0xFF);
}
step++;
if (step > 5) step = 0; // Зацикливаем анимацию
last_move_time = ms_tick; // Запоминаем время последнего шага
}
}
// Если is_paused == 1, мы просто крутимся в while(1), проверяем кнопку,
// но код PORT_Write не срабатывает. Светодиоды застывают в текущем состоянии.
}
}