IOT

Joc Tic-tac-toe bazat pe STONE TFT LCD și STM32

Rezumat

Tic-tac-toe este un joc jucat pe o grilă de 3 pe 3, similar cu gobang. Își primește numele deoarece tabla nu desenează, în general, granițe, iar liniile grilei sunt aranjate în tic-tac-toe. Instrumentele necesare pentru joc sunt doar hârtie și stilou. Apoi, doi jucători care reprezintă O și X lasă pe rând semne pe grilă. Oricare trei semne formează o linie dreaptă, care este câștigătoare.

Acest articol este de a folosi microcontrolerul STM32 și afișajul STONE LCD pentru a dezvolta un joc simplu tic-tac-toe.

Materiale necesare experimentului

Principiul sistemului

Specificați prima atingere pe ecran trebuie să fie O, a doua atingere pe ecran este X, a făcut acest ciclu. Setați 8 matrice pentru a stoca numărul de O și X în fiecare rând, coloană și diagonală a fiecărei grile, atâta timp cât există trei de aceeași marcă este victoria, atunci va exista o casetă roșie intermitentă pentru a dovedi victoria. rând, coloană sau diagonală, apoi atingeți resetare pentru a începe din nou jocul.

Următoarea este diagrama fluxului:

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

Design hardware STM32 și STONE LCD Display System

(A) Afișaj LCD STONE

  1. Design hardware „Joc tic-tac-toe”.

Utilizați afișajul STONE LCD de la Beijing STONE Technology co., Ltd, modelul este STWI070WT-01, cu afișaj TFT integrat și controler tactil.

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
  1.  STVC070WT-01 caracteristicile produsului
Parametru fizic 
Mărimea7 inch
Rezoluţie800 × 480 × RGB
Spațiu pixeli0.0642 (W) × 0.1790 (H) mm
Culori262,144 culori (18 biți)
Zona de vizualizare154.08 (W) × 85.92 (H) mm
Dimensiunea afișajului186.4mmx105.5mm
Dimensiuni generale186.4 mm x 105.5 mm x 17.4 mm (tip standard) 186.4 mm x 105.5 mm x 23.8 mm (cu port Ethernet)
Greutate Netă300g
Afişa 
Tip de iluminare din spateLED-uri
Strălucire300cd/m2 (luminozitatea poate fi reglabilă în 100 de niveluri)
Contrast500:1
Viața de fundal300,000 oră
Unghi de vizualizare70°/70°/50°/70° (L/R/U/D)
Panou TFTUn panel al industriei de clasă
Touch ScreenRezistență la atingere cu 4 fire / Atingere capacitivă / Fără ecran tactil
Modul ecran:Digital
procesor 
ProcesorCortex A8
Rată de reîmprospătare1G Hz
Rata maximă de cadre60 FPS
interfaţă 
Interfață serialăNivel RS232 / RS422 / RS485 / TTL
Interfață Ethernet10M/100M (Opțional)
Interfață wirelessWi-Fi / Bluetooth (Opțional)
Descărcare fișier proiectPort USB2.0 sau disc de stocare U
Alimentare electrică 
Tensiune nominală+12V DC sau +5V DC
Domeniul de tensiune admisibil+7V DC...+28V DC sau +5V DC
Max. tranzitorii admisibile+ 28V
Timpul dintre două tranzitorii50 de secunde minim
Siguranță internăSiguranță cu auto-recuperare 2A
Consumul de energie3.0 W
Conditii ambientale 
Max. temperatura ambientală admisăOperațiune Stocare-20℃~ +70℃-30℃~ +80℃
Umiditate relativăOperațiune Stocare55℃,85%60℃,90%
Încărcare de șocOperațiune Stocare15 g/11 msec25 g/6 msec
VibrațieOperațiune Stocare0.035 mm (10 – 58 Hz)/ 1 g (58 – 500 Hz) 3.5 mm (5 – 8,5 Hz)/ 1 g (8.5 – 500 Hz)
Presiune barometricăOperațiune Stocare706 până la 1030 hPa581 până la 1030 hPa
Imunitate la zgomot 
Descărcare statică (descărcare prin contact/descărcare în aer)EN 61000-4-2 6 kV/8 kV
iradiere RFEN 61000-4-310 V/m, 80% AM1 kHz
Modulația pulsuluiENV 50204900 MHz ±5 MHz10 V/meff., 50% ED, 200 Hz
Conducție RFEN 61000-4-6150 kHz – 80 MHz10 V, 80% AM, 1 kHz
Interferență în explozie Linii de alimentare Linii de date de proces Linii de semnalEN 61000-4-42kV2kV1kV
Dispozitiv de asistență 
Portul UARTSuport RS232 / RS422 / RS485 / TTL
Portul de rețeaSuport Ethernet / Wi-Fi / Bluetooth
Memorie flashSuport Standard 256 MB, Extend 1 GB sau 2 GB
SirenăSuport
RTCSuport
Port USBAsistență Descărcare online prin cablu USB
U Interfața discului de stocareAsistență. Descărcați sau copiați datele utilizatorului offline
Touch Screen4 fire de rezistență / capacitiv
Font vectorialFormat TTF standard
ImagineSuport format PNG/JPG/BMP/SVG/GIF
Interfata audioSuport format WAV Lungimea unui singur fișier audio nu este limitată, teoretic până la 4096 fișiere audio, puterea difuzorului este de 8 ohmi 2 wați sau 4 ohmi 3 wați
Set de comenziSeturi de comenzi simplificate unificate
Memorie 
Memorie flashStandard 256 MB, extensie 1 GB sau 2 GB
Cantitatea de memorie pentru imagineÎn funcție de capacitatea imaginii, sugerați formatul „PNG, BMP, JPG, SVG, GIF”.

(B) Placă STM32

Folosind o placă STM32, cipul STM32 este CKS32F303.

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

Familia STM32 de nuclee ARM Cortex-M0, M0+, M3, M4 și M7 este proiectată pentru aplicații încorporate care necesită performanță ridicată, costuri reduse și consum redus de energie.

  • Sursa de alimentare 2.0V-3.6V
  • Pini I/O compatibili cu 5V
  • Mod excelent ceas sigur
  • Mod de putere redusă cu funcție de trezire
  • Oscilator RC intern
  • Circuit de resetare încorporat
  • Gama de temperatură de funcționare.
  • -40°C până la +85°C sau 105°C

Proiectare software de sistem

Procesul de dezvoltare a afișajului LCD STM32 și STONE

1: creați proiectul și încărcați imaginile necesare în proiect.

2: utilizați software-ul Stone-designer pentru a crea relații asociate dinamic; comenzile principale sunt: ​​„Buton”, „imagine”;

3: simulare software și compilare pentru a genera fișiere executabile.

4: display-ul LCD este conectat la PC prin USB și copiați fișierul executabil pe ecran.

Mai întâi creați un nou proiect, așa cum se arată mai jos.

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

În al doilea rând, importați toate imaginile în resursă

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

Apoi, setați butoanele de control pentru fiecare grilă și faceți butoanele invizibile. 

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

Nu uitați să setați butonul de resetare!

Efectul final este prezentat mai jos:

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

După aceea, adăugați comenzi de imagine la fiecare grilă în același mod și setați-le pe toate la imagini albe.

În cele din urmă adăugați controlul gif și setați-l la invizibil.

Părțile efectului finit sunt prezentate mai jos:

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

Schema de conectare a circuitului

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

Distribuie codul

/* Include ——————————————————————*/ 

#include „stm32f0xx_hal.h” 

#include „Uart.h” 

#include „string.h” 

#include „ws2812.h” 

#include „IWDG.h” 

RGB_COLOR USER_RGB_COLOR; 

caracter nesemnat TX_Mode = 1; //Tip de transmisie bit de semnalizare 1:232 0:TTL 

caracter nesemnat BLINK_2=0; 

caracter nesemnat RX3_BUF[32]; //Buffer de primire cu trei niveluri personalizat 

#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 CLEAR 0x8E 

unsigned int r_flag1 = 0; 

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

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

unsigned int quan_hang1 = 0; 

unsigned int quan_hang2 = 0; 

unsigned int quan_hang3 = 0; 

unsigned int quan_lie1 = 0; 

unsigned int quan_lie2 = 0; 

unsigned int quan_lie3 = 0; 

unsigned int quan_zuoxia = 0; 

unsigned int quan_youxia = 0; 

unsigned int cha_hang1 = 0; 

unsigned int cha_hang2 = 0; 

unsigned int cha_hang3 = 0; 

unsigned int cha_lie1 = 0; 

unsigned int cha_lie2 = 0; 

unsigned int cha_lie3 = 0; 

unsigned int cha_zuoxia = 0; 

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

void SystemClock_Config(void); 

void Error_Handler(void); 

static void MX_GPIO_Init(void); 

int principal (void) 

uint8_t color_buf = 0; 

//Selectarea funcției 

/* Resetarea tuturor perifericelor, Inițializează interfața Flash și Systick-ul. */ 

HAL_Init(); 

/* Configurați ceasul sistemului */ 

SystemClock_Config(); 

/* Inițializați toate perifericele configurate */ 

MX_GPIO_Init(); 

TX_Mode = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4); 

if(TX_Mode) 

MX_USART1_UART_Init(); 

//232 Inițializare 

altfel 

MX_USART1_UART_Init2(); 

//TTl Inițializare 

în timp ce (1) 

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

HAL_NVIC_SystemReset(); 

//Inversarea jumperului, repornirea și reinițializarea 

if(MNG_USART1.RX_OVER_FLG ==TRUE) 

// 

Bit de semnalizare de primire a datelor seriale 

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

//Metoda 2: Obțineți numele de control al lungimii 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(„button1”,(const char *)RX3_BUF))==0) 

//Selectați controlul

color_buf = BUTTON1; 

}

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

color_buf = BUTTON2; 

}

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

color_buf = BUTTON3; 

}

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

color_buf = BUTTON4; 

}

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

color_buf = BUTTON5; 

}

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

color_buf = BUTTON6; 

}

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

color_buf = BUTTON7; 

}

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

color_buf = BUTTON8; 

}

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

color_buf = BUTTON9; 

}

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

color_buf = BUTTON0; 

}

comutare (color_buf) 

caz BUTTON1: 

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

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

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

USART_TX_Data(MNG_USART1); 

r_flag1 ^= 1; 

quan_hang1++; 

quan_lie1++; 

quan_youxia++;  

//memset(RX3_BUF,0,7); 

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

color_buf = CLEAR; 

}

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

color_buf = CLEAR; 

}

//r_flag1 = 1; 

rupe; 

caz BUTTON2: 

if((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\”:\”cerc\ ”}>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); 

color_buf = CLEAR; 

}

else if((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((const char *)MNG_USART1.TX_BUF); 

USART_TX_Data(MNG_USART1); 

r_flag1 = 0; 

cha_hang1++; 

cha_lie2++; 

//memset(RX3_BUF,0,7); 

color_buf = CLEAR; 

}

rupe; 

caz BUTTON3: 

if((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\”:\”cerc\ ”}>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); 

color_buf = CLEAR; 

}

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

color_buf = CLEAR; 

}

rupe; 

caz BUTTON4: 

if((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\”:\”cerc\ ”}>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; 

color_buf = CLEAR; 

}

else if((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((const char *)MNG_USART1.TX_BUF); 

USART_TX_Data(MNG_USART1); 

r_flag1 = 0; 

cha_hang2++; 

cha_lie1++; 

//memset(RX3_BUF,0,7); 

color_buf = CLEAR; 

}

rupe; 

caz BUTTON5: 

if((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\”:\”cerc\ ”}>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); 

color_buf = CLEAR; 

}

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

color_buf = CLEAR; 

}

rupe; 

caz BUTTON6: 

if((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\”:\”cerc\ ”}>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); 

color_buf = CLEAR; 

}

else if((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((const char *)MNG_USART1.TX_BUF); 

USART_TX_Data(MNG_USART1); 

r_flag1 = 0; 

cha_hang2++; 

cha_lie3++; 

//memset(RX3_BUF,0,7); 

color_buf = CLEAR; 

}

rupe; 

caz BUTTON7: 

if((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\”:\”cerc\ ”}>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); 

color_buf = CLEAR; 

}

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

color_buf = CLEAR; 

}

rupe; 

caz BUTTON8: 

if((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\”:\”cerc\ ”}>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); 

color_buf = CLEAR; 

}

else if((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((const char *)MNG_USART1.TX_BUF); 

USART_TX_Data(MNG_USART1); 

r_flag1 = 0; 

cha_hang3++; 

cha_lie2++; 

//memset(RX3_BUF,0,7); 

color_buf = CLEAR; 

}

rupe; 

caz BUTTON9: 

if((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\”:\”cerc\ ”}>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); 

color_buf = CLEAR; 

}

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

color_buf = CLEAR; 

}

rupe; 

caz BUTTON0: 

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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((const char *)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((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); 

rupe; 

implicit: 

MNG_USART1.RX_OVER_FLG = FALS; 

rupe; 

}

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

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

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

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

USART_TX_Data(MNG_USART1); 

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

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

quan_zuoxia=quan_youxia=cha_zuoxia=cha_youxia=0; 

}

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

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

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

USART_TX_Data(MNG_USART1); 

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

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

quan_zuoxia=quan_youxia=cha_zuoxia=cha_youxia=0; 

}

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

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

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

USART_TX_Data(MNG_USART1); 

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

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

quan_zuoxia=quan_youxia=cha_zuoxia=cha_youxia=0; 

}

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

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

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

USART_TX_Data(MNG_USART1); 

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

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

quan_zuoxia=quan_youxia=cha_zuoxia=cha_youxia=0; 

MNG_USART1.RX_OVER_FLG = FALS; 

}

/** Configurarea ceasului sistemului 

*/

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

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; 

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; 

RCC_OscInitStruct.PLL.PREDV = RCC_PREDIV_DIV1; 

dacă (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; 

dacă (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) 

Error_Handler(); 

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; 

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; 

dacă (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) 

Error_Handler(); 

}

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

/* Configurarea întreruperii SysTick_IRQn */ 

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 

}

/** Configurație pinout 

*/

static void MX_GPIO_Init(void) 

GPIO_InitTypeDef GPIO_InitStruct; 

/* Activare ceas porturi 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); 

}

/* COD UTILIZATOR ÎNCEPE 4 */

/* COD UTILIZATOR END 4 */ 

/ **

* @brief Această funcție este executată în cazul apariției unei erori. 

* @param Nici unul 

* @retval Nici unul 

*/ 

void Error_Handler(void) 

/* COD UTILIZATOR BEGIN Error_Handler */ 

/* Utilizatorul își poate adăuga propria implementare pentru a raporta starea de returnare a erorii HAL */ 

în timp ce (1) 

{

}

/* COD UTILIZATOR END Error_Handler */ 

}

#ifdef USE_FULL_ASSERT 

/ **

* @brief Raportează numele fișierului sursă și numărul liniei sursă 

* unde a apărut eroarea assert_param. 

* Fișier @param: indicator către numele fișierului sursă 

* @param line: numărul sursei liniei de eroare assert_param 

* @retval Nici unul 

*/ 

void assert_failed (fișier uint8_t*, linie uint32_t) 

/* COD UTILIZATOR ÎNCEPE 6 */ 

/* Utilizatorul își poate adăuga propria implementare pentru a raporta numele fișierului și numărul rândului, 

ex: printf(„Valoare greșită a parametrilor: fișier %s pe linia %d\r\n”, fișier, linie) */ 

/* COD UTILIZATOR END 6 */ 

}

#endif 

/ **

* @} 

*/ 

/ **

* @} 

*/

/************************ (C) COPYRIGHT STMicroelectronics *****SFÂRȘIT FIȘIER****/

Rezultatele finale arată

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

Sursa: Plato Data Intelligence