STM32F103五子棋游戲(觸摸屏)包含源代碼工程、PPT
單片機源程序如下:
- #include "stm32f10x.h"
- #include "my_include.h"
- /** @addtogroup STM32F10x_StdPeriph_Examples
- * @{
- */
-
- //typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- //SD_Error Status = SD_OK;
- /** @addtogroup GPIO_IOToggle
- * @{
- */
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- void GPIO_Configuration(void)//GPIO
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* GPIOD Periph clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
- /* Configure PB0 in output pushpull mode */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- }
- void EXTI_Configuration(void)
- {
- EXTI_InitTypeDef EXTI_InitStructure;
-
- EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
-
- EXTI_Init(&EXTI_InitStructure);
- }
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- FRESULT scan_files (
- char* path /* Start node to be scanned (also used as work area) */
- )
- {
- FRESULT res;
- FILINFO fno;
- DIR dir;
- int i;
- char *fn; /* This function is assuming non-Unicode cfg. */
- #if _USE_LFN
- static char lfn[_MAX_LFN + 1]; /* Buffer to store the LFN */
- fno.lfname = lfn;
- fno.lfsize = sizeof lfn;
- #endif
- res = f_opendir(&dir, path); /* Open the directory */
- if (res == FR_OK) {
- i = strlen(path);
- for (;;) {
- res = f_readdir(&dir, &fno); /* Read a directory item */
- if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */
- if (fno.fname[0] == '.') continue; /* Ignore dot entry */
- #if _USE_LFN
- fn = *fno.lfname ? fno.lfname : fno.fname;
- #else
- fn = fno.fname;
- #endif
- if (fno.fattrib & AM_DIR) { /* It is a directory */
- sprintf(&path[i], "/%s", fn);
- printf("%s/ %d-%d-%d %d:%d:%d\r\n", path, (fno.fdate >> 9) + 1980,(fno.fdate >> 5)&0xf,fno.fdate & 0x1f, \
- fno.ftime >> 11,(fno.ftime >> 5)&0x3f,(fno.ftime << 1)&0x3f);
- // res = scan_files(path);
- if (res != FR_OK) break;
- path[i] = 0;
- } else { /* It is a file. */
- printf("%s/%s %d-%d-%d %d:%d:%d\r\n", path, fn, (fno.fdate >> 9) + 1980,(fno.fdate >> 5)&0xf,fno.fdate & 0x1f, \
- fno.ftime >> 11,(fno.ftime >> 5)&0x3f,(fno.ftime << 1)&0x3f);
- }
- delay_ms(10);
- }
- f_closedir(&dir);
- }
- return res;
- }
- typedef enum
- {
- TOUCH_READJUST = 0,
- CHECK_XIAQI,
- REDRAW_QIPAN,
- REDRAW_QIZI,
- GAME_OVER
- }APP_Status;
- APP_Status app_sta = GAME_OVER;
- void DrawQiPan(void);
- void ReDrawQizi(void);
- APP_Status Check_xiaqi(void);
- static char str_buf[128];
- char Path[128];
- uint32_t len;
- FATFS fs;
- FIL fl;
- DIR dir;
- Point *touch_point;
- uint8_t re_adjust_flag = 0;
- uint8_t white_bushu=0,black_bushu=0;
- uint16_t white_tm=0, black_tm=0;
- uint8_t turn_white = 1;
- static time_t now_tm,old_tm=0;
- int8_t qipan_buf[15][15]= {0},white_win = 0;
- uint8_t save_buf[200];
- extern uint8_t touch_flag;
- /**
- * @brief Main program.
- * @param None
- * @retval None
- */
- int main(void)
- {
- FRESULT fre;
- GPIO_Configuration();
- EXTI_Configuration();
- NVIC_Configuration();
- SYS_Tick_Configuration();
- USART1_Configuration();
- RTC_Configuration();
- LCD_Init();
- Touch_Init();
- delay_ms(10);
- LCD_Clear(BLACK);
- delay_ms(1000);
-
- fre = f_mount(&fs,"",0);
- if(fre != FR_OK)
- {
- printf("文件系統(tǒng)掛載失敗!\r\n");
- }
- else
- printf("文件系統(tǒng)掛載成功!\r\n");
-
- //LCD_Printf(80,150,"白棋勝!",1616,BLUE,BLACK);
- //Touch_Adjust();
- Get_Touch_Adj();
- LCD_Clear(BLACK);
- DrawQiPan();
-
- while (1)
- {
- if(app_sta != GAME_OVER)
- {
- now_tm = time(NULL); //time(NULL)清空RTC歷史時間,得到當前時間
- if(old_tm != now_tm)
- {
- if(old_tm != 0)
- {
- if(turn_white)
- {
- white_tm += now_tm - old_tm;
- (white_tm < 10) ? sprintf(str_buf," %d",white_tm) : ((white_tm < 100) ? sprintf(str_buf," %d",white_tm) : sprintf(str_buf,"%d",white_tm));
- LCD_Printf(84,33,str_buf,1616,RED,GREY);
- }
- else
- {
- black_tm += now_tm - old_tm;
- (black_tm < 10) ? sprintf(str_buf," %d",black_tm) : ((black_tm < 100) ? sprintf(str_buf," %d",black_tm) : sprintf(str_buf,"%d",black_tm));
- LCD_Printf(204,33,str_buf,1616,RED,GREY);
- }
- }
- old_tm = now_tm;
- }
- }
- if(re_adjust_flag) //判斷是否需要重新校準觸摸屏
- {
- app_sta = TOUCH_READJUST;
- re_adjust_flag = 0;
- }
- switch (app_sta)
- {
- case TOUCH_READJUST:
- TouchReAdjust();
- app_sta = REDRAW_QIPAN;
- break;
- case CHECK_XIAQI:
- app_sta = Check_xiaqi();
- break;
- case REDRAW_QIPAN:
- DrawQiPan();
- app_sta = CHECK_XIAQI;
- break;
- case REDRAW_QIZI:
- ReDrawQizi();
- app_sta = CHECK_XIAQI;
- break;
- case GAME_OVER:
- if(white_win != 3)
- {
- ReDrawQizi();
- if(1 == white_win)
- {
- LCD_Printf_png(80,150,"白棋勝!",2424,BLUE);
- }
- else if(-1 == white_win)
- {
- LCD_Printf_png(80,150,"黑棋勝!",2424,BLUE);
- }
- else if(-2 == white_win)
- {
- LCD_Printf_png(90,150,"和棋!",2424,BLUE);
- }
- else if(0 == white_win)
- {
- LCD_Printf_png(10,150,"觸摸任意位置開始!",2424,BLUE);
- }
- white_win = 3;
- }
- if(touch_flag)
- {
- delay_ms(10);
- if( !Get_Touch_INT )
- {
- turn_white = 1;
- white_bushu = 0;
- black_bushu = 0;
- white_tm = 0;
- black_tm = 0;
- memset(qipan_buf,0,sizeof(qipan_buf));
- app_sta = REDRAW_QIPAN;
- }
- }
- break;
- default:
- break;
- }
- }
- }
- int8_t CheckOver(void)
- {
- uint8_t i,j,m,n;
- int8_t sum;
- for(j=0; j<11; j++)
- {
- for(i=0; i<11; i++)
- {
- sum = qipan_buf[j][i] + qipan_buf[j+1][i+1] + qipan_buf[j+2][i+2] + qipan_buf[j+3][i+3] + qipan_buf[j+4][i+4];
- if(5 == sum)
- {
- return 1;
- }
- if(-5 == sum)
- {
- return -1;
- }
- sum = qipan_buf[j][i+4] + qipan_buf[j+1][i+3] + qipan_buf[j+2][i+2] + qipan_buf[j+3][i+1] + qipan_buf[j+4][i];
- if(5 == sum)
- {
- return 1;
- }
- if(-5 == sum)
- {
- return -1;
- }
- for(m=0; m<5; m++)
- {
- sum = qipan_buf[j+m][i] + qipan_buf[j+m][i+1] + qipan_buf[j+m][i+2] + qipan_buf[j+m][i+3] + qipan_buf[j+m][i+4];
- if(5 == sum)
- {
- return 1;
- }
- if(-5 == sum)
- {
- return -1;
- }
- sum = qipan_buf[j][i+m] + qipan_buf[j+1][i+m] + qipan_buf[j+2][i+m] + qipan_buf[j+3][i+m] + qipan_buf[j+4][i+m];
- if(5 == sum)
- {
- return 1;
- }
- if(-5 == sum)
- {
- return -1;
- }
- }
- }
- }
- return 0;
- }
- APP_Status Check_xiaqi(void)//檢查棋子
- {
- uint16_t x,y;
- if(touch_flag)
- {
- delay_ms(10);
- if( !Get_Touch_INT )
- {
- touch_point = Get_Touch_Point();
- if(touch_point != NULL)
- {
- if(touch_point->y > 55 && touch_point->y < 295)
- {
- x = touch_point->x / 16;
- y = (touch_point->y - 55) / 16;
- if(qipan_buf[y][x] == 0)
- {
- if(turn_white)
- {
- qipan_buf[y][x] = 1;
- white_bushu++;
- }
- else
- {
- qipan_buf[y][x] = -1;
- black_bushu++;
- }
- save_buf[white_bushu + black_bushu] = (x << 4) | y;
- turn_white = !turn_white;
- touch_flag = 0;
- white_win = CheckOver();
- if(white_win)
- {
- return GAME_OVER;
- }
- if(white_bushu + black_bushu == 198)
- {
- white_win = 2;
- return GAME_OVER;
- }
- return REDRAW_QIZI;
- }
- }
- else if(touch_point->y > 295)
- {
- if(touch_point->x > 30 && touch_point->x < 114) //重新開始
- {
- turn_white = 1;
- white_bushu = 0;
- black_bushu = 0;
- white_tm = 0;
- black_tm = 0;
- memset(qipan_buf,0,sizeof(qipan_buf));
- LCD_Draw_BMP_png(30,298,"/icon/new_btn_down.bmp");
- while(!Get_Touch_INT);
- return REDRAW_QIPAN;
- }
- else if(touch_point->x > 150 && touch_point->x < 210) //悔棋
- {
- if(white_bushu + black_bushu != 0)
- {
- x = save_buf[white_bushu + black_bushu];
- y = x & 0x0f;
- x = (x >> 4) & 0x0f;
- qipan_buf[y][x] = 0;
- if(turn_white)
- {
- black_bushu--;
- }
- else
- {
- white_bushu--;
- }
- turn_white = !turn_white;
- LCD_Draw_BMP_png(150,298,"/icon/back_btn_down.bmp");
- while(!Get_Touch_INT);
- return REDRAW_QIPAN;
- }
- }
- }
- }
- touch_flag = 0;
- }
- }
- return CHECK_XIAQI;
- }
- void DrawQiPan(void)//棋盤繪制
- {
- uint8_t i;
- LCD_Draw_BMP(0,0,"/icon/b_page.bmp");
- for(i=0; i<15; i++)
- {
- LCD_Draw_Line(8,63+16*i,232,63+16*i,1,BLACK);
- LCD_Draw_Line(8+16*i,63,8+16*i,287,1,BLACK);
- }
- LCD_Draw_BMP_png(30,298,"/icon/new_btn_up.bmp");
- LCD_Draw_BMP_png(150,298,"/icon/back_btn_up.bmp");
-
- ReDrawQizi();
-
- LCD_Printf_png(2,33,"白棋:",1616,BLACK);
- LCD_Printf_png(122,33,"黑棋:",1616,BLACK);
-
- (white_bushu < 10)? sprintf(str_buf," %d",white_bushu) : sprintf(str_buf,"%d",white_bushu);
- LCD_Printf(45,33,str_buf,1616,RED,GREY);
- LCD_Printf_png(64,33,"步",1616,RED);
- (white_tm < 10) ? sprintf(str_buf," %d",white_tm) : ((white_tm < 100) ? sprintf(str_buf," %d",white_tm) : sprintf(str_buf,"%d",white_tm));
- LCD_Printf(84,33,str_buf,1616,RED,GREY);
- LCD_Printf_png(111,33,"S",1616,RED);
-
- (black_bushu < 10)? sprintf(str_buf," %d",black_bushu) : sprintf(str_buf,"%d",black_bushu);
- LCD_Printf(165,33,str_buf,1616,RED,GREY);
- LCD_Printf_png(184,33,"步",1616,RED);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
源碼+ppt.7z
(3.23 MB, 下載次數(shù): 123)
2019-12-22 21:21 上傳
點擊文件名下載附件
|