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


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_PORTF->RXTX = 0xFF; 
        Delay(1000000);
        MDR_PORTF->RXTX = 0x00; 
        Delay(1000000);
    }
}

int main(void) {
    // Тактирование F (LED), E и B (Buttons)
    RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTF | RST_CLK_PCLK_PORTE | RST_CLK_PCLK_PORTB, ENABLE);

    PORT_InitTypeDef PortInit;
    PORT_StructInit(&PortInit);

    // Светодиоды LED1-8
    PortInit.PORT_Pin   = 0xFF;
    PortInit.PORT_OE    = PORT_OE_OUT;
    PortInit.PORT_MODE  = PORT_MODE_DIGITAL;
    PORT_Init(MDR_PORTF, &PortInit);

    // Кнопки (Входы)
    PortInit.PORT_OE    = PORT_OE_IN;
    PORTInit.PORT_Pin   = 0xFF; 
    PORT_Init(MDR_PORTE, &PortInit);
    PORT_Init(MDR_PORTB, &PortInit);

    float x = 0, y = 0;
    int sign_x = 1, sign_y = 1;

    while (1) {
        // --- Ввод X (Port E) ---
        if (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_0) == 0) x = 1;
        if (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_1) == 0) x = 2;
        if (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_2) == 0) x = 4;
        // KEY4 (Pin 3) - Знак X: если нажата, то минус
        if (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_3) == 0) sign_x = -1; 
        else sign_x = 1;

        // --- Ввод Y (Port B) ---
        if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_0) == 0) y = 1;
        if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_1) == 0) y = 2;
        if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_2) == 0) y = 4;
        // KEY8 (Pin 3) - Знак Y
        if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_3) == 0) sign_y = -1;
        else sign_y = 1;

        // --- Проверка по нажатию SELECT (Pin 4 на Port E) ---
        if (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_4) == 0) {
            float final_x = x * sign_x;
            float final_y = y * sign_y;
            float abs_x = (final_x < 0) ? -final_x : final_x;

            // Условия из графика:
            // 1. Модуль x не больше 4
            // 2. y ниже верхней линии: y <= -0.5 * |x| + 4
            // 3. y выше нижней линии: y >= 0.5 * |x|
            if ((abs_x <= 4.0f) && 
                (final_y <= (-0.5f * abs_x + 4.0f)) && 
                (final_y >= (0.5f * abs_x))) 
            {
                Blink(1); // Попал!
            } else {
                Blink(2); // Мимо
            }
            
            // Защита от дребезга и повторного срабатывания
            while(PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_4) == 0);
            x = 0; y = 0; // Сброс значений для нового ввода
        }
    }
}