IOT

Juego de tic-tac-toe basado en STONE TFT LCD y STM32

Resumen

Tic-tac-toe es un juego que se juega en una cuadrícula de 3 por 3, similar al gobang. Recibe su nombre porque el tablero generalmente no dibuja bordes y las líneas de la cuadrícula están dispuestas en tic-tac-toe. Las herramientas necesarias para el juego son solo papel y bolígrafo. Luego, dos jugadores que representan a O y X se turnan para dejar marcas en la cuadrícula. Cualesquiera tres marcas forman una línea recta, que es la ganadora.

Este artículo utiliza el microcontrolador STM32 y la pantalla LCD STONE para desarrollar un simple juego de tic-tac-toe.

Materiales necesarios para el experimento

El principio del sistema

Especifique que el primer toque en la pantalla debe ser O, el segundo toque en la pantalla es X, ha estado haciendo este ciclo. Establezca 8 matrices para almacenar el número de O y X en cada fila, columna y diagonal de cada cuadrícula, siempre que haya tres de la misma marca es la victoria, entonces habrá un cuadro rojo parpadeante para demostrar la victoria de la fila, columna o diagonal, y luego toque reiniciar para comenzar el juego nuevamente.

El siguiente es el diagrama de flujo:

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Diseño de hardware del sistema de pantalla LCD STM32 y STONE

(A) Pantalla LCD PIEDRA

  1. Diseño de hardware de "juego de tic-tac-toe"

Utilice la pantalla LCD STONE de Beijing STONE Technology co., Ltd, el modelo es STWI070WT-01, con una pantalla TFT integrada y un controlador táctil.

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.
  1.  STVC070WT-01 Características del producto
Parámetro físico 
Tamaño7 pulgadas
Resolución800 × RGB × 480
Espaciado de píxeles0.0642 (ancho) × 0.1790 (alto) mm
Color262,144 colores (18 bits)
Área de visualización154.08 (ancho) × 85.92 (alto) mm
pantalla Dimensión186.4mmx105.5mm
Dimensión total186.4 mm x 105.5 mm x 17.4 mm (tipo estándar) 186.4 mm x 105.5 mm x 23.8 mm (con puerto Ethernet)
Peso neto300g
Pantalla 
Tipo de luz de fondoLED
Brillo300 cd/m2 (el brillo se puede ajustar en 100 niveles)
Comparación500:1
Vida de luz de fondo300,000 horas
Ángulo de visión70 ° / 70 ° / 50 ° / 70 ° (L / R / U / D)
Panel TFTUn panel industrial de clase
Touch ScreenResistencia táctil de 4 hilos/táctil capacitivo/sin pantalla táctil
Modo de pantalla:Recursos
Procesador 
CPUCortex A8
Frecuencia de actualización1G Hz
Frecuencia de imagen máxima60 FPS
Interfaz 
Interfaz serieNivel RS232 / RS422 / RS485 / TTL
Interfaz Ethernet10M / 100M (opcional)
Interfaz inalámbricaWi-Fi / Bluetooth (opcional)
Descarga de archivos de proyectoPuerto USB2.0 o disco de almacenamiento U
Fuente de Energía 
Tensión nominal+ 12V DC o + 5V DC
Rango de voltaje admisible+ 7 V CC… + 28 V CC o + 5 V CC
Max. transitorios permitidos+ 28V
Tiempo entre dos transitorios50 segundos mínimo
Fusible internoFusible de recuperación automática 2A
Consumo de energía3.0 W
Condiciones ambientales 
Max. temperatura ambiente permitidaOperaciónAlmacenamiento-20 ℃ ~ +70 ℃ -30 ℃ ~ +80 ℃
Humedad relativaOperaciónAlmacenamiento55 ℃, 85 % 60 ℃, 90 %
Carga de choqueOperaciónAlmacenamiento15 g/11 ms25 g/6 ms
VibraciónOperaciónAlmacenamiento0.035 mm (10 – 58 Hz)/ 1 g (58 – 500 Hz) 3.5 mm (5 – 8,5 Hz)/ 1 g (8.5 – 500 Hz)
Presión barométricaOperaciónAlmacenamiento706 a 1030 hPa 581 a 1030 hPa
Inmunidad al ruido 
Descarga estática (descarga de contacto/descarga de aire)EN 61000-4-2 6 kV / 8 kV
Irradiación RFEN 61000-4-310 V/m, 80 % AM1 kHz
Modulación de pulsoENV 50204900 MHz ±5 MHz10 V/meff., 50% ED, 200 Hz
Conducción de RFEN 61000-4-6150 kHz – 80 MHz10 V, 80 % AM, 1 kHz
Interferencia de ráfaga Líneas de suministro Líneas de datos de proceso Líneas de señalEN 61000-4-42kV2kV1kV
Dispositivo de soporte 
Puerto UARTSoporte RS232 / RS422 / RS485 / TTL
Puerto de redSoporte Puerto Ethernet / Wi-Fi / Bluetooth
Memoria flashSupportStandard 256MB, Extend 1GB o 2GB
ZumbadorSoporte
RTCSoporte
Puerto USBSoporteDescarga en línea por cable USB
Interfaz de disco de almacenamiento USupport.Offline Descargar o copiar datos de usuario
Touch ScreenResistencia de 4 cables / capacitiva
Fuente vectorialFormato TTF estándar
ImagenSoporta formato PNG / JPG / BMP / SVG / GIF
Interfaz de audioAdmite formato WAV La longitud de un solo archivo de audio no está limitada, teóricamente hasta 4096 archivos de audio, la potencia del altavoz es de 8 ohmios 2 vatios o 4 ohmios 3 vatios
Conjunto de comandosConjuntos de comandos unificados y simplificados
Salud Cerebral 
Memoria flashEstándar de 256 MB, extensión de 1 GB o 2 GB
Cantidad de memoria para imagenSegún la capacidad de la imagen, sugiera el formato “PNG, BMP, JPG, SVG, GIF”.

(B) Tablero STM32

Usando una placa STM32, el chip del STM32 es CKS32F303.

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

La familia STM32 de núcleos ARM Cortex-M0, M0 +, M3, M4 y M7 está diseñada para aplicaciones integradas que requieren alto rendimiento, bajo costo y bajo consumo de energía.

  • Fuente de alimentación 2.0V-3.6V
  • Pines de E / S compatibles con 5V
  • Excelente modo de reloj seguro
  • Modo de bajo consumo con función de despertador
  • Oscilador RC interno
  • Circuito de reinicio integrado
  • Rango de temperatura de funcionamiento.
  • -40 ° C a + 85 ° C o 105 ° C

Diseño de software del sistema

El proceso de desarrollo de la pantalla LCD STM32 y STONE

1: cree el proyecto y cargue las imágenes requeridas en el proyecto.

2: utilizar el software Stone-designer para crear relaciones asociadas dinámicamente; los controles principales son: “Botón”, “imagen”;

3: simulación y compilación de software para generar archivos ejecutables.

4: la pantalla LCD se conecta a la PC a través de USB y copia el archivo ejecutable a la pantalla.

Primero cree un nuevo proyecto como se muestra a continuación.

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.
Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

En segundo lugar, importe todas las imágenes al recurso.

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Luego, configure los controles de los botones en cada cuadrícula y haga que los botones sean invisibles. 

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

¡No olvide configurar el botón de reinicio!

El efecto final se muestra a continuación:

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Después de eso, agregue controles de imagen a cada cuadrícula de la misma manera y configúrelos a todos en imágenes en blanco.

Finalmente agregue el control gif y configúrelo en invisible.

Las partes del efecto terminado se muestran a continuación:

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.
Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.
Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.
Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Diagrama de conexión del circuito

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Compartir código

/ * Incluye —————————————————————— * / 

#include "stm32f0xx_hal.h" 

#include "Uart.h" 

#include "string.h" 

#include "ws2812.h" 

#include "IWDG.h" 

RGB_COLOR USUARIO_RGB_COLOR; 

carácter sin firmar TX_Mode = 1; // Bandera de tipo de transmisión bit 1: 232 0: TTL 

carácter sin firmar BLINK_2 = 0; 

carácter sin firmar RX3_BUF [32]; // Búfer de recepción personalizado de tres niveles 

#define BOTÓN1 0x81 

#define BOTÓN2 0x82 

#define BOTÓN3 0x83 

#define BOTÓN4 0x84 

#define BOTÓN5 0x85 

#define BOTÓN6 0x86 

#define BOTÓN7 0x87 

#define BOTÓN8 0x88 

#define BOTÓN9 0x89 

#define BOTÓN0 0x8A 

#define BORRAR 0x8E 

int sin signo r_flag1 = 0; 

unsigned int quan [4] [2] = {0}; 

unsigned int cha [4] [2] = {0}; 

sin signo int quan_hang1 = 0; 

sin signo int quan_hang2 = 0; 

sin signo int quan_hang3 = 0; 

int sin signo quan_lie1 = 0; 

int sin signo quan_lie2 = 0; 

int sin signo quan_lie3 = 0; 

sin signo int quan_zuoxia = 0; 

int sin signo quan_youxia = 0; 

sin signo int cha_hang1 = 0; 

sin signo int cha_hang2 = 0; 

sin signo int cha_hang3 = 0; 

int sin signo cha_lie1 = 0; 

int sin signo cha_lie2 = 0; 

int sin signo cha_lie3 = 0; 

int sin signo cha_zuoxia = 0; 

unsigned int cha_youxia = 0; // unsigned int r_flag10 = 0; 

void SystemClock_Config (void); 

void Error_Handler (vacío); 

estático vacío MX_GPIO_Init (vacío); 

int principal (vacío) 

uint8_t color_buf = 0; 

// Selección de función 

/ * Reset de todos los periféricos, Inicializa la interfaz Flash y el Systick. * / 

HAL_Init (); 

/ * Configurar el reloj del sistema * / 

SystemClock_Config (); 

/ * Inicializar todos los periféricos configurados * / 

MX_GPIO_Init (); 

TX_Mode = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4); 

si (TX_Mode) 

MX_USART1_UART_Init (); 

// 232 Inicialización 

más 

MX_USART1_UART_Init2 (); 

// Inicialización TTl 

mientras (1) 

si (TX_Mode! = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)) 

HAL_NVIC_SystemReset (); 

// Inversión, reinicio y reinicialización del puente 

si (MNG_USART1.RX_OVER_FLG == TRUE) 

// 

Bit de bandera de recepción de datos en serie 

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

// Método 2: obtener un nombre de control de longitud fija 

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]; 

if ((strcmp (“button1”, (const char *) RX3_BUF)) == 0) 

// Seleccionar control

color_buf = BOTÓN1; 

}

if ((strcmp (“button2”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN2; 

}

if ((strcmp (“button3”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN3; 

}

if ((strcmp (“button4”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN4; 

}

if ((strcmp (“button5”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN5; 

}

if ((strcmp (“button6”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN6; 

}

if ((strcmp (“button7”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN7; 

}

if ((strcmp (“button8”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN8; 

}

if ((strcmp (“button9”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN9; 

}

if ((strcmp (“button0”, (const char *) RX3_BUF)) == 0) 

color_buf = BOTÓN0; 

}

cambiar (color_buf) 

caso BUTTON1: 

// si (r_flag1 == 0) 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen2 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_flag1 ^ = 1; 

quan_hang1 ++; 

quan_lie1 ++; 

quan_youxia ++;  

// memset (RX3_BUF, 0,7); 

//conjunto de memoria(MNG_USART1.RX_BUF,0,USART1_RX_LEN); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen2 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang1 ++; 

cha_lie1 ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

// r_flag1 = 1; 

break; 

caso BUTTON2: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen3 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang1 ++; 

quan_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen3 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang1 ++; 

cha_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON3: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen4 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang1 ++; 

quan_lie3 ++; 

quan_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen4 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang1 ++; 

cha_lie3 ++; 

cha_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON4: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen5 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang2 ++; 

quan_lie1 ++; 

// memset (RX3_BUF, 0,7); 

// r_flag10 = 1; 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen5 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang2 ++; 

cha_lie1 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON5: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen6 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang2 ++; 

quan_lie2 ++; 

quan_zuoxia ++; 

quan_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen6 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang2 ++; 

cha_lie2 ++; 

cha_zuoxia ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON6: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen7 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang2 ++; 

quan_lie3 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen7 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang2 ++; 

cha_lie3 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON7: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen8 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang3 ++; 

quan_lie1 ++; 

quan_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen8 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang3 ++; 

cha_lie1 ++; 

cha_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON8: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen9 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang3 ++; 

quan_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen9 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang3 ++; 

cha_lie2 ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON9: 

si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen10 \ ”, \” imagen \ ”: \” círculo \ ”}> ET”);

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 1; 

quan_hang3 ++; 

quan_lie3 ++; 

quan_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

más si ((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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen10 \ ”, \” imagen \ ”: \” x \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

r_bandera1 = 0; 

cha_hang3 ++; 

cha_lie3 ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

color_buf = BORRAR; 

}

break; 

caso BUTTON0: 

r_bandera1 = 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen2 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen3 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen4 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen5 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen6 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen7 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen8 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen9 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” imagen \ ”, \” widget \ ”: \” imagen10 \ ”, \” imagen \ ”: \” bai \ ”}> ET”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif4 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif5 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif6 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif7 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif8 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif9 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif10 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif11 \ ”, \” visible \ ”: falso}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) MNG_USART1.TX_BUF); 

USART_TX_Data (MNG_USART1); 

// memset (RX3_BUF, 0,7); 

memset (MNG_USART1.RX_BUF, 0, USART1_RX_LEN); 

break; 

por defecto: 

MNG_USART1.RX_OVER_FLG = FALSO; 

break; 

}

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

si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif4 \ ”, \” visible \ ”: true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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; 

}

más si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif5 \ ”, \” visible \ ”: true}> ET ”);

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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; 

}

más si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif6 \ ”, \” visible \ ”: true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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; 

}

más si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif7 \ ”, \” visible \ ”: true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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; 

}

más si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif8 \ ”, \” visible \ ”: true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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; 

}

más si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif9 \ ”, \” visible \ ”: true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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; 

}

más si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif11 \ ”, \” visible \ ”: true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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; 

}

más si ((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 \ ”, \” tipo \ ”: \” widget \ ”, \” widget \ ”: \” gif10 \ ”, \” visible \ ”: true}> ET ”); 

MNG_USART1.TX_Byte_Num = strlen ((carácter constante *) 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 = FALSO; 

}

/ ** Configuración del reloj del sistema 

*/

void SystemClock_Config (vacío) 

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; 

si (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_PLLCLK; 

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 

si (HAL_RCC_ClockConfig (& RCC_ClkInitStruct, FLASH_LATENCY_1)! = HAL_OK) 

Error_Handler (); 

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; 

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; 

si (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit)! = HAL_OK) 

Error_Handler (); 

}

HAL_SYSTICK_Config (HAL_RCC_GetHCLKFreq () / 1000); 

HAL_SYSTICK_CLKSourceConfig (SYSTICK_CLKSOURCE_HCLK); 

/ * Configuración de interrupción SysTick_IRQn * / 

HAL_NVIC_SetPriority (SysTick_IRQn, 0, 0); 

}

/ ** Configuración de pines 

*/

vacío estático MX_GPIO_Init (vacío) 

GPIO_InitTypeDef GPIO_InitStruct; 

/ * Activar reloj de puertos 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 y 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 y GPIO_InitStruct); 

}

/ * CÓDIGO DE USUARIO COMIENZO 4 * /

/ * CÓDIGO DE USUARIO FIN 4 * / 

/ **

* @brief Esta función se ejecuta en caso de que ocurra un error. 

* @param Ninguno 

* @retval Ninguno 

*/ 

void Error_Handler (vacío) 

/ * CÓDIGO DE USUARIO COMIENZO Error_Handler * / 

/ * El usuario puede agregar su propia implementación para informar el estado de retorno de error HAL * / 

mientras (1) 

{

}

/ * CÓDIGO DE USUARIO FIN Error_Handler * / 

}

#ifdef USE_FULL_ASSERT 

/ **

* @brief Informa el nombre del archivo de origen y el número de línea de origen 

* donde se ha producido el error assert_param. 

* @param file: puntero al nombre del archivo de origen 

* @param line: número de fuente de la línea de error assert_param 

* @retval Ninguno 

*/ 

void assert_failed (archivo uint8_t *, línea uint32_t) 

/ * CÓDIGO DE USUARIO COMIENZO 6 * / 

/ * El usuario puede agregar su propia implementación para informar el nombre del archivo y el número de línea, 

ej .: printf ("Valor de parámetros incorrecto: archivo% s en la línea% d \ r \ n", archivo, línea) * / 

/ * CÓDIGO DE USUARIO FIN 6 * / 

}

#terminara si 

/ **

*@} 

*/ 

/ **

*@} 

*/

/ ************************ (C) COPYRIGHT STMicroelectronics ***** FIN DEL ARCHIVO **** /

Los resultados finales muestran

Juego de tres en raya Basado en STONE TFT LCD y STM32 IOT PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Fuente: Platón Data Intelligence