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


#include "MDR32Fx.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_rst_clk.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);
}

// Функция для чтения знаковых координат (3 бита значение + 1 бит знак)
int Get_Coord(uint8_t raw) {
    int val = raw & 0x07; // первые 3 бита
    if (raw & 0x08) {     // 4-й бит - знаковый
        return -val;
    }
    return val;
}

// Функция моргания (учитываем, что 0x00 - горят, 0xFF - погашены)
void Blink(int count) {
    for (int i = 0; i < count; i++) {
        PORT_Write(MDR_PORTA, 0x00); // Включить все
        delay_mss(400);
        PORT_Write(MDR_PORTA, 0xFF); // Выключить все
        delay_mss(400);
    }
}

int main () {
    // 1. Тактирование
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTC, ENABLE);
    
    // 2. Настройка светодиодов (PORTA - Выход)
    PortInit.PORT_OE = PORT_OE_OUT;
    PortInit.PORT_FUNC = PORT_FUNC_PORT;
    PortInit.PORT_MODE = PORT_MODE_DIGITAL;
    PortInit.PORT_SPEED = PORT_SPEED_SLOW;
    PortInit.PORT_Pin = PORT_Pin_All;
    PORT_Init(MDR_PORTA, &PortInit); 
    
    // 3. Настройка кнопок (PORTC - Вход)
    // Пины 0-7 для координат, Пин 10 для SELECT
    PortInit.PORT_OE = PORT_OE_IN;
    PortInit.PORT_Pin = 0xFF | PORT_Pin_10; 
    PORT_Init(MDR_PORTC, &PortInit);
    
    // 4. Таймер SysTick
    SysTick->LOAD = (8000000/1000) - 1;
    SysTick->VAL = 0;
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
    
    PORT_Write(MDR_PORTA, 0xFF); // Гасим всё сразу

    while(1) {
        // Проверяем кнопку SELECT (пин 10)
        // Если кнопка при нажатии дает 0 (как и светодиоды), используй == 0
        if (PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_10) == 0) {
            
            uint32_t port_val = PORT_ReadInputData(MDR_PORTC);
            
            // Получаем X (биты 0-3) и Y (биты 4-7)
            int x = Get_Coord(port_val & 0x0F);
            int y = Get_Coord((port_val >> 4) & 0x0F);

            // ПРОВЕРКА УСЛОВИЯ (Вариант 8)
            // 1. Вне круга R=2: (x*x + y*y >= 4)
            // 2. В прямоугольнике: x от -4 до 4, y от -3 до 3
            // 3. 2-я или 4-я четверть: (x*y <= 0)
            
            if ( ((x*x + y*y) >= 4) && 
                 (x >= -4 && x <= 4) && 
                 (y >= -3 && y <= 3) && 
                 (x * y <= 0) ) 
            {
                Blink(1); // ПОПАЛ
            } else {
                Blink(2); // НЕ ПОПАЛ
            }
            
            // Ждем, пока отпустят SELECT, чтобы не срабатывало по кругу
            while(PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_10) == 0);
        }
    }
}