IOT

Игра в крестики-нолики на основе STONE TFT LCD и STM32

Обзор

Крестики-нолики - это игра по сетке 3 на 3, похожая на гобанг. Он получил свое название, потому что доска обычно не рисует границ, а линии сетки расположены в крестики-нолики. Инструменты, необходимые для игры, - только бумага и ручка. Затем два игрока, представляющие O и X, по очереди оставляют отметки на сетке. Любые три отметки образуют прямую линию, которая и является победителем.

В этой статье используется микроконтроллер STM32 и ЖК-дисплей STONE для разработки простой игры в крестики-нолики.

Материалы, необходимые для эксперимента

Системный принцип

Укажите, что первое нажатие на экране должно быть O, второе касание на экране - X, выполняется этот цикл. Установите 8 массивов для хранения количества O и X в каждой строке, столбце и диагонали каждой сетки, пока есть три одинаковых знака, это победа, тогда будет мигающий красный квадрат, чтобы доказать победу строку, столбец или диагональ, а затем нажмите «Сброс», чтобы снова начать игру.

Ниже приводится блок-схема:

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Аппаратная часть системы ЖК-дисплеев STM32 и STONE

(A) КАМЕННЫЙ ЖК-дисплей

  1. Аппаратный дизайн «Крестики-нолики»

Используйте ЖК-дисплей STONE от Beijing STONE Technology co., Ltd, модель - STWI070WT-01, со встроенным TFT-дисплеем и сенсорным контроллером.

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
  1.  STVC070WT-01 Особенности продукта
Физический параметр 
Размер7 дюйма
Постановления800 × RGB × 480
Расстояние между пикселями0.0642 (Ш) × 0.1790 (В) мм
Цвет262,144 цветов (18 бит)
Зона просмотра154.08 (Ш) × 85.92 (В) мм
Размер дисплея186.4mmx105.5mm
Габаритный размер186.4 x 105.5 x 17.4 мм (стандартный) 186.4 x 105.5 x 23.8 мм (с портом Ethernet)
вес нетто300g
Дисплей 
Тип BacklightLED
яркость300 кд / м2 (100 уровней яркости)
контраст500:1
Подсветка жизни300,000 часа
Угол обзора70 ° / 70 ° / 50 ° / 70 ° (L / R / U / D)
Панель TFTПромышленная панель класса A
Сенсорный экран4-проводное сенсорное прикосновение / емкостное касание / без сенсорного экрана
Режим экрана:Цифровое
процессор 
ЦПCortex A8
Частота обновления1G Гц
Максимальная частота кадров60 FPS
Интерфейс 
Последовательный интерфейсУровень RS232 / RS422 / RS485 / TTL
Интерфейс Ethernet10 м / 100 м (необязательно)
Беспроводной интерфейсWi-Fi / Bluetooth (опционально)
Скачивание файла проектаПорт USB2.0 или диск для хранения U
Напряжение питания 
Номинальное напряжение+12 В постоянного тока или +5 В постоянного тока
Допустимый диапазон напряжения+ 7 В постоянного тока… + 28 В постоянного тока или + 5 В постоянного тока
Максимум. допустимые переходные процессы+ 28V
Время между двумя переходными процессамиМинимум 50 секунд
Внутренний предохранительПредохранитель самовосстановления 2А
Потребляемая мощность3.0 W
Условия окружающей среды 
Максимум. допустимая температура окружающей средыОперацияХранение-20 ℃ + 70 ℃ -30 + 80 ℃
Относительная влажностьОперацияХранение55 ℃, 85%, 60 ℃, 90%
Ударная нагрузкаОперацияХранение15 г / 11 мс 25 г / 6 мс
вибрацияОперацияХранение0.035 мм (10 - 58 Гц) / 1 g (58 - 500 Гц) 3.5 мм (5 - 8,5 Гц) / 1 g (8.5 - 500 Гц)
Барометрическое давлениеОперацияХранениеОт 706 до 1030 гПа от 581 до 1030 гПа
Невосприимчивость к шуму 
Статический разряд (контактный разряд / воздушный разряд)EN 61000-4-2 6 кВ / 8 кВ
Радиочастотное облучениеEN 61000-4-310 В / м, 80% AM1 кГц
Импульсная модуляцияENV 50204900 МГц ± 5 МГц 10 В / мэфф., ПВ 50%, 200 Гц
RF проводимостьEN 61000-4-6150 80 кГц - 10 МГц 80 В, 1% AM, XNUMX кГц
Вспышки помех Линии питания Линии обработки данных Линии сигналаEN 61000-4-42kV2kV1kV
Устройство поддержки 
Порт UARTПоддержка RS232 / RS422 / RS485 / TTL
Сетевой портПоддержка Ethernet-порта / Wi-Fi / Bluetooth
Флэш-памятьSupportStandard 256MB, расширение 1GB или 2GB
ЗуммерПоддержка
RTCПоддержка
USB-портПоддержка онлайн-загрузки с помощью USB-кабеля
Интерфейс U-накопителя с дискомПоддержка: загрузка или копирование данных пользователя офлайн
Сенсорный экран4-проводное сопротивление / емкостный
Векторный шрифтСтандартный формат TTF
Фото товараПоддержка форматов PNG / JPG / BMP / SVG / GIF
Аудио интерфейсПоддержка формата WAV Длина одного аудиофайла не ограничена, теоретически до 4096 аудиофайлов, мощность динамика составляет 8 Ом 2 Вт или 4 Ом 3 Вт
Набор командУнифицированные упрощенные наборы команд
Память 
Флэш-памятьСтандартный 256 МБ, расширение 1 ГБ или 2 ГБ
Объем памяти для изображенияВ зависимости от возможностей изображения предложите формат «PNG, BMP, JPG, SVG, GIF».

(B) Плата STM32

При использовании платы STM32 микросхема STM32 - CKS32F303.

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Семейство STM32 ядер ARM Cortex-M0, M0 +, M3, M4 и M7 предназначено для встраиваемых приложений, требующих высокой производительности, низкой стоимости и низкого энергопотребления.

  • Источник питания 2.0-3.6 В
  • Контакты ввода / вывода, совместимые с напряжением 5 В
  • Отличный безопасный режим часов
  • Режим низкого энергопотребления с функцией пробуждения
  • Внутренний RC-генератор
  • Встроенная схема сброса
  • Диапазон рабочих температур.
  • От -40 ° C до + 85 ° C или 105 ° C

Разработка системного программного обеспечения

Процесс разработки ЖК-дисплеев STM32 и STONE

1: создайте проект и загрузите в него нужные картинки.

2: использовать программное обеспечение Stone-Designer для создания динамически связанных отношений; основные элементы управления: «Кнопка», «изображение»;

3: программное моделирование и компиляция для создания исполняемых файлов.

4: ЖК-дисплей подключается к ПК через USB и копирует исполняемый файл на экран.

Сначала создайте новый проект, как показано ниже.

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Во-вторых, импортируйте все изображения в ресурс

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Затем установите кнопки управления для каждой сетки и сделайте кнопки невидимыми. 

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Не забудьте установить кнопку сброса!

Готовый эффект показан ниже:

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

После этого аналогичным образом добавьте элементы управления изображениями в каждую сетку и установите для них белые изображения.

Наконец, добавьте элемент управления gif и сделайте его невидимым.

Части готового эффекта показаны ниже:

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Принципиальная схема подключения

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Совместное использование кода

/* Включает в себя ----------------------*/ 

#include «stm32f0xx_hal.h» 

#include «Uart.h» 

#include «string.h» 

#include «ws2812.h» 

#include «IWDG.h» 

RGB_COLOR USER_RGB_COLOR; 

беззнаковый символ TX_Mode = 1; // Бит флага типа передачи 1: 232 0: TTL 

беззнаковый символ BLINK_2 = 0; 

беззнаковый символ RX3_BUF [32]; // Настраиваемый трехуровневый буфер приема 

#определить КНОПКА1 0x81 

#определить КНОПКА2 0x82 

#определить КНОПКА3 0x83 

#определить КНОПКА4 0x84 

#определить КНОПКА5 0x85 

#определить КНОПКА6 0x86 

#определить КНОПКА7 0x87 

#определить КНОПКА8 0x88 

#определить КНОПКА9 0x89 

#определить КНОПКА0 0x8A 

#define ОЧИСТИТЬ 0x8E 

беззнаковый int r_flag1 = 0; 

целое число без знака [4] [2] = {0}; 

беззнаковый int cha [4] [2] = {0}; 

беззнаковый int quan_hang1 = 0; 

беззнаковый int quan_hang2 = 0; 

беззнаковый int quan_hang3 = 0; 

беззнаковый int quan_lie1 = 0; 

беззнаковый int quan_lie2 = 0; 

беззнаковый int quan_lie3 = 0; 

беззнаковый int quan_zuoxia = 0; 

беззнаковый int quan_youxia = 0; 

беззнаковый int cha_hang1 = 0; 

беззнаковый int cha_hang2 = 0; 

беззнаковый int cha_hang3 = 0; 

беззнаковый int cha_lie1 = 0; 

беззнаковый int cha_lie2 = 0; 

беззнаковый int cha_lie3 = 0; 

беззнаковый int cha_zuoxia = 0; 

беззнаковый int cha_youxia = 0; // беззнаковый int r_flag10 = 0; 

void SystemClock_Config (недействительно); 

void Error_Handler (недействителен); 

статическая пустота MX_GPIO_Init (void); 

int main (void) 

uint8_t color_buf = 0; 

// Выбор функции 

/ * Сброс всех периферийных устройств, Инициализирует интерфейс Flash и Systick. * / 

HAL_Init (); 

/ * Настраиваем системные часы * / 

SystemClock_Config (); 

/ * Инициализировать все настроенные периферийные устройства * / 

MX_GPIO_Init (); 

TX_Mode = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4); 

если (TX_Mode) 

MX_USART1_UART_Init (); 

// 232 Инициализация 

еще 

MX_USART1_UART_Init2 (); 

// Инициализация TTl 

в то время как (1) 

если (TX_Mode! = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)) 

HAL_NVIC_SystemReset (); 

// Перестановка перемычки, перезагрузка и повторная инициализация 

если (MNG_USART1.RX_OVER_FLG == TRUE) 

// 

Бит флага приема последовательных данных 

RX3_BUF [0] = MNG_USART1.RX_BUF [7]; 

// Метод 2: получить имя элемента управления фиксированной длины 

RX3_BUF [1] = MNG_USART1.RX_BUF [8]; 

RX3_BUF [2] = MNG_USART1.RX_BUF [9]; 

RX3_BUF [3] = MNG_USART1.RX_BUF [10]; 

RX3_BUF [4] = MNG_USART1.RX_BUF [11]; 

RX3_BUF [5] = MNG_USART1.RX_BUF [12]; 

RX3_BUF [6] = MNG_USART1.RX_BUF [13]; 

//RX3_BUF [7 ]=MNG_USART1.RX_BUF [14]; 

если ((strcmp («button1», (const char *) RX3_BUF)) == 0) 

// Выбираем элемент управления

color_buf = КНОПКА1; 

}

если ((strcmp («button2», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА2; 

}

если ((strcmp («button3», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА3; 

}

если ((strcmp («button4», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА4; 

}

если ((strcmp («button5», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА5; 

}

если ((strcmp («button6», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА6; 

}

если ((strcmp («button7», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА7; 

}

если ((strcmp («button8», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА8; 

}

если ((strcmp («button9», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА9; 

}

если ((strcmp («button0», (const char *) RX3_BUF)) == 0) 

color_buf = КНОПКА0; 

}

переключатель (color_buf) 

чехол BUTTON1: 

// если (r_flag1 == 0) 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

r_flag1 ^ = 1; 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image2 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_flag1 ^ = 1; 

quan_hang1 ++; 

quan_lie1 ++; 

quan_youxia ++;  

// memset (RX3_BUF, 0,7); 

//memset(MNG_USART1.RX_BUF,0,USART1_RX_LEN); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image2 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang1 ++; 

cha_lie1 ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

// r_flag1 = 1; 

перерыва; 

чехол BUTTON2: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image3 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang1 ++; 

quan_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image3 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang1 ++; 

cha_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON3: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image4 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang1 ++; 

quan_lie3 ++; 

quan_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image4 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang1 ++; 

cha_lie3 ++; 

cha_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON4: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image5 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang2 ++; 

quan_lie1 ++; 

// memset (RX3_BUF, 0,7); 

// r_flag10 = 1; 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image5 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang2 ++; 

cha_lie1 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON5: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image6 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang2 ++; 

quan_lie2 ++; 

quan_zuoxia ++; 

quan_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image6 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang2 ++; 

cha_lie2 ++; 

cha_zuoxia ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON6: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image7 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang2 ++; 

quan_lie3 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02))

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image7 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang2 ++; 

cha_lie3 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON7: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image8 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang3 ++; 

quan_lie1 ++; 

quan_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image8 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang3 ++; 

cha_lie1 ++; 

cha_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON8: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image9 \ ", \" image \ ": \" круг \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang3 ++; 

quan_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image9 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang3 ++; 

cha_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON9: 

если ((r_flag1 == 0) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image10 \ ", \" image \ ": \" круг \ ”}> ET”);

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 1; 

quan_hang3 ++; 

quan_lie3 ++; 

quan_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

иначе, если ((r_flag1 == 1) && (MNG_USART1.RX_BUF [14] == 0x02)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image10 \ ", \" image \ ": \" x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

р_флаг1 = 0; 

cha_hang3 ++; 

cha_lie3 ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = ОЧИСТИТЬ; 

}

перерыва; 

чехол BUTTON0: 

р_флаг1 = 0; 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image2 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image3 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image4 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image5 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image6 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image7 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image8 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image9 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1);

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_image \ », \" type \ ": \" image \ ", \" widget \ ": \" image10 \ ", \" image \ ": \" bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif4 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif5 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif6 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif7 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif8 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif9 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif10 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \" set_visible \ ", \" type \ ": \" widget \ ", \" widget \ ": \" gif11 \ ", \" visible \ ": false}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

// memset (RX3_BUF, 0,7); 

memset (MNG_USART1.RX_BUF, 0, USART1_RX_LEN); 

перерыва; 

по умолчанию: 

MNG_USART1.RX_OVER_FLG = ЛОЖЬ; 

перерыва; 

}

////////////////////////////////////////////////// ////////////////// 

если ((quan_hang1 == 3) || (cha_hang1 == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif4 \ », \" visible \ ": true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

}

иначе если ((quan_hang2 == 3) || (cha_hang2 == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif5 \ », \" visible \ ": true}> ET ”);

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

}

иначе если ((quan_hang3 == 3) || (cha_hang3 == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif6 \ », \" visible \ ": true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

}

иначе если ((quan_lie1 == 3) || (cha_lie1 == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif7 \ », \" visible \ ": true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

}

иначе если ((quan_lie2 == 3) || (cha_lie2 == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif8 \ », \" visible \ ": true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

}

иначе если ((quan_lie3 == 3) || (cha_lie3 == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif9 \ », \" visible \ ": true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

}

иначе если ((quan_zuoxia == 3) || (cha_zuoxia == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif11 \ », \" visible \ ": true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

}

иначе если ((quan_youxia == 3) || (cha_youxia == 3)) 

memset (MNG_USART1.TX_BUF, 0, USART1_TX_LEN); 

sprintf ((char *) MNG_USART1.TX_BUF, 

«ST <{\» cmd_code \ »: \» set_visible \ », \« type \ »: \« widget \ », \« widget \ »: \» gif10 \ », \" visible \ ": true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((const char *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

quan_hang1=quan_hang2=quan_hang3=cha_hang1=cha_hang2=cha_hang3=0; 

quan_lie1=quan_lie2=quan_lie3=cha_lie1=cha_lie2=cha_lie3=0; 

quan_zuoxia = quan_youxia = cha_zuoxia = cha_youxia = 0; 

MNG_USART1.RX_OVER_FLG = ЛОЖЬ; 

}

/ ** Конфигурация системных часов 

*/

недействительным SystemClock_Config (недействительным) 

RCC_OscInitTypeDef RCC_OscInitStruct; 

RCC_ClkInitTypeDef RCC_ClkInitStruct; 

RCC_PeriphCLKInitTypeDef PeriphClkInit; 

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; 

RCC_OscInitStruct.HSIState = RCC_HSI_ON; 

RCC_OscInitStruct.HSICalibrationValue = 16; 

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; 

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; 

RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; 

если (HAL_RCC_OscConfig (& RCC_OscInitStruct)! = HAL_OK) 

Error_Handler (); 

}

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK 

| RCC_CLOCKTYPE_PCLK1; 

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLLCLK; 

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 

если (HAL_RCC_ClockConfig (& RCC_ClkInitStruct, FLASH_LATENCY_1)! = HAL_OK) 

Error_Handler (); 

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; 

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; 

если (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit)! = HAL_OK) 

Error_Handler (); 

}

HAL_SYSTICK_Config (HAL_RCC_GetHCLKFreq () / 1000); 

HAL_SYSTICK_CLKSourceConfig (SYSTICK_CLKSOURCE_HCLK); 

/ * Конфигурация прерывания SysTick_IRQn * / 

HAL_NVIC_SetPriority (SysTick_IRQn, 0, 0); 

}

/ ** Конфигурация распиновки 

*/

static void MX_GPIO_Init (void) 

GPIO_InitTypeDef GPIO_InitStruct; 

/ * Включение синхронизации портов GPIO * / 

__HAL_RCC_GPIOA_CLK_ENABLE (); 

GPIO_InitStruct.Pin = GPIO_PIN_7; 

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 

GPIO_InitStruct.Pull = GPIO_PULLDOWN; 

GPIO_InitStruct.Speed ​​= GPIO_SPEED_FREQ_HIGH; 

HAL_GPIO_Init (GPIOA, & GPIO_InitStruct); 

GPIO_InitStruct.Pin = GPIO_PIN_4; 

GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 

GPIO_InitStruct.Pull = GPIO_PULLUP; 

GPIO_InitStruct.Speed ​​= GPIO_SPEED_FREQ_HIGH; 

HAL_GPIO_Init (GPIOA, & GPIO_InitStruct); 

}

/ * НАЧАЛО КОДА ПОЛЬЗОВАТЕЛЯ 4 * /

/ * КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ 4 * / 

/ **

* @brief Эта функция выполняется в случае возникновения ошибки. 

* @param Нет 

* @retval Нет 

*/ 

void Error_Handler (недействителен) 

/ * КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ Error_Handler * / 

/ * Пользователь может добавить свою собственную реализацию, чтобы сообщать о состоянии возврата ошибки HAL * / 

в то время как (1) 

{

}

/ * КОД ПОЛЬЗОВАТЕЛЯ END Error_Handler * / 

}

#ifdef USE_FULL_ASSERT 

/ **

* @brief Сообщает имя исходного файла и номер строки исходного текста. 

* где произошла ошибка assert_param. 

* @param file: указатель на имя исходного файла 

* @param line: номер источника строки ошибки assert_param 

* @retval Нет 

*/ 

void assert_failed (файл uint8_t *, строка uint32_t) 

/ * НАЧАЛО КОДА ПОЛЬЗОВАТЕЛЯ 6 * / 

/ * Пользователь может добавить свою собственную реализацию, чтобы сообщить имя файла и номер строки, 

пример: printf («Неверное значение параметров: файл% s в строке% d \ r \ n», файл, строка) * / 

/ * КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ 6 * / 

}

#endif 

/ **

* @} 

*/ 

/ **

* @} 

*/

/ ************************ (C) АВТОРСКИЕ ПРАВА STMicroelectronics ***** КОНЕЦ ФАЙЛА **** /

Окончательные результаты показывают

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Источник: Plato Data Intelligence.