Обзор
Крестики-нолики - это игра по сетке 3 на 3, похожая на гобанг. Он получил свое название, потому что доска обычно не рисует границ, а линии сетки расположены в крестики-нолики. Инструменты, необходимые для игры, - только бумага и ручка. Затем два игрока, представляющие O и X, по очереди оставляют отметки на сетке. Любые три отметки образуют прямую линию, которая и является победителем.
В этой статье используется микроконтроллер STM32 и ЖК-дисплей STONE для разработки простой игры в крестики-нолики.
Материалы, необходимые для эксперимента
Системный принцип
Укажите, что первое нажатие на экране должно быть O, второе касание на экране - X, выполняется этот цикл. Установите 8 массивов для хранения количества O и X в каждой строке, столбце и диагонали каждой сетки, пока есть три одинаковых знака, это победа, тогда будет мигающий красный квадрат, чтобы доказать победу строку, столбец или диагональ, а затем нажмите «Сброс», чтобы снова начать игру.
Ниже приводится блок-схема:
Аппаратная часть системы ЖК-дисплеев STM32 и STONE
(A) КАМЕННЫЙ ЖК-дисплей
- Аппаратный дизайн «Крестики-нолики»
Используйте ЖК-дисплей STONE от Beijing STONE Technology co., Ltd, модель - STWI070WT-01, со встроенным TFT-дисплеем и сенсорным контроллером.
- 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 |
Дисплей | |
Тип Backlight | LED |
яркость | 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 |
Интерфейс Ethernet | 10 м / 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.
Семейство 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 и копирует исполняемый файл на экран.
Сначала создайте новый проект, как показано ниже.
Во-вторых, импортируйте все изображения в ресурс
Затем установите кнопки управления для каждой сетки и сделайте кнопки невидимыми.
Не забудьте установить кнопку сброса!
Готовый эффект показан ниже:
После этого аналогичным образом добавьте элементы управления изображениями в каждую сетку и установите для них белые изображения.
Наконец, добавьте элемент управления gif и сделайте его невидимым.
Части готового эффекта показаны ниже:
Принципиальная схема подключения
Совместное использование кода
/* Включает в себя ----------------------*/
#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 ***** КОНЕЦ ФАЙЛА **** /
Окончательные результаты показывают
Источник: Plato Data Intelligence.