IOT

Gioco tic-tac-toe basato su STONE TFT LCD e STM32

Sommario

Tic-tac-toe è un gioco giocato su una griglia 3 per 3, simile a gobang. Prende il nome perché il tabellone generalmente non disegna bordi e le linee della griglia sono disposte in tris. Gli strumenti necessari per il gioco sono solo carta e penna. Quindi, due giocatori che rappresentano O e X, a turno, lasciano segni sulla griglia. Qualsiasi tre segni formano una linea retta, che è il vincitore.

Questo articolo prevede l'utilizzo del microcontrollore STM32 e del display LCD STONE per sviluppare un semplice gioco tic-tac-toe.

Materiali necessari per l'esperimento

Il principio del sistema

Specificare che il primo tocco sullo schermo deve essere O, il secondo tocco sullo schermo è X, ha eseguito questo ciclo. Imposta 8 array per memorizzare il numero di O e X in ogni riga, colonna e diagonale di ogni griglia, finché ce ne sono tre dello stesso segno è la vittoria, quindi ci sarà una casella rossa lampeggiante per dimostrare la vittoria del riga, colonna o diagonale, quindi tocca reimposta per ricominciare il gioco.

Quello che segue è il diagramma di flusso:

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

Progettazione hardware del sistema di visualizzazione LCD STM32 e STONE

(A) Display LCD PIETRA

  1. Design hardware "Tic-tac-toe"

Utilizzare il display LCD STONE di Beijing STONE Technology co., ltd, il modello è STWI070WT-01, con display TFT integrato e controller touch.

Tic-tac-toe Game Based on STONE TFT LCD and STM32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
  1.  STVC070WT-01 caratteristiche del prodotto
Parametro fisico 
Taglia7 pollici
Risoluzione800 × RGB × 480
Spaziatura pixel0.0642 (L) × 0.1790 (A) mm
Colore262,144 colori (18 bit)
Area di visualizzazione154.08 (L) × 85.92 (A) mm
Mostra Dimension186.4mmx105.5mm
Dimensione generale186.4 mm x 105.5 mm x 17.4 mm (tipo standard) 186.4 mm x 105.5 mm x 23.8 mm (con porta Ethernet)
Peso netto300 g
Dsiplay 
Tipo di retroilluminazioneLED
Luminosità300cd/m2 (la luminosità può essere regolabile in 100 livelli)
Confrontare500:1
Vita di retroilluminazione300,000 ore
Angolo di visione70°/70°/50°/70° (L/R/U/D)
Pannello TFTUn pannello industriale di classe
Ampio e luminosoTocco a 4 fili di resistenza/Touch capacitivo/Senza touch screen
Modalità schermo:Digitale
Processore 
CPUCortex A8
Frequenza di aggiornamento1G Hz
Frequenza fotogrammi massima60 FPS
Interfaccia 
Interfaccia serialeLivello RS232 / RS422/RS485 / TTL
Interfaccia Ethernet10 M/100 M (opzionale)
Interfaccia wirelessWi-Fi/Bluetooth (opzionale)
Download del file di progettoPorta USB 2.0 o disco di archiviazione U
Alimentazione di laboratorio 
tensione nominale+12 V CC o +5 V CC
Intervallo di tensione consentito+7 V CC…+28 V CC o +5 V CC
massimo transitori consentiti+ 28V
Tempo tra due transitori50 secondi minimo
Fusibile internoFusibile autoripristinante 2A
Consumo di energia3.0 W
Condizioni ambientali 
massimo temperatura ambiente consentitaOperazioneStorage-20℃~ +70℃-30℃~ +80℃
Umidità relativaOperazioneStorage55℃,85%60℃,90%
Carico d'urtoOperazioneStorage15 g/11 ms25 g/6 ms
VibrazioneOperazioneStorage0.035 mm (10 – 58 Hz)/ 1 g (58 – 500 Hz) 3.5 mm (5 – 8,5 Hz)/ 1 g (8.5 – 500 Hz)
Pressione barometricaOperazioneStorageda 706 a 1030 hPa da 581 a 1030 hPa
Immunità al rumore 
Scarico statico (scarico contatto/scarico aria)EN 61000-4-2 6kV/8kV
Irradiazione RFEN 61000-4-310 V/m, 80% AM1 kHz
Modulazione dell'impulsoENV 50204900 MHz ±5 MHz10 V/meff., 50% ED, 200 Hz
Conduzione RFEN 61000-4-6150 kHz – 80 MHz10 V, 80% AM, 1 kHz
Interferenza burst Linee di alimentazione Linee dati di processo Linee di segnaleEN 61000-4-42kV2kV1kV
Dispositivo di supporto 
Porta UARTSupportoRS232/RS422/RS485/TTL
Porta di reteSupportoPorta Ethernet/Wi-Fi/Bluetooth
Flash MemorySupportoStandard 256 MB, estensione di 1 GB o 2 GB
CicalinoAssistenza
RTCAssistenza
Porta USBSupportoDownload in linea tramite cavo USB
Interfaccia disco di archiviazione USupport.Offline Scarica o copia i dati utente
Ampio e luminoso4 fili di resistenza/capacitivo
Carattere vettorialeFormato TTF standard
ImmagineSupporta il formato PNG/JPG/BMP/SVG/GIF
Interfaccia AudioSupporta il formato WAV La lunghezza del singolo file audio non è limitata, teoricamente fino a 4096 file audio, la potenza dell'altoparlante è di 8 ohm 2 watt o 4 ohm 3 watt
Set di comandiSet di comandi semplificati unificati
Memorie 
Flash MemoryStandard 256 MB, estensione 1 GB o 2 GB
Quantità di memoria per l'immagineIn base alla capacità dell'immagine, suggerisci il formato "PNG, BMP, JPG, SVG, GIF".

(B) Scheda STM32

Utilizzando una scheda STM32, il chip dell'STM32 è CKS32F303.

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

La famiglia STM32 di core ARM Cortex-M0, M0+, M3, M4 e M7 è progettata per applicazioni embedded che richiedono alte prestazioni, basso costo e basso consumo energetico.

  • Alimentazione 2.0V-3.6V
  • Pin I/O compatibili con 5V
  • Eccellente modalità sicura dell'orologio
  • Modalità a basso consumo con funzione di sveglia
  • Oscillatore RC interno
  • Circuito di ripristino integrato
  • Intervallo operativo di temperatura.
  • da -40°C a +85°C o 105°C

Progettazione del software di sistema

Il processo di sviluppo del display LCD STM32 e STONE

1: creare il progetto e caricare le immagini richieste nel progetto.

2: utilizzare il software Stone-designer per creare relazioni associate dinamicamente; i controlli principali sono: “Pulsante”, “immagine”;

3: simulazione software e compilazione per generare file eseguibili.

4: il display LCD è collegato al PC tramite USB e copia il file eseguibile sullo schermo.

Per prima cosa crea un nuovo progetto come mostrato di seguito.

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.

In secondo luogo, importa tutte le immagini nella risorsa

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

Quindi, imposta i controlli dei pulsanti su ciascuna griglia e rendi i pulsanti invisibili. 

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

Non dimenticare di impostare il pulsante di ripristino!

L'effetto finito è mostrato di seguito:

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

Successivamente, aggiungi i controlli dell'immagine a ciascuna griglia allo stesso modo e impostali tutti su immagini bianche.

Infine aggiungi il controllo gif e impostalo su invisibile.

Le parti dell'effetto finito sono mostrate di seguito:

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 di collegamento del circuito

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

Condivisione codice

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

#include "stm32f0xx_hal.h" 

#includi "Uart.h" 

#includi "stringa.h" 

#include "ws2812.h" 

#includi "IWDG.h" 

COLORE_RGB USER_COLORE_RGB; 

unsigned char TX_Mode = 1; //Bit flag tipo di trasmissione 1:232 0:TTL 

carattere non firmato BLINK_2=0; 

carattere non firmato RX3_BUF[32]; //Buffer di ricezione a tre livelli personalizzato 

#define PULSANTE1 0x81 

#define PULSANTE2 0x82 

#define PULSANTE3 0x83 

#define PULSANTE4 0x84 

#define PULSANTE5 0x85 

#define PULSANTE6 0x86 

#define PULSANTE7 0x87 

#define PULSANTE8 0x88 

#define PULSANTE9 0x89 

#define PULSANTE0x0A 

#define CLEAR 0x8E 

senza segno int r_flag1 = 0; 

int quan senza segno[4][2]={0}; 

senza segno int cha [4][2]={0}; 

senza segno int quan_hang1 = 0; 

senza segno int quan_hang2 = 0; 

senza segno int quan_hang3 = 0; 

int senza segno quan_lie1 = 0; 

int senza segno quan_lie2 = 0; 

int senza segno quan_lie3 = 0; 

senza segno int quan_zuoxia = 0; 

int senza segno quan_youxia = 0; 

senza segno int cha_hang1 = 0; 

senza segno int cha_hang2 = 0; 

senza segno int cha_hang3 = 0; 

senza segno int cha_lie1 = 0; 

senza segno int cha_lie2 = 0; 

senza segno int cha_lie3 = 0; 

senza segno int cha_zuoxia = 0; 

senza segno int cha_youxia = 0; //non firmato int r_flag10 = 0; 

void SystemClock_Config(void); 

void Error_Handler(void); 

vuoto statico MX_GPIO_Init(void); 

int main (void) 

uint8_t color_buf = 0; 

//Selezione funzione 

/* Reset di tutte le periferiche, Inizializza l'interfaccia Flash e il Systick. */ 

HAL_Init(); 

/* Configura l'orologio di sistema */ 

Orologio_Sistema_Config(); 

/* Inizializza tutte le periferiche configurate */ 

MX_GPIO_Init(); 

Modalità_TX = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4); 

if(modalità_TX) 

MX_USART1_UART_Init(); 

//232 Inizializzazione 

altro 

MX_USART1_UART_Init2(); 

//Inizializzazione TTl 

while (1) 

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

HAL_NVIC_SystemReset(); 

//Inversione jumper, riavvio e reinizializzazione 

if(MNG_USART1.RX_OVER_FLG ==TRUE) 

// 

Bit di flag ricezione dati seriali 

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

//Metodo 2: Ottieni il nome del controllo a lunghezza fissa 

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(“pulsante1”,(const char *)RX3_BUF))==0) 

//Seleziona controllo

color_buf = PULSANTE1; 

}

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

color_buf = PULSANTE2; 

}

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

color_buf = PULSANTE3; 

}

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

color_buf = PULSANTE4; 

}

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

color_buf = PULSANTE5; 

}

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

color_buf = PULSANTE6; 

}

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

color_buf = PULSANTE7; 

}

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

color_buf = PULSANTE8; 

}

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

color_buf = PULSANTE9; 

}

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

color_buf = PULSANTE0; 

}

interruttore (color_buf) 

caso BUTTON1: 

//se(r_flag1 == 0) 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

r_bandiera1 ^= 1; 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 ^= 1; 

quan_hang1++; 

quan_lie1++; 

quan_youxia++;  

//memset(RX3_BUF,0,7); 

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

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang1++; 

cha_lie1++; 

cha_youxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

//r_flag1 = 1; 

break; 

caso BUTTON2: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang1++; 

quan_lie2++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang1++; 

cha_lie2++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON3: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang1++; 

quan_lie3++; 

quan_zuoxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang1++; 

cha_lie3++; 

cha_zuoxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON4: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang2++; 

quan_lie1++; 

//memset(RX3_BUF,0,7); 

//r_flag10=1; 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang2++; 

cha_lie1++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON5: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang2++; 

quan_lie2++; 

quan_zuoxia++; 

quan_youxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang2++; 

cha_lie2++; 

cha_zuoxia++; 

cha_youxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON6: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang2++; 

quan_lie3++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02))

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang2++; 

cha_lie3++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON7: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang3++; 

quan_lie1++; 

quan_zuoxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang3++; 

cha_lie1++; 

cha_zuoxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON8: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang3++; 

quan_lie2++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang3++; 

cha_lie2++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON9: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 1; 

quan_hang3++; 

quan_lie3++; 

quan_youxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

else if((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

r_bandiera1 = 0; 

cha_hang3++; 

cha_lie3++; 

cha_youxia++; 

//memset(RX3_BUF,0,7); 

color_buf = CANCELLA; 

}

break; 

caso BUTTON0: 

r_bandiera1 = 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((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1);

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

USART_TX_Dati(MNG_USART1); 

//memset(RX3_BUF,0,7); 

memset(MNG_USART1.RX_BUF,0,USART1_RX_LEN); 

break; 

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

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

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

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

}

altrimenti se((quan_hang2==3)||(cha_hang2==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

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

}

altrimenti se((quan_hang3==3)||(cha_hang3==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

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

}

altrimenti se((quan_lie1==3)||(cha_lie1==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

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

}

altrimenti se((quan_lie2==3)||(cha_lie2==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

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

}

altrimenti se((quan_lie3==3)||(cha_lie3==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

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

}

altrimenti se((quan_zuoxia==3)||(cha_zuoxia==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

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

}

altrimenti se((quan_youxia==3)||(cha_youxia==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((carattere *)MNG_USART1.TX_BUF, 

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

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

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

}

/** Configurazione dell'orologio di 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.PLLSate = 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) 

Gestore_Errori(); 

}

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) 

Gestore_Errori(); 

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; 

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; 

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) 

Gestore_Errori(); 

}

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

/* Configurazione dell'interruzione SysTick_IRQn */ 

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 

}

/** Configurazione piedinatura 

*/

vuoto statico MX_GPIO_Init(void) 

GPIO_InitTypeDef GPIO_InitStruct; 

/* Abilita orologio porte 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); 

}

/* CODICE UTENTE BEGIN 4 */

/* FINE CODICE UTENTE 4 */ 

/ **

* @brief Questa funzione viene eseguita in caso di errore. 

* @param Nessuno 

* @retval Nessuno 

*/ 

void Error_Handler(void) 

/* CODICE UTENTE BEGIN Error_Handler */ 

/* L'utente può aggiungere la propria implementazione per segnalare lo stato di ritorno dell'errore HAL */ 

while (1) 

{

}

/* FINE CODICE UTENTE Error_Handler */ 

}

#ifdef USE_FULL_ASSERT 

/ **

* @brief Riporta il nome del file sorgente e il numero della riga sorgente 

* dove si è verificato l'errore assert_param. 

* File @param: puntatore al nome del file sorgente 

* Riga @param: numero sorgente della riga di errore assert_param 

* @retval Nessuno 

*/ 

void assert_failed (file uint8_t*, riga uint32_t) 

/* CODICE UTENTE BEGIN 6 */ 

/* L'utente può aggiungere la propria implementazione per riportare il nome del file e il numero di riga, 

es: printf(“Valore parametri errato: file %s sulla riga %d\r\n”, file, riga) */ 

/* FINE CODICE UTENTE 6 */ 

}

#endif 

/ **

* @} 

*/ 

/ **

* @} 

*/

/************************* (C) COPYRIGHT STMicroelectronics *****FINE DEL FILE****/

I risultati finali mostrano

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

Fonte: Plato Data Intelligence