int32_t x, y;
while (1) {
// 1. Читаем кнопки (нажато = 1)
uint32_t buttons = ~MDR_PORTB->RXTX & 0xFF;
// Декодируем X (PB0=4, PB1=2, PB2=1, PB3=S)
x = 0;
if (buttons & (1 << 0)) x += 4;
if (buttons & (1 << 1)) x += 2;
if (buttons & (1 << 2)) x += 1;
if (buttons & (1 << 3)) x = -x; // Знак
// Декодируем Y (PB4=4, PB5=2, PB6=1, PB7=S)
y = 0;
if (buttons & (1 << 4)) y += 4;
if (buttons & (1 << 5)) y += 2;
if (buttons & (1 << 6)) y += 1;
if (buttons & (1 << 7)) y = -y; // Знак
// 2. Ждем нажатия SELECT (PC0)
if ((MDR_PORTC->RXTX & PORT_Pin_0) == 0) {
// ПРОВЕРКА 1: Внутри ли мы квадрата [-3, 3]?
if (x >= -3 && x <= 3 && y >= -3 && y <= 3) {
// Считаем квадраты расстояний до центров "вырезов"
// Формула: (x - x0)^2 + (y - y0)^2
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)
// ПРОВЕРКА 2: Вне ли мы кругов радиусом 3 (R^2 = 9)?
// На картинке заштриховано то, что ВНЕ этих кругов.
if (d1 > 9 && d2 > 9) {
Blink(1); // ПОПАЛ
} else {
Blink(2); // МИМО (попал в вырез)
}
} else {
// Если мы здесь, значит x или y больше 3 или меньше -3
Blink(2);
}
// Ждем отпускания кнопки
while ((MDR_PORTC->RXTX & PORT_Pin_0) == 0);
Delay(200000);
}
}