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


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

// Твоя задержка для моргания [cite: 3]
void Delay(uint32_t wait) {
    for (uint32_t i = 0; i < wait; i++);
}

// Функция моргания [cite: 4]
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) {
    // 1. Тактирование портов как в рабочем примере [cite: 7]
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTB | RST_CLK_PCLK_PORTC, ENABLE);

    PORT_InitTypeDef PortInit;
    
    // 2. Инициализация по битам (как у одногруппника) 
    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_PULL_UP = PORT_PULL_UP_ON; // Кнопки требуют подтяжки [cite: 12]

    // Настройка PORT B пин за пином для кнопок 
    PortInit.PORT_Pin = PORT_Pin_0 | PORT_Pin_1 | PORT_Pin_2 | PORT_Pin_3 | 
                        PORT_Pin_4 | PORT_Pin_5 | PORT_Pin_6 | PORT_Pin_7;
    PORT_Init(MDR_PORTB, &PortInit);

    // Настройка PORT C для SELECT [cite: 13, 14]
    PortInit.PORT_Pin = PORT_Pin_0;
    PORT_Init(MDR_PORTC, &PortInit);

    // Настройка PORT A на выход для светодиодов [cite: 8, 9, 10]
    PortInit.PORT_OE = PORT_OE_OUT;
    PortInit.PORT_PULL_UP = PORT_PULL_UP_OFF;
    PortInit.PORT_Pin = PORT_Pin_All;
    PORT_Init(MDR_PORTA, &PortInit);

    int8_t x, y;

    while(1) {
        // Сборка координат по битам (Логика из main.c) 
        // Для X (PB0, PB1, PB2 — значения, PB3 — знак)
        x = ( (((MDR_PORTB->RXTX & (1 << 0)) == 0 ? 1 : 0) * 4) + 
              (((MDR_PORTB->RXTX & (1 << 1)) == 0 ? 1 : 0) * 2) + 
              (((MDR_PORTB->RXTX & (1 << 2)) == 0 ? 1 : 0) * 1) ) * (((MDR_PORTB->RXTX & (1 << 3)) == 0 ? -1 : 1));

        // Для Y (PB4, PB5, PB6 — значения, PB7 — знак)
        y = ( (((MDR_PORTB->RXTX & (1 << 4)) == 0 ? 1 : 0) * 4) + 
              (((MDR_PORTB->RXTX & (1 << 5)) == 0 ? 1 : 0) * 2) + 
              (((MDR_PORTB->RXTX & (1 << 6)) == 0 ? 1 : 0) * 1) ) * (((MDR_PORTB->RXTX & (1 << 7)) == 0 ? -1 : 1));

        // Если нажат SELECT (PC0) [cite: 13, 14]
        if ((MDR_PORTC->RXTX & (1 << 0)) == 0) {
            
            // Расчет попадания в область 
            if (x >= -3 && x <= 3 && y >= -3 && y <= 3) {
                int32_t d1 = (x + 3)*(x + 3) + (y - 3)*(y - 3);
                int32_t d2 = (x - 3)*(x - 3) + (y + 3)*(y + 3);

                if (d1 > 9 && d2 > 9) {
                    Blink(1); // ПОПАЛ 
                } else {
                    Blink(2); // МИМО (в вырезе) 
                }
            } else {
                Blink(2); // МИМО (вне квадрата) 
            }

            // Ожидание отпускания кнопки SELECT 
            while ((MDR_PORTC->RXTX & (1 << 0)) == 0);
            Delay(200000); 
        }
    }
}