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


#include "MDR32Fx.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 () {
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTC, ENABLE);
    
    // Кнопка (0 - нажата, 1 - отпущена)
    PortInit.PORT_OE = PORT_OE_IN;
    PortInit.PORT_Pin = PORT_Pin_0;
    PORT_Init(MDR_PORTC, &PortInit);
    
    // Светодиоды
    PortInit.PORT_OE = PORT_OE_OUT;
    PortInit.PORT_Pin = PORT_Pin_All;
    PORT_Init(MDR_PORTA, &PortInit); 

    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, 1, 2, 3, 4, 5)
    int pause = 0;            // Флаг паузы
    uint8_t last_btn_state = 1; // Предыдущее состояние кнопки (1 - отпущена)
    uint32_t last_move_time = 0; // Время последнего шага

    while(1) {
        // 1. ПРАВИЛЬНАЯ ПРОВЕРКА КНОПКИ (Ловим только момент нажатия)
        uint8_t current_btn = PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0);
        
        // Если кнопка была отпущена (1), а стала нажата (0)
        if (current_btn == 0 && last_btn_state == 1) {
            pause = !pause; // Переключаем паузу один раз
            delay_mss(50);  // Защита от дребезга
        }
        last_btn_state = current_btn;

        // 2. ЛОГИКА ДВИЖЕНИЯ (только если нет паузы)
        if (!pause) {
            if (ms_tick - last_move_time >= 1000) {
                
                if (step < 4) {
                    // Шаги сталкивания
                    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;
            }
        }
        // Если pause == 1, мы просто крутимся в while(1), проверяем кнопку, 
        // но блок с PORT_Write и шагами не срабатывает. Светодиоды застывают.
    }
}