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

標題: STM32F103五子棋游戲源程序(觸摸屏) [打印本頁]

作者: 菜雞卡羅特    時間: 2019-12-22 17:33
標題: STM32F103五子棋游戲源程序(觸摸屏)
STM32F103五子棋游戲(觸摸屏)包含源代碼工程、PPT


單片機源程序如下:
  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("文件系統掛載失敗!\r\n");
  184.         }
  185.         else
  186.                 printf("文件系統掛載成功!\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, 下載次數: 123)



作者: nsj21n    時間: 2019-12-23 08:48
不錯的資料,有心想學,工作事情多根本沒有集中時間研究,謝謝分享!
作者: ykx820    時間: 2019-12-23 14:49
keil5  嵌入式可以進行嗎?
作者: MONKEY529S    時間: 2019-12-24 18:25
有生成好的hex文件嗎
作者: MONKEY529S    時間: 2019-12-24 19:38
為什么我的mini stm32f103用不了啊
作者: an是007    時間: 2019-12-25 10:16
我的mini版stm32f103開發板也是用不了,求指點
作者: d5642698    時間: 2019-12-25 12:43
收下學習了
作者: alphakeane    時間: 2019-12-25 13:52
厲害了,都可以玩五子棋。牛逼
作者: 13118302007    時間: 2019-12-25 19:35
an是007 發表于 2019-12-25 10:16
我的mini版stm32f103開發板也是用不了,求指點

據個人觀察所得,圖片上有一個“悟“字,說明是用探索者,而標題和程序都是103的,矛盾了!!
作者: x88484532    時間: 2020-3-5 11:38
下了學習,謝謝分享




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久亚洲国产精品 | 色婷婷精品国产一区二区三区 | 一区二区三区欧美在线 | 精品国产精品国产偷麻豆 | 国产乱码精品一区二区三区中文 | 日产久久| 黄色网一级片 | 天天看天天爽 | 成人一区二区三区在线观看 | www.亚洲一区二区 | 成人国产精品久久久 | 成人小视频在线观看 | 国产高清在线精品 | 午夜av一区二区 | 天堂一区二区三区 | 日韩国产一区二区 | 天天操天天天干 | 影视先锋av资源噜噜 | 毛片韩国| 二区三区视频 | 日韩三级在线观看 | www.日本国产| 男女爱爱福利视频 | 精品一区在线看 | 韩日av片 | 国产午夜影院 | 日本成人三级电影 | 亚洲精品一区二区在线观看 | 夜操| 国产91在线 | 亚洲 | 日本在线播放一区二区 | 男女羞羞网站 | 午夜影院| 国产亚洲精品久久午夜玫瑰园 | 欧美一区二区三区在线播放 | 国产一区二区三区免费观看在线 | 国产亚洲欧美日韩精品一区二区三区 | 盗摄精品av一区二区三区 | 自拍视频国产 | 国产精品综合视频 | 国产专区免费 |