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


#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) {
    // 1. Тактирование
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTB | RST_CLK_PCLK_PORTC, ENABLE);

    PORT_InitTypeDef PortInit;
    PORT_StructInit(&PortInit);

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

    // 3. PORT B — Кнопки (с подтяжкой)
    PortInit.PORT_Pin   = 0xFF;
    PortInit.PORT_OE    = PORT_OE_IN;
    PortInit.PORT_PULL_UP = PORT_PULL_UP_ON; 
    PORT_Init(MDR_PORTB, &PortInit);

    // 4. PORT C — Пин 0 (SELECT)
    PortInit.PORT_Pin   = PORT_Pin_0;
    PORT_Init(MDR_PORTC, &PortInit);

    int8_t x, y;

    while (1) {
        // Читаем физические уровни (нажато = 0)
        uint32_t portB = MDR_PORTB->RXTX;

        // Побитовая сборка X как у одногруппника (нажато = 0, поэтому инвертируем проверку)
        // Если бит == 0 (нажато), берем 1, иначе 0. Умножаем на вес.
        int8_t valX = (((portB & (1 << 0)) == 0 ? 1 : 0) * 4) + 
                      (((portB & (1 << 1)) == 0 ? 1 : 0) * 2) + 
                      (((portB & (1 << 2)) == 0 ? 1 : 0) * 1);
        
        int8_t signX = ((portB & (1 << 3)) == 0 ? -1 : 1);
        x = valX * signX;

        // Побитовая сборка Y
        int8_t valY = (((portB & (1 << 4)) == 0 ? 1 : 0) * 4) + 
                      (((portB & (1 << 5)) == 0 ? 1 : 0) * 2) + 
                      (((portB & (1 << 6)) == 0 ? 1 : 0) * 1);
        
        int8_t signY = ((portB & (1 << 7)) == 0 ? -1 : 1);
        y = valY * signY;

        // Проверка по нажатию SELECT (PC0)
        if ((MDR_PORTC->RXTX & PORT_Pin_0) == 0) {
            
            // Математика области (как в main.c у него, но под твой график)
            // Квадрат 3x3
            if (x >= -3 && x <= 3 && y >= -3 && y <= 3) {
                
                // Проверка "вырезов" (расстояние до углов)
                int32_t d1 = (x + 3)*(x + 3) + (y - 3)*(y - 3); // угол (-3, 3)
                int32_t d2 = (x - 3)*(x - 3) + (y + 3)*(y + 3); // угол (3, -3)

                if (d1 > 9 && d2 > 9) {
                    Blink(1); // В заштрихованной зоне
                } else {
                    Blink(2); // В "дырке" от круга
                }
            } else {
                Blink(2); // Вне квадрата
            }

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