많이

STONE TFT LCD 및 STM32 기반 틱택토 게임

요약

Tic-tac-toe는 고방과 유사한 3 x 3 그리드에서 진행되는 게임입니다. 보드는 일반적으로 테두리를 그리지 않고 격자선이 틱택토로 배열되어 있기 때문에 이름이 붙여졌습니다. 게임에 필요한 도구는 종이와 펜 뿐입니다. 그런 다음 O와 X를 나타내는 두 명의 플레이어가 번갈아 가며 그리드에 표시를 남깁니다. 세 개의 마크가 직선을 형성하여 승자가 됩니다.

이 기사는 마이크로 컨트롤러 STM32와 STONE LCD 디스플레이를 사용하여 간단한 틱택토 게임을 개발하는 것입니다.

실험에 필요한 재료

시스템 원리

화면의 첫 번째 탭을 O로 지정하고 화면의 두 번째 탭을 X로 지정하고 이 주기를 수행했습니다. 8개의 어레이를 설정하여 각 그리드의 각 행, 열 및 대각선에 O 및 X의 수를 저장합니다. 동일한 마크가 XNUMX개 있는 한 승리하면 빨간색 상자가 깜박이는 상자가 표시되어 승리를 증명합니다. 행, 열 또는 대각선을 누른 다음 재설정을 눌러 게임을 다시 시작합니다.

다음은 순서도입니다.

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

STM32 및 STONE LCD 디스플레이 시스템 하드웨어 설계

(A) STONE LCD 디스플레이

  1. "틱택토 게임" 하드웨어 디자인

Beijing STONE Technology co., ltd의 STONE LCD 디스플레이를 사용합니다. 모델은 STWI070WT-01이며 통합 TFT 디스플레이와 터치 컨트롤러가 있습니다.

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.
  1.  STVC070WT-01 제품 특징
물리적 매개 변수 
크기7 인치
분해능800 × RGB × 480
픽셀 간격0.0642 (W) × 0.1790 (H) mm
색상262,144색(18비트)
보기 영역154.08 (W) × 85.92 (H) mm
디스플레이 치수186.4mmx105.5mm
전반적인 차원186.4mmx105.5mmx17.4mm(표준형)186.4mmx105.5mmx23.8mm(이더넷 포트 포함)
순 무게300g
디스플레이 
백라이트 유형LED
표면 타입300cd/m2(밝기 100단계 조절 가능)
대조500:1
백라이트 수명300,000 시간
시야각70°/70°/50°/70°(L/R/U/D)
TFT 패널A급 산업 패널
터치 스크린4 와이어 저항 터치 / 정전 용량 터치 / 터치 스크린 없음
스크린 모드:디지털
프로세서 
CPU피질 A8
재생률1G Hz
최대 프레임 속도60의 FPS
인터페이스 
직렬 인터페이스RS232 / RS422 / RS485 / TTL 레벨
이더넷 인터페이스10M/100M(옵션)
무선 인터페이스Wi-Fi/블루투스(옵션)
프로젝트 파일 다운로드USB2.0 포트 또는 U 스토리지 디스크
전원 공급 장치 
정격 전압+12V DC 또는 +5V DC
허용 전압 범위+7V DC… +28V DC 또는 +5V DC
최대 허용 과도 현상+ 28V
두 과도 상태 사이의 시간최소 50초
내부 퓨즈2A 자가 복구 퓨즈
전력 소비3.0 승
주변 조건 
최대 허용 주변 온도오퍼레이션스토리지-20℃~ +70℃-30℃~ +80℃
상대 습도오퍼레이션스토리지55℃,85%60℃,90%
충격 하중오퍼레이션스토리지15g/11msec25g/6msec
진동오퍼레이션스토리지0.035mm(10 – 58Hz)/ 1g(58 – 500Hz)3.5mm(5 – 8,5Hz)/ 1g(8.5 – 500Hz)
기압오퍼레이션스토리지706~1030hPa581~1030hPa
소음 내성 
정전기 방전(접촉 방전/공기 방전)EN 61000-4-2 6kV/8kV
RF 조사EN 61000-4-310V/m, 80% AM1kHz
펄스 변조ENV 50204900MHz ±5MHz10V/meff., 50% ED, 200Hz
RF 전도EN 61000-4-6150kHz – 80MHz10V, 80% AM, 1kHz
버스트 간섭공급 라인프로세스 데이터 라인 신호 라인EN 61000-4-42kV2kV1kV
지원 장치 
UART 포트지원RS232 / RS422 / RS485 / TTL
네트워크 포트지원이더넷 포트 / Wi-Fi / 블루투스
플래시 메모리지원표준 256MB, 1GB 또는 2GB 확장
부저고객 지원
RTC고객 지원
USB 포트USB 케이블로 지원온라인 다운로드
U 스토리지 디스크 인터페이스Support.Offline 사용자 데이터 다운로드 또는 복사
터치 스크린4선 저항/용량
벡터 글꼴표준 TTF 형식
영상PNG/JPG/BMP/SVG/GIF 형식 지원
오디오 인터페이스WAV 형식 지원단일 오디오 파일의 길이는 이론적으로 최대 4096개의 오디오 파일로 제한되지 않으며 스피커 전원은 8옴 2와트 또는 4옴 3와트입니다.
명령 세트통합 간소화된 명령 세트
메모리 
플래시 메모리표준 256MB, 확장 1GB 또는 2GB
이미지의 메모리 양이미지의 능력에 따라 "PNG, BMP, JPG, SVG, GIF" 형식을 제안합니다.

(B) STM32 보드

STM32 보드를 사용하는 STM32의 칩은 CKS32F303입니다.

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

ARM Cortex-M32, M0+, M0, M3 및 M4 코어의 STM7 제품군은 고성능, 저비용 및 저전력 소비가 필요한 임베디드 애플리케이션을 위해 설계되었습니다.

  • 2.0V-3.6V 전원 공급 장치
  • 5V 호환 I/O 핀
  • 우수한 안전 시계 모드
  • 웨이크업 기능이 있는 저전력 모드
  • 내부 RC 발진기
  • 임베디드 리셋 회로
  • 작동 온도 범위.
  • -40°C ~ +85°C 또는 105°C

시스템 소프트웨어 설계

STM32 및 STONE LCD 디스플레이의 개발 과정

1: 프로젝트를 만들고 필요한 그림을 프로젝트에 로드합니다.

2: Stone-designer 소프트웨어를 사용하여 동적으로 연결된 관계를 생성합니다. 주요 컨트롤은 "버튼", "이미지"입니다.

3: 실행 파일을 생성하기 위한 소프트웨어 시뮬레이션 및 컴파일.

4: LCD 디스플레이는 USB를 통해 PC에 연결되고 실행 파일을 화면에 복사합니다.

먼저 아래와 같이 새 프로젝트를 만듭니다.

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.
STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

둘째, 모든 이미지를 리소스로 가져옵니다.

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

그런 다음 버튼 컨트롤을 각 그리드로 설정하고 버튼을 보이지 않게 만듭니다. 

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

재설정 버튼을 설정하는 것을 잊지 마십시오!

완성된 효과는 아래와 같습니다.

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

그런 다음 동일한 방식으로 각 그리드에 이미지 컨트롤을 추가하고 모두 흰색 이미지로 설정합니다.

마지막으로 gif 컨트롤을 추가하고 보이지 않게 설정합니다.

완성된 효과의 부분은 다음과 같습니다.

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.
STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.
STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.
STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

회로 연결 다이어그램

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

코드 공유

/* 포함 —————————————————————*/ 

#포함 "stm32f0xx_hal.h" 

#include "Uart.h" 

#include "문자열.h" 

#include "ws2812.h" 

#include “IWDG.h” 

RGB_COLOR 사용자_RGB_COLOR; 

서명되지 않은 문자 TX_Mode = 1; //전송 유형 플래그 비트 1:232 0:TTL 

서명되지 않은 문자 BLINK_2=0; 

서명되지 않은 문자 RX3_BUF[32]; //맞춤형 XNUMX레벨 수신 버퍼 

# 정의 BUTTON1 0x81 

# 정의 BUTTON2 0x82 

# 정의 BUTTON3 0x83 

# 정의 BUTTON4 0x84 

# 정의 BUTTON5 0x85 

# 정의 BUTTON6 0x86 

# 정의 BUTTON7 0x87 

# 정의 BUTTON8 0x88 

# 정의 BUTTON9 0x89 

#define BUTTON0 0x8A 

#define 지우기 0x8E 

부호 없는 정수 r_flag1 = 0; 

부호 없는 정수 quan[4][2]={0}; 

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

부호 없는 정수 quan_hang1 = 0; 

부호 없는 정수 quan_hang2 = 0; 

부호 없는 정수 quan_hang3 = 0; 

부호 없는 정수 quan_lie1 = 0; 

부호 없는 정수 quan_lie2 = 0; 

부호 없는 정수 quan_lie3 = 0; 

부호 없는 정수 quan_zuoxia = 0; 

부호 없는 정수 quan_youxia = 0; 

부호 없는 int cha_hang1 = 0; 

부호 없는 int cha_hang2 = 0; 

부호 없는 int cha_hang3 = 0; 

부호 없는 int cha_lie1 = 0; 

부호 없는 int cha_lie2 = 0; 

부호 없는 int cha_lie3 = 0; 

부호 없는 int cha_zuoxia = 0; 

unsigned int cha_youxia = 0; //부호 없는 int r_flag10 = 0; 

무효 SystemClock_Config(무효); 

무효 Error_Handler(무효); 

정적 무효 MX_GPIO_Init(무효); 

int main (void) 

uint8_t color_buf = 0; 

//함수 선택 

/* 모든 주변 장치를 재설정하고 플래시 인터페이스와 시스템 스틱을 초기화합니다. */ 

HAL_초기화(); 

/* 시스템 클럭 설정 */ 

SystemClock_Config(); 

/* 구성된 모든 주변기기 초기화 */ 

MX_GPIO_초기화(); 

TX_Mode = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4); 

if(TX_모드) 

MX_USART1_UART_Init(); 

//232 초기화 

그렇지 않으면 

MX_USART1_UART_Init2(); 

//TTl 초기화 

동안(1) 

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

HAL_NVIC_SystemReset(); 

//점퍼 반전, 재부팅 및 재초기화 

if(MNG_USART1.RX_OVER_FLG ==참) 

// 

직렬 데이터 수신 플래그 비트 

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

//방법 2: 고정 길이 컨트롤 이름 가져오기 

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

// 컨트롤 선택

color_buf = 버튼1; 

}

if((strcmp("버튼2",(const char *)RX3_BUF))==0) 

color_buf = 버튼2; 

}

if((strcmp("버튼3",(const char *)RX3_BUF))==0) 

color_buf = 버튼3; 

}

if((strcmp("버튼4",(const char *)RX3_BUF))==0) 

color_buf = 버튼4; 

}

if((strcmp("버튼5",(const char *)RX3_BUF))==0) 

color_buf = 버튼5; 

}

if((strcmp("버튼6",(const char *)RX3_BUF))==0) 

color_buf = 버튼6; 

}

if((strcmp("버튼7",(const char *)RX3_BUF))==0) 

color_buf = 버튼7; 

}

if((strcmp("버튼8",(const char *)RX3_BUF))==0) 

color_buf = 버튼8; 

}

if((strcmp("버튼9",(const char *)RX3_BUF))==0) 

color_buf = 버튼9; 

}

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

color_buf = 버튼0; 

}

스위치(color_buf) 

케이스 BUTTON1: 

//if(r_플래그1 == 0) 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

r_플래그1 ^= 1; 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지2\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 ^= 1; 

quan_hang1++; 

quan_lie1++; 

quan_youxia++;  

//멤셋(RX3_BUF,0,7); 

//멤셋(MNG_USART1.RX_BUF,0,USART1_RX_LEN); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지2\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항1++; 

cha_lie1++; 

cha_youxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

//r_플래그1 = 1; 

하다; 

케이스 BUTTON2: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지3\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang1++; 

quan_lie2++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지3\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항1++; 

cha_lie2++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON3: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지4\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang1++; 

quan_lie3++; 

quan_zuoxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지4\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항1++; 

cha_lie3++; 

cha_zuoxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON4: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지5\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang2++; 

quan_lie1++; 

//멤셋(RX3_BUF,0,7); 

//r_flag10=1; 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지5\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항2++; 

cha_lie1++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON5: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지6\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang2++; 

quan_lie2++; 

quan_zuoxia++; 

quan_youxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지6\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항2++; 

cha_lie2++; 

cha_zuoxia++; 

cha_youxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON6: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지7\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang2++; 

quan_lie3++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02))

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지7\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항2++; 

cha_lie3++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON7: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지8\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang3++; 

quan_lie1++; 

quan_zuoxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지8\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항3++; 

cha_lie1++; 

cha_zuoxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON8: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지9\",\"이미지\":\"원\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang3++; 

quan_lie2++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지9\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항3++; 

cha_lie2++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON9: 

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

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지10\",\"이미지\":\"원\ ”}>ET”);

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 1; 

quan_hang3++; 

quan_lie3++; 

quan_youxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

그렇지 않으면((r_flag1 == 1)&&(MNG_USART1.RX_BUF[14] == 0x02)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)MNG_USART1.TX_BUF, 

"ST<{\"cmd_code\":\"set_image\",\"유형\":\"이미지\",\"위젯\":\"이미지10\",\"이미지\":\"x\ ”}>ET”); 

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

USART_TX_데이터(MNG_USART1); 

r_플래그1 = 0; 

차_항3++; 

cha_lie3++; 

cha_youxia++; 

//멤셋(RX3_BUF,0,7); 

color_buf = 지우기; 

}

하다; 

케이스 BUTTON0: 

r_플래그1 = 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((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1);

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(MNG_USART1); 

//멤셋(RX3_BUF,0,7); 

memset(MNG_USART1.RX_BUF,0,USART1_RX_LEN); 

하다; 

기본값 : 

MNG_USART1.RX_OVER_FLG = 거짓; 

하다; 

}

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

if((quan_hang1==3)||(cha_hang1==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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; 

}

그렇지 않으면 if((quan_hang2==3)||(cha_hang2==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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; 

}

그렇지 않으면 if((quan_hang3==3)||(cha_hang3==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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; 

}

그렇지 않으면 if((quan_lie1==3)||(cha_lie1==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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; 

}

그렇지 않으면 if((quan_lie2==3)||(cha_lie2==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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; 

}

그렇지 않으면 if((quan_lie3==3)||(cha_lie3==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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; 

}

그렇지 않으면 if((quan_zuoxia==3)||(cha_zuoxia==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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; 

}

그렇지 않으면((quan_youxia==3)||(cha_youxia==3)) 

memset(MNG_USART1.TX_BUF,0,USART1_TX_LEN); 

sprintf((문자 *)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_데이터(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 = 거짓; 

}

/** 시스템 시계 구성 

*/

무효 SystemClock_Config(무효) 

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.HSIC캘리브레이션 값 = 16; 

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 

RCC_OscInitStruct.PLL.PLL소스 = 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) 

오류_핸들러(); 

}

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) 

오류_핸들러(); 

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; 

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; 

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) 

오류_핸들러(); 

}

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

/* SysTick_IRQn 인터럽트 설정 */ 

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 

}

/** 핀아웃 구성 

*/

정적 무효 MX_GPIO_Init(무효) 

GPIO_InitTypeDef GPIO_InitStruct; 

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

}

/* 사용자 코드 시작 4 */

/* 사용자 코드 끝 4 */ 

/ **

* @brief 에러 발생시 실행되는 함수입니다. 

* @param 없음 

* @retval 없음 

*/ 

무효 Error_Handler(무효) 

/* 사용자 코드 BEGIN Error_Handler */ 

/* 사용자는 HAL 오류 반환 상태를 보고하기 위해 자신의 구현을 추가할 수 있습니다. */ 

동안(1) 

{

}

/* 사용자 코드 END Error_Handler */ 

}

#ifdef USE_FULL_ASSERT 

/ **

* @brief 소스 파일의 이름과 소스 라인 번호를 보고합니다. 

* assert_param 오류가 발생한 곳. 

* @param 파일: 소스 파일 이름에 대한 포인터 

* @param 라인: assert_param 오류 라인 소스 번호 

* @retval 없음 

*/ 

무효 assert_failed(uint8_t* 파일, uint32_t 행) 

/* 사용자 코드 시작 6 */ 

/* 사용자는 파일 이름과 줄 번호를 보고하기 위해 자신의 구현을 추가할 수 있습니다. 

ex: printf("잘못된 매개변수 값: file %s on line %d\r\n", file, line) */ 

/* 사용자 코드 끝 6 */ 

}

#endif 

/ **

* @} 

*/ 

/ **

* @} 

*/

/************************ (C) COPYRIGHT STMicroelectronics *****파일 끝****/

최종 결과 표시

STONE TFT LCD 및 STM32 IOT PlatoBlockchain Data Intelligence를 기반으로 하는 Tic-tac-toe 게임. 수직 검색. 일체 포함.

출처 : Plato Data Intelligence