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


#include "MDR32Fx.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_rst_clk.h"

// Настройка портов (зависит от вашей отладочной платы, обычно PORTA/PORTB - LED, PORTE/PORTC - KEY)
// Предположим: LED1-LED8 на PORTA (0-7), KEY1-KEY8 на PORTB (0-7), SELECT на PORTC (0)

void Delay_ms(uint32_t ms);
volatile uint32_t ms_tick = 0;

void SysTick_Handler(void) { ms_tick++; }

// Функция преобразования кнопок в число со знаком
int8_t GetCoord(uint32_t keys) {
    int8_t val = (keys & 0x07); // Младшие 3 бита - значение
    if (keys & 0x08) val = -val; // 4-й бит - знак
    return val;
}

void BlinkLEDs(int times) {
    for (int i = 0; i < times; i++) {
        PORT_Write(MDR_PORTA, 0x00FF); // Включить все LED
        Delay_ms(300);
        PORT_Write(MDR_PORTA, 0x0000); // Выключить
        Delay_ms(300);
    }
}

int main(void) {
    // Включение тактирования
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTB | RST_CLK_PCLK_PORTC, ENABLE);

    PORT_InitTypeDef PortInit;
    PORT_StructInit(&PortInit);

    // Настройка LED (PORTA 0-7) на выход
    PortInit.PORT_Pin = 0x00FF;
    PortInit.PORT_OE = PORT_OE_OUT;
    PORT_Init(MDR_PORTA, &PortInit);

    // Настройка KEY (PORTB 0-7) на вход
    PortInit.PORT_Pin = 0x00FF;
    PortInit.PORT_OE = PORT_OE_IN;
    PORT_Init(MDR_PORTB, &PortInit);

    // Настройка кнопки SELECT (PORTC 0) на вход
    PortInit.PORT_Pin = PORT_Pin_0;
    PORT_Init(MDR_PORTC, &PortInit);

    // Инициализация SysTick
    SysTick_Config(8000000 / 1000);

    while (1) {
        // Ожидание нажатия SELECT
        if (PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == 0) {
            Delay_ms(50); // Антидребезг
            
            // Считываем состояние кнопок
            uint32_t all_keys = PORT_ReadInputData(MDR_PORTB) & 0xFF;
            int x = GetCoord(all_keys & 0x0F);         // KEY1-4
            int y = GetCoord((all_keys >> 4) & 0x0F);  // KEY5-8

            // Проверка условий попадания
            int in_square = (x >= -3 && x <= 3 && y >= -3 && y <= 3);
            int out_circle1 = ((x + 3)*(x + 3) + (y - 3)*(y - 3) >= 9);
            int out_circle2 = ((x - 3)*(x - 3) + (y + 3)*(y + 3) >= 9);

            if (in_square && out_circle1 && out_circle2) {
                BlinkLEDs(1); // Попал - 1 раз
            } else {
                BlinkLEDs(2); // Не попал - 2 раза
            }

            // Ждем отпускания кнопки
            while(PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == 0);
        }
    }
}

void Delay_ms(uint32_t ms) {
    uint32_t start = ms_tick;
    while ((ms_tick - start) < ms);
}