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; // Сброс значений для нового ввода
}
}
}