久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5251|回復: 9
收起左側

STM32F103五子棋游戲源程序(觸摸屏)

  [復制鏈接]
ID:670517 發(fā)表于 2019-12-22 17:33 | 顯示全部樓層 |閱讀模式
STM32F103五子棋游戲(觸摸屏)包含源代碼工程、PPT
51hei.png 51hei.png 51hei.png 51hei.png

單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "my_include.h"

  3. /** @addtogroup STM32F10x_StdPeriph_Examples
  4.   * @{
  5.   */
  6.   
  7. //typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

  8. /* Private define ------------------------------------------------------------*/




  9. /* Private macro -------------------------------------------------------------*/
  10. /* Private variables ---------------------------------------------------------*/

  11. //SD_Error Status = SD_OK;



  12. /** @addtogroup GPIO_IOToggle
  13.   * @{
  14.   */

  15. /* Private typedef -----------------------------------------------------------*/
  16. /* Private define ------------------------------------------------------------*/
  17. /* Private macro -------------------------------------------------------------*/
  18. /* Private variables ---------------------------------------------------------*/


  19. /* Private function prototypes -----------------------------------------------*/
  20. /* Private functions ---------------------------------------------------------*/

  21. void GPIO_Configuration(void)//GPIO
  22. {
  23.         GPIO_InitTypeDef GPIO_InitStructure;
  24.        
  25.         /* GPIOD Periph clock enable */
  26.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);

  27.   /* Configure PB0 in output pushpull mode */
  28.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  29.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  31.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  32.        
  33.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  34.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  36.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  37.                
  38.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  39.        
  40.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  41.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  42.        
  43.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
  44.        
  45.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
  46.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  48.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  49.        
  50.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  51.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  52.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  53.        
  54. }

  55. void EXTI_Configuration(void)
  56. {
  57.         EXTI_InitTypeDef EXTI_InitStructure;
  58.        
  59.         EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;
  60.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  61.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  62.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  63.        
  64.         EXTI_Init(&EXTI_InitStructure);
  65. }

  66. void NVIC_Configuration(void)
  67. {
  68.         NVIC_InitTypeDef NVIC_InitStructure;
  69.        
  70.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  71.        
  72.         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  73.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  74.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  75.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  76.         NVIC_Init(&NVIC_InitStructure);
  77.        
  78.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  79.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
  80.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  81.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  82.         NVIC_Init(&NVIC_InitStructure);
  83.        
  84.         NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  85.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  86.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  87.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  88.         NVIC_Init(&NVIC_InitStructure);
  89. }

  90. FRESULT scan_files (
  91.     char* path        /* Start node to be scanned (also used as work area) */
  92. )
  93. {
  94.     FRESULT res;
  95.     FILINFO fno;
  96.     DIR dir;
  97.     int i;
  98.     char *fn;   /* This function is assuming non-Unicode cfg. */
  99. #if _USE_LFN
  100.     static char lfn[_MAX_LFN + 1];   /* Buffer to store the LFN */
  101.     fno.lfname = lfn;
  102.     fno.lfsize = sizeof lfn;
  103. #endif


  104.     res = f_opendir(&dir, path);                       /* Open the directory */
  105.     if (res == FR_OK) {
  106.         i = strlen(path);
  107.         for (;;) {
  108.             res = f_readdir(&dir, &fno);                   /* Read a directory item */
  109.             if (res != FR_OK || fno.fname[0] == 0) break;  /* Break on error or end of dir */
  110.             if (fno.fname[0] == '.') continue;             /* Ignore dot entry */
  111. #if _USE_LFN
  112.             fn = *fno.lfname ? fno.lfname : fno.fname;
  113. #else
  114.             fn = fno.fname;
  115. #endif
  116.             if (fno.fattrib & AM_DIR) {                    /* It is a directory */
  117.                 sprintf(&path[i], "/%s", fn);
  118.                                                         printf("%s/ %d-%d-%d %d:%d:%d\r\n", path, (fno.fdate >> 9) + 1980,(fno.fdate >> 5)&0xf,fno.fdate & 0x1f, \
  119.                                                                 fno.ftime >> 11,(fno.ftime >> 5)&0x3f,(fno.ftime << 1)&0x3f);
  120. //                res = scan_files(path);
  121.                 if (res != FR_OK) break;
  122.                 path[i] = 0;
  123.             } else {                                       /* It is a file. */
  124.                 printf("%s/%s %d-%d-%d %d:%d:%d\r\n", path, fn, (fno.fdate >> 9) + 1980,(fno.fdate >> 5)&0xf,fno.fdate & 0x1f, \
  125.                                                                 fno.ftime >> 11,(fno.ftime >> 5)&0x3f,(fno.ftime << 1)&0x3f);
  126.             }
  127.                                                 delay_ms(10);
  128.         }
  129.         f_closedir(&dir);
  130.     }

  131.     return res;
  132. }


  133. typedef enum
  134. {
  135.         TOUCH_READJUST = 0,
  136.         CHECK_XIAQI,
  137.         REDRAW_QIPAN,
  138.         REDRAW_QIZI,
  139.         GAME_OVER
  140. }APP_Status;

  141. APP_Status app_sta = GAME_OVER;

  142. void DrawQiPan(void);
  143. void ReDrawQizi(void);
  144. APP_Status Check_xiaqi(void);

  145. static char str_buf[128];
  146. char Path[128];
  147. uint32_t len;
  148. FATFS fs;
  149. FIL fl;
  150. DIR dir;
  151. Point *touch_point;
  152. uint8_t re_adjust_flag = 0;
  153. uint8_t white_bushu=0,black_bushu=0;
  154. uint16_t white_tm=0, black_tm=0;
  155. uint8_t turn_white = 1;

  156. static time_t now_tm,old_tm=0;

  157. int8_t qipan_buf[15][15]= {0},white_win = 0;
  158. uint8_t save_buf[200];


  159. extern uint8_t touch_flag;
  160. /**
  161.   * @brief  Main program.
  162.   * @param  None
  163.   * @retval None
  164.   */
  165. int main(void)
  166. {   
  167.         FRESULT  fre;
  168.         GPIO_Configuration();   
  169.         EXTI_Configuration();
  170.         NVIC_Configuration();
  171.         SYS_Tick_Configuration();
  172.         USART1_Configuration();
  173.         RTC_Configuration();
  174.         LCD_Init();
  175.         Touch_Init();
  176.         delay_ms(10);
  177.         LCD_Clear(BLACK);
  178.         delay_ms(1000);
  179.        
  180.         fre = f_mount(&fs,"",0);
  181.         if(fre != FR_OK)
  182.         {
  183.                 printf("文件系統(tǒng)掛載失敗!\r\n");
  184.         }
  185.         else
  186.                 printf("文件系統(tǒng)掛載成功!\r\n");
  187.        
  188.         //LCD_Printf(80,150,"白棋勝!",1616,BLUE,BLACK);
  189.         //Touch_Adjust();
  190.         Get_Touch_Adj();
  191.         LCD_Clear(BLACK);
  192.         DrawQiPan();
  193.        
  194.         while (1)
  195.         {
  196.                 if(app_sta != GAME_OVER)
  197.                 {
  198.                         now_tm = time(NULL);                    //time(NULL)清空RTC歷史時間,得到當前時間
  199.                         if(old_tm != now_tm)
  200.                         {
  201.                                 if(old_tm != 0)
  202.                                 {
  203.                                         if(turn_white)
  204.                                         {
  205.                                                 white_tm += now_tm - old_tm;
  206.                                                 (white_tm < 10) ? sprintf(str_buf,"  %d",white_tm) : ((white_tm < 100) ? sprintf(str_buf," %d",white_tm) : sprintf(str_buf,"%d",white_tm));
  207.                                                 LCD_Printf(84,33,str_buf,1616,RED,GREY);
  208.                                         }
  209.                                         else
  210.                                         {
  211.                                                 black_tm += now_tm - old_tm;
  212.                                                 (black_tm < 10) ? sprintf(str_buf,"  %d",black_tm) : ((black_tm < 100) ? sprintf(str_buf," %d",black_tm) : sprintf(str_buf,"%d",black_tm));
  213.                                                 LCD_Printf(204,33,str_buf,1616,RED,GREY);
  214.                                         }
  215.                                 }
  216.                                 old_tm = now_tm;
  217.                         }
  218.                 }
  219.                 if(re_adjust_flag)                            //判斷是否需要重新校準觸摸屏
  220.                 {
  221.                         app_sta = TOUCH_READJUST;
  222.                         re_adjust_flag = 0;
  223.                 }
  224.                 switch (app_sta)
  225.                 {
  226.                         case TOUCH_READJUST:
  227.                                 TouchReAdjust();
  228.                                 app_sta = REDRAW_QIPAN;
  229.                                 break;
  230.                         case CHECK_XIAQI:
  231.                                 app_sta = Check_xiaqi();
  232.                                 break;
  233.                         case REDRAW_QIPAN:
  234.                                 DrawQiPan();
  235.                                 app_sta = CHECK_XIAQI;
  236.                                 break;
  237.                         case REDRAW_QIZI:
  238.                                 ReDrawQizi();
  239.                                 app_sta = CHECK_XIAQI;
  240.                                 break;
  241.                         case GAME_OVER:
  242.                                 if(white_win != 3)
  243.                                 {
  244.                                         ReDrawQizi();
  245.                                         if(1 == white_win)
  246.                                         {
  247.                                                 LCD_Printf_png(80,150,"白棋勝!",2424,BLUE);
  248.                                         }
  249.                                         else if(-1 == white_win)
  250.                                         {
  251.                                                 LCD_Printf_png(80,150,"黑棋勝!",2424,BLUE);
  252.                                         }
  253.                                         else if(-2 == white_win)
  254.                                         {
  255.                                                 LCD_Printf_png(90,150,"和棋!",2424,BLUE);
  256.                                         }
  257.                                         else if(0 == white_win)
  258.                                         {
  259.                                                 LCD_Printf_png(10,150,"觸摸任意位置開始!",2424,BLUE);
  260.                                         }
  261.                                         white_win = 3;
  262.                                 }
  263.                                 if(touch_flag)
  264.                                 {
  265.                                         delay_ms(10);
  266.                                         if( !Get_Touch_INT )
  267.                                         {
  268.                                                 turn_white = 1;
  269.                                                 white_bushu = 0;
  270.                                                 black_bushu = 0;
  271.                                                 white_tm = 0;
  272.                                                 black_tm = 0;
  273.                                                 memset(qipan_buf,0,sizeof(qipan_buf));
  274.                                                 app_sta = REDRAW_QIPAN;
  275.                                         }
  276.                                 }
  277.                                 break;
  278.                         default:
  279.                                 break;
  280.                 }
  281.         }
  282. }


  283. int8_t CheckOver(void)
  284. {
  285.         uint8_t i,j,m,n;
  286.         int8_t sum;
  287.         for(j=0; j<11; j++)
  288.         {
  289.                 for(i=0; i<11; i++)
  290.                 {
  291.                         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];
  292.                         if(5 == sum)
  293.                         {
  294.                                 return 1;
  295.                         }
  296.                         if(-5 == sum)
  297.                         {
  298.                                 return -1;
  299.                         }
  300.                         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];
  301.                         if(5 == sum)
  302.                         {
  303.                                 return 1;
  304.                         }
  305.                         if(-5 == sum)
  306.                         {
  307.                                 return -1;
  308.                         }
  309.                         for(m=0; m<5; m++)
  310.                         {
  311.                                 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];
  312.                                 if(5 == sum)
  313.                                 {
  314.                                         return 1;
  315.                                 }
  316.                                 if(-5 == sum)
  317.                                 {
  318.                                         return -1;
  319.                                 }
  320.                                 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];
  321.                                 if(5 == sum)
  322.                                 {
  323.                                         return 1;
  324.                                 }
  325.                                 if(-5 == sum)
  326.                                 {
  327.                                         return -1;
  328.                                 }
  329.                         }
  330.                 }
  331.         }
  332.         return 0;
  333. }

  334. APP_Status Check_xiaqi(void)//檢查棋子
  335. {
  336.         uint16_t x,y;
  337.         if(touch_flag)
  338.         {
  339.                 delay_ms(10);
  340.                 if( !Get_Touch_INT )
  341.                 {
  342.                         touch_point = Get_Touch_Point();
  343.                         if(touch_point != NULL)
  344.                         {
  345.                                 if(touch_point->y > 55 && touch_point->y < 295)
  346.                                 {
  347.                                         x = touch_point->x / 16;
  348.                                         y = (touch_point->y - 55) / 16;
  349.                                         if(qipan_buf[y][x] == 0)
  350.                                         {
  351.                                                 if(turn_white)
  352.                                                 {
  353.                                                         qipan_buf[y][x] = 1;
  354.                                                         white_bushu++;
  355.                                                 }
  356.                                                 else
  357.                                                 {
  358.                                                         qipan_buf[y][x] = -1;
  359.                                                         black_bushu++;
  360.                                                 }
  361.                                                 save_buf[white_bushu + black_bushu] = (x << 4) | y;
  362.                                                 turn_white = !turn_white;
  363.                                                 touch_flag = 0;
  364.                                                 white_win = CheckOver();
  365.                                                 if(white_win)
  366.                                                 {
  367.                                                         return GAME_OVER;
  368.                                                 }
  369.                                                 if(white_bushu + black_bushu == 198)
  370.                                                 {
  371.                                                         white_win = 2;
  372.                                                         return GAME_OVER;
  373.                                                 }
  374.                                                 return REDRAW_QIZI;
  375.                                         }
  376.                                 }
  377.                                 else if(touch_point->y > 295)
  378.                                 {
  379.                                         if(touch_point->x > 30 && touch_point->x < 114)                        //重新開始
  380.                                         {
  381.                                                 turn_white = 1;
  382.                                                 white_bushu = 0;
  383.                                                 black_bushu = 0;
  384.                                                 white_tm = 0;
  385.                                                 black_tm = 0;
  386.                                                 memset(qipan_buf,0,sizeof(qipan_buf));
  387.                                                 LCD_Draw_BMP_png(30,298,"/icon/new_btn_down.bmp");
  388.                                                 while(!Get_Touch_INT);
  389.                                                 return REDRAW_QIPAN;
  390.                                         }
  391.                                         else if(touch_point->x > 150 && touch_point->x < 210)        //悔棋
  392.                                         {
  393.                                                 if(white_bushu + black_bushu != 0)
  394.                                                 {
  395.                                                         x = save_buf[white_bushu + black_bushu];
  396.                                                         y = x & 0x0f;
  397.                                                         x = (x >> 4) & 0x0f;
  398.                                                         qipan_buf[y][x] = 0;
  399.                                                         if(turn_white)
  400.                                                         {
  401.                                                                 black_bushu--;
  402.                                                         }
  403.                                                         else
  404.                                                         {
  405.                                                                 white_bushu--;
  406.                                                         }
  407.                                                         turn_white = !turn_white;
  408.                                                         LCD_Draw_BMP_png(150,298,"/icon/back_btn_down.bmp");
  409.                                                         while(!Get_Touch_INT);
  410.                                                         return REDRAW_QIPAN;
  411.                                                 }
  412.                                         }
  413.                                 }
  414.                         }
  415.                         touch_flag = 0;
  416.                 }
  417.         }
  418.         return CHECK_XIAQI;
  419. }

  420. void DrawQiPan(void)//棋盤繪制
  421. {
  422.         uint8_t i;
  423.         LCD_Draw_BMP(0,0,"/icon/b_page.bmp");
  424.         for(i=0; i<15; i++)
  425.         {
  426.                 LCD_Draw_Line(8,63+16*i,232,63+16*i,1,BLACK);
  427.                 LCD_Draw_Line(8+16*i,63,8+16*i,287,1,BLACK);
  428.         }
  429.         LCD_Draw_BMP_png(30,298,"/icon/new_btn_up.bmp");
  430.         LCD_Draw_BMP_png(150,298,"/icon/back_btn_up.bmp");
  431.        
  432.         ReDrawQizi();
  433.        
  434.         LCD_Printf_png(2,33,"白棋:",1616,BLACK);
  435.         LCD_Printf_png(122,33,"黑棋:",1616,BLACK);
  436.        
  437.         (white_bushu < 10)? sprintf(str_buf," %d",white_bushu) : sprintf(str_buf,"%d",white_bushu);
  438.         LCD_Printf(45,33,str_buf,1616,RED,GREY);
  439.         LCD_Printf_png(64,33,"步",1616,RED);
  440.         (white_tm < 10) ? sprintf(str_buf,"  %d",white_tm) : ((white_tm < 100) ? sprintf(str_buf," %d",white_tm) : sprintf(str_buf,"%d",white_tm));
  441.         LCD_Printf(84,33,str_buf,1616,RED,GREY);
  442.         LCD_Printf_png(111,33,"S",1616,RED);
  443.        
  444.         (black_bushu < 10)? sprintf(str_buf," %d",black_bushu) : sprintf(str_buf,"%d",black_bushu);
  445.         LCD_Printf(165,33,str_buf,1616,RED,GREY);
  446.         LCD_Printf_png(184,33,"步",1616,RED);
  447. ……………………

  448. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
源碼+ppt.7z (3.23 MB, 下載次數(shù): 123)
回復

使用道具 舉報

ID:64089 發(fā)表于 2019-12-23 08:48 | 顯示全部樓層
不錯的資料,有心想學,工作事情多根本沒有集中時間研究,謝謝分享!
回復

使用道具 舉報

ID:556851 發(fā)表于 2019-12-23 14:49 | 顯示全部樓層
keil5  嵌入式可以進行嗎?
回復

使用道具 舉報

ID:568763 發(fā)表于 2019-12-24 18:25 | 顯示全部樓層
有生成好的hex文件嗎
回復

使用道具 舉報

ID:568763 發(fā)表于 2019-12-24 19:38 | 顯示全部樓層
為什么我的mini stm32f103用不了啊
回復

使用道具 舉報

ID:664725 發(fā)表于 2019-12-25 10:16 | 顯示全部樓層
我的mini版stm32f103開發(fā)板也是用不了,求指點
回復

使用道具 舉報

ID:27642 發(fā)表于 2019-12-25 12:43 | 顯示全部樓層
收下學習了
回復

使用道具 舉報

ID:673458 發(fā)表于 2019-12-25 13:52 | 顯示全部樓層
厲害了,都可以玩五子棋。牛逼
回復

使用道具 舉報

ID:110875 發(fā)表于 2019-12-25 19:35 | 顯示全部樓層
an是007 發(fā)表于 2019-12-25 10:16
我的mini版stm32f103開發(fā)板也是用不了,求指點

據個人觀察所得,圖片上有一個“悟“字,說明是用探索者,而標題和程序都是103的,矛盾了!!
回復

使用道具 舉報

ID:561907 發(fā)表于 2020-3-5 11:38 | 顯示全部樓層
下了學習,謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久综合 | 国产黄a一级| 一区二区三区视频在线观看 | 久久av一区二区三区 | 日韩有码一区 | 在线观看www视频 | 99re在线视频精品 | 久久国产精品-久久精品 | 超碰日本 | 91在线视频播放 | 日韩在线免费视频 | 久久大陆| 一区二区不卡视频 | 久视频在线观看 | 亚洲午夜在线 | 日韩快播电影网 | 在线观看国产网站 | 一级黄色生活视频 | 资源首页二三区 | 久久久久一区二区三区 | 一级毛片视频在线观看 | 国产精品波多野结衣 | 国产日韩欧美一区 | 国产乱码精品1区2区3区 | 亚洲欧美成人影院 | 亚洲在线视频 | 人人爽人人爽人人片av | 亚洲 欧美 另类 综合 偷拍 | 中文字幕一区二区三区不卡在线 | 免费观看黄色一级片 | 91久久国产精品 | 精品一区二区三区免费视频 | 精品在线一区二区三区 | 欧美久久国产 | 日本五月婷婷 | 久久成人久久 | 国产一区二区在线免费观看 | 日韩av一区二区在线观看 | 91精品欧美久久久久久久 | 国产免费一二三区 | 日韩 欧美 二区 |