IDO

Jeu de morpion basé sur STONE TFT LCD et STM32

Résumé

Tic-tac-toe est un jeu qui se joue sur une grille de 3 par 3, similaire au gobang. Il tire son nom du fait que le tableau ne dessine généralement pas de bordures et que les lignes de la grille sont disposées en tic-tac-toe. Les outils nécessaires au jeu ne sont que du papier et un stylo. Ensuite, deux joueurs représentant O et X se relaient pour laisser des marques sur la grille. Toutes les trois marques forment une ligne droite, qui est le gagnant.

Cet article consiste à utiliser le microcontrôleur STM32 et l'écran LCD STONE pour développer un jeu de morpion simple.

Matériel nécessaire à l'expérimentation

Le principe du système

Spécifiez que le premier appui sur l'écran doit être O, le deuxième appui sur l'écran est X, a fait ce cycle. Définissez 8 tableaux pour stocker le nombre de O et X dans chaque ligne, colonne et diagonale de chaque grille, tant qu'il y en a trois de la même marque, c'est la victoire, alors il y aura une case rouge clignotante pour prouver la victoire du ligne, colonne ou diagonale, puis appuyez sur réinitialiser pour recommencer le jeu.

Voici l'organigramme :

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Conception matérielle du système d'affichage LCD STM32 et STONE

(A) Écran LCD PIERRE

  1. Conception matérielle « jeu de morpion »

Utilisez l'écran LCD STONE de Beijing STONE Technology co., ltd, le modèle est STWI070WT-01, avec un écran TFT intégré et un contrôleur tactile.

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.
  1.  STVC070WT-01 les caractéristiques du produit
Paramètre physique 
Taille7 cm
Résolution800 × RVB × 480
Espacement des pixels0.0642 (L) × 0.1790 (H) mm
Couleur262,144 couleurs (18 bits)
Zone de visualisation154.08 (L) × 85.92 (H) mm
Affichage Dimension186.4mmx105.5mm
Dimension globale186.4 mm x 105.5 mm x 17.4 mm (type standard) 186.4 mm x 105.5 mm x 23.8 mm (avec port Ethernet)
Poids net300 g
Commande 
type de rétroéclairageDEL
Luminosité300cd/m2 (la luminosité peut être réglable sur 100 niveaux)
Comparaison500:1
Durée de vie du rétroéclairage300,000 heures
Angle de vision70°/70°/50°/70° (L/R/U/D)
Panneau TFTUn panel industriel de classe
Écran tactileRésistance tactile à 4 fils/tactile capacitif/sans écran tactile
Mode écran:Ressources
Processeur 
ProcesseurCortex A8
Verversingssnelheid1G Hz
Fréquence d'images maximaleFPS 60
Interfaces 
Interface sérieNiveau RS232 / RS422 / RS485 / TTL
interface Ethernet10M/100M (facultatif)
Interface sans filWi-Fi/Bluetooth (en option)
Téléchargement du fichier de projetPort USB2.0 ou disque de stockage U
Alimentation 
Tension nominale+12V CC ou +5V CC
Plage de tension admissible+7V CC…+28V CC ou +5V CC
Max. transitoires admissibles+ 28V
Temps entre deux transitoires50 secondes minimum
Fusible interneFusible à récupération automatique 2A
Consommation d'énergie3.0 W
Conditions ambiantes 
Max. température ambiante admissibleOpérationStockage-20 ℃ ~ +70 ℃ -30 ℃ ~ +80 ℃
Humidité relativeOpérationStockage55℃,85%60℃,90%
Charge de chocOpérationStockage15 g/11 ms25 g/6 ms
VibrationOpérationStockage0.035 mm (10 – 58 Hz)/ 1 g (58 – 500 Hz)3.5 mm (5 – 8,5 Hz)/ 1 g (8.5 – 500 Hz)
Pression barométriqueOpérationStockage706 à 1030 hPa581 à 1030 hPa
Immunité au bruit 
Décharge statique (décharge de contact/décharge d'air)EN 61000-4-2 6kV/8kV
Irradiation RFEN 61000-4-310 V/m, 80 % AM1 kHz
Modulation d'impulsionsENV 50204900 MHz ±5 MHz10 V/meff., 50 % ED, 200 Hz
conduction RFEN 61000-4-6150 kHz – 80 MHz10 V, 80 % AM, 1 kHz
Interférences en rafaleLignes d'alimentationLignes de données de processusLignes de signalEN 61000-4-42kV2kV1kV
Dispositif d'assistance 
Port UARTPrise en chargeRS232/RS422/RS485/TTL
Port RéseauPrise en charge du port Ethernet/Wi-Fi/Bluetooth
Mémoire flashSupportStandard 256 Mo, Extension 1 Go ou 2 Go
Alerte SonoreAssistance
RTCAssistance
Port USBSupport Téléchargement en ligne par câble USB
Interface de disque de stockage USupport.Offline Télécharger ou copier les données utilisateur
Écran tactileRésistance à 4 fils / capacitif
Police vectorielleFormat TTF standard
Image(s)Prise en charge des formats PNG/JPG/BMP/SVG/GIF
Interface AudioPrise en charge du format WAVLa longueur d'un seul fichier audio n'est pas limitée, théoriquement jusqu'à 4096 fichiers audio, la puissance du haut-parleur est de 8 ohms 2 watts ou 4 ohms 3 watts
Jeu de commandesEnsembles de commandes simplifiés unifiés
Mémoire 
Mémoire flash256 Mo standard, extension 1 Go ou 2 Go
Quantité de mémoire pour l'imageSelon la capacité de l'image, suggérez le format "PNG, BMP, JPG, SVG, GIF".

(B) Carte STM32

En utilisant une carte STM32, la puce du STM32 est CKS32F303.

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

La famille STM32 de cœurs ARM Cortex-M0, M0+, M3, M4 et M7 est conçue pour les applications embarquées nécessitant des performances élevées, un faible coût et une faible consommation d'énergie.

  • Alimentation 2.0V-3.6V
  • Broches E/S compatibles 5V
  • Excellent mode d'horloge de sécurité
  • Mode faible consommation avec fonction réveil
  • Oscillateur RC interne
  • Circuit de réinitialisation intégré
  • Plage de température de fonctionnement.
  • -40°C à +85°C ou 105°C

Conception du logiciel système

Le processus de développement des écrans LCD STM32 et STONE

1: créez le projet et chargez les images requises dans le projet.

2: utiliser le logiciel Stone-designer pour créer des relations associées dynamiquement ; les contrôles principaux sont : « Bouton », « Image » ;

3: simulation et compilation de logiciels pour générer des fichiers exécutables.

4: l'écran LCD est connecté au PC via USB et copie le fichier exécutable à l'écran.

Créez d'abord un nouveau projet comme indiqué ci-dessous.

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.
Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Deuxièmement, importez toutes les images dans la ressource

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Ensuite, définissez des commandes de bouton sur chaque grille et rendez les boutons invisibles. 

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

N'oubliez pas de régler le bouton de réinitialisation !

L'effet fini est montré ci-dessous :

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Après cela, ajoutez des contrôles d'image à chaque grille de la même manière et définissez-les tous sur des images blanches.

Enfin, ajoutez le contrôle gif et définissez-le sur invisible.

Les parties de l'effet fini sont indiquées ci-dessous :

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.
Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.
Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.
Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Schéma de connexion du circuit

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Partage de Code

/* Comprend ——————————————————————*/ 

#include "stm32f0xx_hal.h" 

#include "Uart.h" 

#include "chaîne.h" 

#inclure "ws2812.h" 

#inclure "IWDG.h" 

RVB_COLOR USER_RGB_COLOR ; 

caractère non signé TX_Mode = 1 ; //Bit indicateur de type de transmission 1:232 0:TTL 

caractère non signé BLINK_2=0 ; 

caractère non signé RX3_BUF[32] ; //Tampon de réception personnalisé à trois niveaux 

#définir BOUTON1 0x81 

#définir BOUTON2 0x82 

#définir BOUTON3 0x83 

#définir BOUTON4 0x84 

#définir BOUTON5 0x85 

#définir BOUTON6 0x86 

#définir BOUTON7 0x87 

#définir BOUTON8 0x88 

#définir BOUTON9 0x89 

#définir BOUTON0 0x8A 

#define EFFACER 0x8E 

entier non signé r_flag1 = 0 ; 

entier non signé quan[4][2]={0} ; 

int cha non signé [4][2]={0}; 

entier non signé quan_hang1 = 0 ; 

entier non signé quan_hang2 = 0 ; 

entier non signé quan_hang3 = 0 ; 

entier non signé quan_lie1 = 0; 

entier non signé quan_lie2 = 0; 

entier non signé quan_lie3 = 0; 

int non signé quan_zuoxia = 0; 

int non signé quan_youxia = 0; 

int non signé cha_hang1 = 0; 

int non signé cha_hang2 = 0; 

int non signé cha_hang3 = 0; 

int non signé cha_lie1 = 0; 

int non signé cha_lie2 = 0; 

int non signé cha_lie3 = 0; 

int non signé cha_zuoxia = 0; 

int non signé cha_youxia = 0; //entier non signé r_flag10 = 0; 

void SystemClock_Config(void); 

void Error_Handler(void); 

vide statique MX_GPIO_Init(void); 

int main (vide) 

uint8_t color_buf = 0 ; 

//Sélection de fonction 

/* Reset de tous les périphériques, Initialise l'interface Flash et le Systick. */ 

HAL_Init(); 

/* Configurer l'horloge système */ 

SystemClock_Config(); 

/* Initialiser tous les périphériques configurés */ 

MX_GPIO_Init(); 

TX_Mode = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) ; 

si(Mode_TX) 

MX_USART1_UART_Init(); 

//232 Initialisation 

d'autre 

MX_USART1_UART_Init2(); 

//Initialisation TTl 

tandis que(1) 

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

HAL_NVIC_SystemReset(); 

//Inversion du cavalier, redémarrage et réinitialisation 

si(MNG_USART1.RX_OVER_FLG ==TRUE) 

// 

Bit indicateur de réception de données série 

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

//Méthode 2 : Obtenir un nom de contrôle de longueur fixe 

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("bouton1",(const char *)RX3_BUF))==0) 

//Sélectionner le champ

color_buf = BOUTON1; 

}

if((strcmp("bouton2",(const char *)RX3_BUF))==0) 

color_buf = BOUTON2; 

}

if((strcmp("bouton3",(const char *)RX3_BUF))==0) 

color_buf = BOUTON3; 

}

if((strcmp("bouton4",(const char *)RX3_BUF))==0) 

color_buf = BOUTON4; 

}

if((strcmp("bouton5",(const char *)RX3_BUF))==0) 

color_buf = BOUTON5; 

}

if((strcmp("bouton6",(const char *)RX3_BUF))==0) 

color_buf = BOUTON6; 

}

if((strcmp("bouton7",(const char *)RX3_BUF))==0) 

color_buf = BOUTON7; 

}

if((strcmp("bouton8",(const char *)RX3_BUF))==0) 

color_buf = BOUTON8; 

}

if((strcmp("bouton9",(const char *)RX3_BUF))==0) 

color_buf = BOUTON9; 

}

if((strcmp("bouton0",(const char *)RX3_BUF))==0) 

color_buf = BOUTON0; 

}

commutateur (color_buf) 

cas BOUTON1 : 

//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((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image2\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 ^= 1 ; 

quan_hang1++; 

quan_lie1++; 

quan_youxia++;  

//jemset(RX3_BUF,0,7) ; 

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

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang1++ ; 

cha_lie1++; 

cha_youxia++ ; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

//r_flag1 = 1 ; 

break; 

cas BOUTON2 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image3\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang1++; 

quan_lie2++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang1++ ; 

cha_lie2++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON3 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image4\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang1++; 

quan_lie3++; 

quan_zuoxia++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang1++ ; 

cha_lie3++; 

cha_zuoxia++ ; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON4 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image5\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang2++; 

quan_lie1++; 

//jemset(RX3_BUF,0,7) ; 

//r_flag10=1 ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang2++ ; 

cha_lie1++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON5 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image6\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang2++; 

quan_lie2++; 

quan_zuoxia++; 

quan_youxia++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang2++ ; 

cha_lie2++; 

cha_zuoxia++ ; 

cha_youxia++ ; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON6 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image7\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang2++; 

quan_lie3++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02))

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang2++ ; 

cha_lie3++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON7 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image8\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang3++; 

quan_lie1++; 

quan_zuoxia++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang3++ ; 

cha_lie1++; 

cha_zuoxia++ ; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON8 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image9\”,\”image\”:\”circle\ ”}>ET”); 

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang3++; 

quan_lie2++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang3++ ; 

cha_lie2++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON9 : 

si((r_flag1 == 0)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

“ST<{\”cmd_code\”:\”set_image\”,\”type\”:\”image\”,\”widget\”:\”image10\”,\”image\”:\”circle\ ”}>ET”);

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 1 ; 

quan_hang3++; 

quan_lie3++; 

quan_youxia++; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

sinon si((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

r_flag1 = 0 ; 

cha_hang3++ ; 

cha_lie3++; 

cha_youxia++ ; 

//jemset(RX3_BUF,0,7) ; 

color_buf = EFFACER; 

}

break; 

cas BOUTON0 : 

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((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ;

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Data(MNG_USART1) ; 

//jemset(RX3_BUF,0,7) ; 

memset(MNG_USART1.RX_BUF,0,USART1_RX_LEN); 

break; 

par défaut: 

MNG_USART1.RX_OVER_FLG = FAUX ; 

break; 

}

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

si((quan_hang1==3)||(cha_hang1==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

}

sinon si((quan_hang2==3)||(cha_hang2==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

}

sinon si((quan_hang3==3)||(cha_hang3==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

}

sinon si((quan_lie1==3)||(cha_lie1==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

}

sinon si((quan_lie2==3)||(cha_lie2==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

}

sinon si((quan_lie3==3)||(cha_lie3==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

}

sinon si((quan_zuoxia==3)||(cha_zuoxia==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

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

}

sinon si((quan_youxia==3)||(cha_youxia==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((car *)MNG_USART1.TX_BUF, 

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

MNG_USART1.TX_Byte_Num = strlen((car const *)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 = FAUX ; 

}

/** Configuration de l'horloge système 

*/

annuler SystemClock_Config (annuler) 

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

/* Configuration des interruptions SysTick_IRQn */ 

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 

}

/** Configuration du brochage 

*/

vide statique MX_GPIO_Init(void) 

GPIO_InitTypeDef GPIO_InitStruct ; 

/* Activation de l'horloge des ports 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); 

}

/* CODE UTILISATEUR DEBUT 4 */

/* CODE UTILISATEUR FIN 4 */ 

/ **

* @brief Cette fonction est exécutée en cas d'occurrence d'erreur. 

* @param Aucun 

* @retval Aucun 

*/ 

annuler Error_Handler (annuler) 

/* CODE UTILISATEUR COMMENCE Error_Handler */ 

/* L'utilisateur peut ajouter sa propre implémentation pour signaler l'état de retour d'erreur HAL */ 

tandis que(1) 

{

}

/* CODE UTILISATEUR FIN Error_Handler */ 

}

#ifdef USE_FULL_ASSERT 

/ **

* @brief Rapporte le nom du fichier source et le numéro de ligne source 

* où l'erreur assert_param s'est produite. 

* @param file : pointeur vers le nom du fichier source 

* @param line : numéro de source de la ligne d'erreur assert_param 

* @retval Aucun 

*/ 

void assert_failed (fichier uint8_t*, ligne uint32_t) 

/* CODE UTILISATEUR DEBUT 6 */ 

/* L'utilisateur peut ajouter sa propre implémentation pour rapporter le nom du fichier et le numéro de ligne, 

ex : printf(« Valeur des paramètres erronée : fichier %s à la ligne %d\r\n », fichier, ligne) */ 

/* CODE UTILISATEUR FIN 6 */ 

}

#endif 

/ **

* @} 

*/ 

/ **

* @} 

*/

/************************ (C) COPYRIGHT STMicroelectronics *****FIN DU FICHIER****/

Les résultats finaux montrent

Jeu Tic-tac-toe basé sur STONE TFT LCD et STM32 IOT PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Source : Platon Data Intelligence