#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);
}
// Функция моргания (0x00 - включить все светодиоды на PORTA)
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. ВКЛЮЧАЕМ ТАКТИРОВАНИЕ (Добавил PORTB!)
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA | RST_CLK_PCLK_PORTB | 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. Настройка кнопок (PORTB и PORTC - Вход)
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_Pin = PORT_Pin_All;
PORT_Init(MDR_PORTB, &PortInit); // Координаты X и Y здесь
PORT_Init(MDR_PORTC, &PortInit); // SELECT здесь
// 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); // Погасить всё
float x = 0, y = 0;
while (1) {
// Считывание X (KEY1-KEY4 на PORTB пины 0-3)
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_0) == 0) x = -4.0f;
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_1) == 0) x = -2.0f;
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_2) == 0) x = 2.0f;
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_3) == 0) x = 4.0f;
// Считывание Y (KEY5-KEY8 на PORTB пины 4-7)
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_4) == 0) y = -3.0f;
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_5) == 0) y = -1.0f;
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_6) == 0) y = 1.0f;
if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_7) == 0) y = 3.0f;
// Нажатие SELECT (PORTC пин 0)
if (PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == 0) {
// ПРОВЕРКА ВАРИАНТА №8:
// Вне круга R=2 и (2-я или 4-я четверть)
if ( ((x*x + y*y) >= 4.0f) && (x * y <= 0) )
{
Blink(1); // Попал
}
else
{
Blink(2); // Не попал
}
// Ждем отпускания кнопки SELECT
while(PORT_ReadInputDataBit(MDR_PORTC, PORT_Pin_0) == 0);
}
}
} // Вот эта скобка закрывает main!