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


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

void Delay(uint32_t wait) {
    for (uint32_t i = 0; i < wait; i++);
}

void Blink(int times) {
    for (int i = 0; i < times; i++) {
        MDR_PORTA->RXTX = 0xFF; 
        Delay(1000000);
        MDR_PORTA->RXTX = 0x00; 
        Delay(1000000);
    }
}

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);

    // PORT A — Светодиоды
    PortInit.PORT_Pin   = 0xFF; 
    PortInit.PORT_OE    = PORT_OE_OUT;
    PortInit.PORT_MODE  = PORT_MODE_DIGITAL;
    PORT_Init(MDR_PORTA, &PortInit);

    // PORT B — Кнопки (PB0-PB7)
    PortInit.PORT_Pin   = 0xFF;
    PortInit.PORT_OE    = PORT_OE_IN;
    PortInit.PORT_PULL_UP = PORT_PULL_UP_ON; 
    PORT_Init(MDR_PORTB, &PortInit);

    // PORT C — SELECT (PC0)
    PortInit.PORT_Pin   = PORT_Pin_0;
    PORT_Init(MDR_PORTC, &PortInit);

    int32_t x, y;

    while (1) {
        // Читаем кнопки. Инвертируем, так как PULL_UP (нажато = 1)
        uint32_t btns = ~MDR_PORTB->RXTX & 0xFF;

        // Расчет X (PB0=4, PB1=2, PB2=1, PB3=Знак)
        x = 0;
        if (btns & (1 << 0)) x += 4;
        if (btns & (1 << 1)) x += 2;
        if (btns & (1 << 2)) x += 1;
        if (btns & (1 << 3)) x = -x; 

        // Расчет Y (PB4=4, PB5=2, PB6=1, PB7=Знак)
        y = 0;
        if (btns & (1 << 4)) y += 4;
        if (btns & (1 << 5)) y += 2;
        if (btns & (1 << 6)) y += 1;
        if (btns & (1 << 7)) y = -y;

        // Кнопка SELECT
        if ((MDR_PORTC->RXTX & PORT_Pin_0) == 0) {
            
            // ПРОВЕРКА 1: Границы квадрата 3x3
            if (x >= -3 && x <= 3 && y >= -3 && y <= 3) {
                
                // ПРОВЕРКА 2: Вырезанные углы (круги)
                // d1 — расстояние до центра (-3, 3). Если <= 9, то это ВЫРЕЗ.
                int32_t d1 = (x + 3)*(x + 3) + (y - 3)*(y - 3);
                // d2 — расстояние до центра (3, -3). Если <= 9, то это ВЫРЕЗ.
                int32_t d2 = (x - 3)*(x - 3) + (y + 3)*(y + 3);

                if (d1 <= 9 || d2 <= 9) {
                    Blink(2); // Попал в белый вырез (промах)
                } else {
                    Blink(1); // Попал в заштрихованную часть (успех)
                }
            } else {
                Blink(2); // Вне квадрата (промах)
            }

            // Ждем отпускания кнопки
            while ((MDR_PORTC->RXTX & PORT_Pin_0) == 0);
            Delay(100000);
        }
    }
}