IOT

Jogo da velha com base em STONE TFT LCD e STM32

Resumo

Tic-tac-toe é um jogo jogado em uma grade de 3 por 3, semelhante ao gobang. Recebe esse nome porque o tabuleiro geralmente não desenha bordas e as linhas de grade são organizadas em um jogo da velha. As ferramentas necessárias para o jogo são apenas papel e caneta. Em seguida, dois jogadores representando O e X se revezam para deixar marcas na grade. Quaisquer três marcas formam uma linha reta, que é a vencedora.

Este artigo é usar o microcontrolador STM32 e o display LCD STONE para desenvolver um jogo simples de jogo da velha.

Materiais necessários para o experimento

O princípio do sistema

Especifique que o primeiro toque na tela deve ser O, o segundo toque na tela é X, vem fazendo este ciclo. Defina 8 matrizes para armazenar o número de O e X em cada linha, coluna e diagonal de cada grade, desde que haja três da mesma marca é a vitória, então haverá uma caixa vermelha piscando para provar a vitória do linha, coluna ou diagonal e, em seguida, toque em redefinir para iniciar o jogo novamente.

A seguir está o fluxograma:

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Design de hardware do sistema STM32 e STONE LCD Display

(A) Visor LCD STONE

  1. Design de hardware do “jogo da velha”

Use o display STONE LCD da Beijing STONE Technology co., Ltd, o modelo é STWI070WT-01, com um display TFT integrado e controlador de toque.

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.
  1.  STVC070WT-01 recursos do produto
Parâmetro Físico 
Tamanho7 polegadas
Resolução800 × RGB × 480
Espaçamento de pixels0.0642 (L) × 0.1790 (A) mm
Cor262,144 cores (18 bits)
Área de visualização154.08 (L) × 85.92 (A) mm
exibição Dimension186.4mmx105.5mm
Dimensão total186.4 mm x 105.5 mm x 17.4 mm (tipo padrão) 186.4 mm x 105.5 mm x 23.8 mm (com porta Ethernet)
Peso líquido300g
Ecrã 
Tipo de luz de fundoCONDUZIU
Brilho300cd/m2 (o brilho pode ser ajustável em 100 níveis)
Contraste500:1
Vida da luz de fundo300,000 horas
Ângulo de visão70 ° / 70 ° / 50 ° / 70 ° (L / R / U / D)
Painel TFTUm painel de classe da indústria
Tela sensível ao toqueToque de resistência de 4 fios/toque capacitivo/sem tela de toque
Modo de tela:Digital
Subcontratante 
CPUCortex A8
Taxa de atualização1G Hz
Taxa máxima de quadros60 FPS
Interface 
Interface SerialNível RS232 / RS422 / RS485 / TTL
Interface Ethernet10M / 100M (opcional)
Interface sem fioWi-Fi / Bluetooth (opcional)
Download de arquivo de projetoPorta USB 2.0 ou disco de armazenamento U
Fonte de alimentação do laboratório 
Tensão nominal+ 12V DC ou + 5V DC
Faixa de tensão permitida+ 7V DC… + 28V DC ou + 5V DC
Máx. transitórios permitidos+ 28V
Tempo entre dois transientes50 segundos mínimo
Fusível Interno2A fusível de auto-recuperação
Consumo de energia3.0 W
Condições ambientais 
Máx. temperatura ambiente permitidaOperaçãoArmazenamento-20℃~ +70℃-30℃~ +80℃
Humidade relativaOperaçãoArmazenamento55°C,85%60°C,90%
Carregamento de choqueOperaçãoArmazenamento15 g/11 mseg 25 g/6 mseg
vibraçãoOperaçãoArmazenamento0.035 mm (10 – 58 Hz)/ 1 g (58 – 500 Hz) 3.5 mm (5 – 8,5 Hz)/ 1 g (8.5 – 500 Hz)
Pressão barométricaOperaçãoArmazenamento706 a 1030 hPa581 a 1030 hPa
Imunidade a ruídos 
Descarga estática (descarga de contato/descarga de ar)EN 61000-4-2 6 kV / 8 kV
Irradiação RFEN 61000-4-310 V/m, 80% AM1 kHz
Modulação de pulsoENV 50204900 MHz ± 5 MHz 10 V/mef., 50% ED, 200 Hz
Condução RFEN 61000-4-6150 kHz – 80 MHz 10 V, 80% AM, 1 kHz
Interferência de explosãoLinhas de alimentaçãoLinhas de dados de processoLinhas de sinalEN 61000-4-42kV2kV1kV
Dispositivo de suporte 
Porta UARTSuporteRS232/RS422/RS485/TTL
Porta de redeSuporte Porta Ethernet/Wi-Fi/Bluetooth
Memória flashSuporte Padrão 256 MB, Estenda 1 GB ou 2 GB
CigarraSuporte
RTCSuporte
Porta USBSupportOnline Download por cabo USB
Interface de disco de armazenamento USupport.Offline Baixar ou copiar dados do usuário
Tela sensível ao toqueResistência de 4 fios / capacitiva
Fonte de vetorFormato TTF padrão
ImagemSuporte ao formato PNG / JPG / BMP / SVG / GIF
Interface de ÁudioSuporte ao formato WAVO comprimento de um único arquivo de áudio não é limitado, teoricamente até 4096 arquivos de áudio, a potência do alto-falante é de 8 ohms 2 watts ou 4 ohms 3 watts
Conjunto de ComandosConjuntos de comandos simplificados e unificados
Memória 
Memória flash256 MB padrão, extensão de 1 GB ou 2 GB
Quantidade de memória para imagemDe acordo com a capacidade da imagem, sugira o formato “PNG, BMP, JPG, SVG, GIF”.

(B) placa STM32

Usando uma placa STM32, o chip do STM32 é o CKS32F303.

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

A família STM32 de núcleos ARM Cortex-M0, M0 +, M3, M4 e M7 foi projetada para aplicações embarcadas que requerem alto desempenho, baixo custo e baixo consumo de energia.

  • Fonte de alimentação 2.0V-3.6V
  • Pinos de E / S compatíveis com 5 V
  • Excelente modo de relógio seguro
  • Modo de baixo consumo com função de despertar
  • Oscilador RC interno
  • Circuito de reinicialização embutido
  • Faixa de temperatura operacional.
  • -40 ° C a + 85 ° C ou 105 ° C

Projeto de software do sistema

O processo de desenvolvimento do display STM32 e STONE LCD

1: crie o projeto e carregue as imagens necessárias no projeto.

2: usar o software Stone-designer para criar relacionamentos associados dinamicamente; os principais controles são: “Botão”, “imagem”;

3: simulação e compilação de software para gerar arquivos executáveis.

4: o display LCD é conectado ao PC via USB e copia o arquivo executável para a tela.

Primeiro crie um novo projeto conforme mostrado abaixo.

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.
Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Em segundo lugar, importe todas as imagens para o recurso

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Em seguida, defina os controles de botão para cada grade e torne os botões invisíveis. 

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Não se esqueça de definir o botão de reset!

O efeito finalizado é mostrado abaixo:

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Depois disso, adicione controles de imagem a cada grade da mesma maneira e defina-os como imagens brancas.

Por fim, adicione o controle gif e defina-o como invisível.

As partes do efeito acabado são mostradas abaixo:

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.
Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.
Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.
Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Diagrama de conexão do circuito

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Compartilhamento de código

/ * Inclui —————————————————————— * / 

#incluir “stm32f0xx_hal.h” 

#include “Uart.h” 

#inclui “string.h” 

#incluir “ws2812.h” 

#incluir “IWDG.h” 

RGB_COLOR USER_RGB_COLOR; 

Unsigned char TX_Mode = 1; // Sinalizador de tipo de transmissão bit 1: 232 0: TTL 

char não assinado BLINK_2 = 0; 

caractere unsigned RX3_BUF [32]; // Buffer de recepção de três níveis personalizado 

# define BUTTON1 0x81 

# define BUTTON2 0x82 

# define BUTTON3 0x83 

# define BUTTON4 0x84 

# define BUTTON5 0x85 

# define BUTTON6 0x86 

# define BUTTON7 0x87 

# define BUTTON8 0x88 

# define BUTTON9 0x89 

# define BUTTON0 0x8A 

#define LIMPAR 0x8E 

sem sinal int r_flag1 = 0; 

sem sinal int quan [4] [2] = {0}; 

não assinado int cha [4] [2] = {0}; 

sem sinal int quan_hang1 = 0; 

sem sinal int quan_hang2 = 0; 

sem sinal int quan_hang3 = 0; 

sem sinal int quan_lie1 = 0; 

sem sinal int quan_lie2 = 0; 

sem sinal int quan_lie3 = 0; 

sem sinal int quan_zuoxia = 0; 

sem sinal int quan_youxia = 0; 

sem sinal int cha_hang1 = 0; 

sem sinal int cha_hang2 = 0; 

sem sinal int cha_hang3 = 0; 

sem sinal int cha_lie1 = 0; 

sem sinal int cha_lie2 = 0; 

sem sinal int cha_lie3 = 0; 

sem sinal int cha_zuoxia = 0; 

sem sinal int cha_youxia = 0; // sem sinal int r_flag10 = 0; 

void SystemClock_Config (void); 

void Error_Handler (void); 

estático void MX_GPIO_Init (void); 

int main (void) 

uint8_t cor_buf = 0; 

// Seleção de Função 

/ * Reinicializa todos os periféricos, inicializa a interface Flash e o Systick. * / 

HAL_Init (); 

/ * Configure o relógio do sistema * / 

SystemClock_Config (); 

/ * Inicializar todos os periféricos configurados * / 

MX_GPIO_Init (); 

TX_Mode = HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4); 

if (TX_Mode) 

MX_USART1_UART_Init (); 

// 232 Inicialização 

outro 

MX_USART1_UART_Init2 (); 

// Inicialização TTl 

enquanto (1) 

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

HAL_NVIC_SystemReset (); 

// Reversão do jumper, reinicialização e reinicialização 

if (MNG_USART1.RX_OVER_FLG == TRUE) 

// 

Bit de sinalizador de recebimento de dados seriais 

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

// Método 2: Obter nome de controle de comprimento fixo 

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) 

// Selecione o controle

cor_buf = BOTÃO1; 

}

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

cor_buf = BOTÃO2; 

}

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

cor_buf = BOTÃO3; 

}

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

cor_buf = BOTÃO4; 

}

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

cor_buf = BOTÃO5; 

}

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

cor_buf = BOTÃO6; 

}

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

cor_buf = BOTÃO7; 

}

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

cor_buf = BOTÃO8; 

}

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

cor_buf = BOTÃO9; 

}

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

cor_buf = BOTÃO0; 

}

alternar (color_buf) 

caso BOTÃO1: 

// if (r_flag1 == 0) 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem2 \ ”, \” imagem \ ”: \” círculo \ ”}> 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); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem2 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang1 ++; 

cha_lie1 ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

// r_flag1 = 1; 

break; 

caso BOTÃO2: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem3 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang1 ++; 

quan_lie2 ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem3 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang1 ++; 

cha_lie2 ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO3: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem4 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang1 ++; 

quan_lie3 ++; 

quan_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem4 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang1 ++; 

cha_lie3 ++; 

cha_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO4: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem5 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang2 ++; 

quan_lie1 ++; 

// memset (RX3_BUF, 0,7); 

// r_flag10 = 1; 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem5 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang2 ++; 

cha_lie1 ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO5: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem6 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang2 ++; 

quan_lie2 ++; 

quan_zuoxia ++; 

quan_youxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem6 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang2 ++; 

cha_lie2 ++; 

cha_zuoxia ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO6: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem7 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang2 ++; 

quan_lie3 ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem7 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang2 ++; 

cha_lie3 ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO7: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem8 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang3 ++; 

quan_lie1 ++; 

quan_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem8 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang3 ++; 

cha_lie1 ++; 

cha_zuoxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO8: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem9 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang3 ++; 

quan_lie2 ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem9 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang3 ++; 

cha_lie2 ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO9: 

if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem10 \ ”, \” imagem \ ”: \” círculo \ ”}> ET”);

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 1; 

quan_hang3 ++; 

quan_lie3 ++; 

quan_youxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

else if ((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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem10 \ ”, \” imagem \ ”: \” x \ ”}> ET”); 

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

USART_TX_Data (MNG_USART1); 

r_flag1 = 0; 

cha_hang3 ++; 

cha_lie3 ++; 

cha_youxia ++; 

// memset (RX3_BUF, 0,7); 

cor_buf = LIMPAR; 

}

break; 

caso BOTÃO0: 

r_flag1 = 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem2 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem3 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem4 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem5 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem6 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem7 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem8 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem9 \ ”, \” imagem \ ”: \” 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 \ ”: \” definir_imagem \ ”, \” tipo \ ”: \” imagem \ ”, \” widget \ ”: \” imagem10 \ ”, \” imagem \ ”: \” 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif4 \ ”, \” visível \ ”: 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif5 \ ”, \” visível \ ”: 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif6 \ ”, \” visível \ ”: 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif7 \ ”, \” visível \ ”: 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif8 \ ”, \” visível \ ”: 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif9 \ ”, \” visível \ ”: 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif10 \ ”, \” visível \ ”: 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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif11 \ ”, \” visível \ ”: 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); 

break; 

default: 

MNG_USART1.RX_OVER_FLG = FALSO; 

break; 

}

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

if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif4 \ ”, \” visível \ ”: 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; 

}

else if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif5 \ ”, \” visível \ ”: 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; 

}

else if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif6 \ ”, \” visível \ ”: 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; 

}

else if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif7 \ ”, \” visível \ ”: 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; 

}

else if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif8 \ ”, \” visível \ ”: 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; 

}

else if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif9 \ ”, \” visível \ ”: 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; 

}

else if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif11 \ ”, \” visível \ ”: 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; 

}

else if ((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 \ ”, \” digite \ ”: \” widget \ ”, \” widget \ ”: \” gif10 \ ”, \” visível \ ”: 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 = FALSO; 

}

/ ** Configuração do relógio do sistema 

*/

void SystemClock_Config (void) 

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.PLLSState = RCC_PLL_ON; 

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; 

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; 

RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; 

if (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; 

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

Error_Handler (); 

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; 

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; 

if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit)! = HAL_OK) 

Error_Handler (); 

}

HAL_SYSTICK_Config (HAL_RCC_GetHCLKFreq () / 1000); 

HAL_SYSTICK_CLKSourceConfig (SYSTICK_CLKSOURCE_HCLK); 

/ * Configuração de interrupção SysTick_IRQn * / 

HAL_NVIC_SetPriority (SysTick_IRQn, 0, 0); 

}

/ ** Configuração de pinagem 

*/

static void MX_GPIO_Init (void) 

GPIO_InitTypeDef GPIO_InitStruct; 

/ * Habilitar relógio de portas 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); 

}

/ * CÓDIGO DE USUÁRIO BEGIN 4 * /

/ * FIM DO CÓDIGO DO USUÁRIO 4 * / 

/ **

* @brief Esta função é executada em caso de ocorrência de erro. 

* @param Nenhum 

* @retval Nenhum 

*/ 

void Error_Handler (void) 

/ * CÓDIGO DE USUÁRIO BEGIN Error_Handler * / 

/ * O usuário pode adicionar sua própria implementação para relatar o estado de retorno de erro HAL * / 

enquanto (1) 

{

}

/ * CÓDIGO DE USUÁRIO FIM Error_Handler * / 

}

#ifdef USE_FULL_ASSERT 

/ **

* @brief Relata o nome do arquivo de origem e o número da linha de origem 

* onde ocorreu o erro assert_param. 

* @param file: ponteiro para o nome do arquivo de origem 

* @param line: assert_param número da fonte da linha de erro 

* @retval Nenhum 

*/ 

void assert_failed (arquivo uint8_t *, linha uint32_t) 

/ * CÓDIGO DE USUÁRIO BEGIN 6 * / 

/ * O usuário pode adicionar sua própria implementação para relatar o nome do arquivo e o número da linha, 

ex: printf (“Valor de parâmetro errado: arquivo% s na linha% d \ r \ n”, arquivo, linha) * / 

/ * FIM DO CÓDIGO DO USUÁRIO 6 * / 

}

#fim se 

/ **

*@} 

*/ 

/ **

*@} 

*/

/ ************************* (C) COPYRIGHT STMicroelectronics ***** FIM DO ARQUIVO **** /

Resultados finais mostram

Jogo Tic-tac-toe baseado em STONE TFT LCD e STM32 IOT PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Fonte: Plato Data Intelligence