Загрузка данных


#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 не срабатывает. Светодиоды застывают в текущем состоянии.
    }
}