#include "MDR32Fx.h"
#include "MDR32F9Qx_port.h"
#include "MDR32F9Qx_rst_clk.h"
// Настройка портов (зависит от вашей отладочной платы, обычно PORTA/PORTB - LED, PORTE/PORTC - KEY)
// Предположим: LED1-LED8 на PORTA (0-7), KEY1-KEY8 на PORTB (0-7), SELECT на PORTC (0)
void Delay_ms(uint32_t ms);
volatile uint32_t ms_tick = 0;
void SysTick_Handler(void) { ms_tick++; }
// Функция преобразования кнопок в число со знаком
int8_t GetCoord(uint32_t keys) {
int8_t val = (keys & 0x07); // Младшие 3 бита - значение
if (keys & 0x08) val = -val; // 4-й бит - знак
return val;
}
void BlinkLEDs(int times) {
for (int i = 0; i < times; i++) {
PORT_Write(MDR_PORTA, 0x00FF); // Включить все LED
Delay_ms(300);
PORT_Write(MDR_PORTA, 0x0000); // Выключить
Delay_ms(300);
}
}
int main(void) {
// Включение тактирования
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTB | RST_CLK_PCLK_PORTC, ENABLE);
PORT_InitTypeDef PortInit;
PORT_StructInit(&PortInit);
// Настройка LED (PORTA 0-7) на выход
PortInit.PORT_Pin = 0x00FF;
PortInit.PORT_OE = PORT_OE_OUT;
PORT_Init(MDR_PORTA, &PortInit);
// Настройка KEY (PORTB 0-7) на вход
PortInit.PORT_Pin = 0x00FF;
PortInit.PORT_OE = PORT_OE_IN;
PORT_Init(MDR_PORTB, &PortInit);
// Настройка кнопки SELECT (PORTC 0) на вход
PortInit.PORT_Pin = PORT_Pin_0;
PORT_Init(MDR_PORTC, &PortInit);
// Инициализация SysTick
SysTick_Config(8000000 / 1000);
while (1) {
// Ожидание нажатия SELECT
if (PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == 0) {
Delay_ms(50); // Антидребезг
// Считываем состояние кнопок
uint32_t all_keys = PORT_ReadInputData(MDR_PORTB) & 0xFF;
int x = GetCoord(all_keys & 0x0F); // KEY1-4
int y = GetCoord((all_keys >> 4) & 0x0F); // KEY5-8
// Проверка условий попадания
int in_square = (x >= -3 && x <= 3 && y >= -3 && y <= 3);
int out_circle1 = ((x + 3)*(x + 3) + (y - 3)*(y - 3) >= 9);
int out_circle2 = ((x - 3)*(x - 3) + (y + 3)*(y + 3) >= 9);
if (in_square && out_circle1 && out_circle2) {
BlinkLEDs(1); // Попал - 1 раз
} else {
BlinkLEDs(2); // Не попал - 2 раза
}
// Ждем отпускания кнопки
while(PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == 0);
}
}
}
void Delay_ms(uint32_t ms) {
uint32_t start = ms_tick;
while ((ms_tick - start) < ms);
}