找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6955|回复: 8
打印 上一主题 下一主题
收起左侧

自制stm32小游戏,类似打地鼠

  [复制链接]
跳转到指定楼层
楼主
ID:225148 发表于 2017-8-6 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了不到一天时间,就自己瞎玩一玩,大家看看,哈哈哈

所有资料51hei提供下载:
实验40 踩百块哈哈哈.rar (1.21 MB, 下载次数: 136)


stm32单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "key.h"  
  7. #include "sram.h"   
  8. #include "malloc.h"
  9. #include "usmart.h"  
  10. #include "sdio_sdcard.h"   
  11. #include "malloc.h"
  12. #include "w25qxx.h"   
  13. #include "ff.h"  
  14. #include "timer.h"
  15. #include "exfuns.h"   
  16. #include "fontupd.h"
  17. #include "text.h"       
  18. #include "rng.h"
  19. #include "touch.h"
  20. #include "rtc.h"

  21. //ALIENTEK 探索者STM32F407开发板 实验40
  22. //汉字显示 实验 -库函数版本

  23. //清空屏幕并在右上角显示"RST"    t

  24. u32 qwer;

  25. u32 random=300;
  26. u32 dom=300;

  27. u32 miao;



  28. void TIM3_IRQHandler(void)
  29. {
  30.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
  31. {  
  32.         miao++;
  33.         LCD_ShowNum(30+3*16,170,miao,5,16); //shijian

  34. }
  35.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
  36. }


  37. void Load_Drow_Dialog(void)
  38. {
  39. //        LCD_Clear(WHITE);//清屏   
  40.         POINT_COLOR=BLUE;//设置字体为蓝色
  41.         LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
  42.           POINT_COLOR=RED;//设置画笔蓝色
  43. }
  44. ////////////////////////////////////////////////////////////////////////////////
  45. //电容触摸屏专有部分
  46. //画水平线
  47. //x0,y0:坐标
  48. //len:线长度
  49. //color:颜色
  50. void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
  51. {
  52.         if(len==0)return;
  53.         LCD_Fill(x0,y0,x0+len-1,y0,color);       
  54. }
  55. //画实心圆
  56. //x0,y0:坐标
  57. //r:半径
  58. //color:颜色
  59. void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
  60. {                                                                                          
  61.         u32 i;
  62.         u32 imax = ((u32)r*707)/1000+1;
  63.         u32 sqmax = (u32)r*(u32)r+(u32)r/2;
  64.         u32 x=r;
  65.         gui_draw_hline(x0-r,y0,2*r,color);
  66.         for (i=1;i<=imax;i++)
  67.         {
  68.                 if ((i*i+x*x)>sqmax)// draw lines from outside  
  69.                 {
  70.                         if (x>imax)
  71.                         {
  72.                                 gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
  73.                                 gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
  74.                         }
  75.                         x--;
  76.                 }
  77.                 // draw lines from inside (center)  
  78.                 gui_draw_hline(x0-x,y0+i,2*x,color);
  79.                 gui_draw_hline(x0-x,y0-i,2*x,color);
  80.         }
  81. }  
  82. //两个数之差的绝对值
  83. //x1,x2:需取差值的两个数
  84. //返回值:|x1-x2|
  85. u16 my_abs(u16 x1,u16 x2)
  86. {                         
  87.         if(x1>x2)return x1-x2;
  88.         else return x2-x1;
  89. }  
  90. //画一条粗线
  91. //(x1,y1),(x2,y2):线条的起始坐标
  92. //size:线条的粗细程度
  93. //color:线条的颜色
  94. void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
  95. {
  96.         u16 t;
  97.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  98.         int incx,incy,uRow,uCol;
  99.         if(x1<size|| x2<size||y1<size|| y2<size)return;
  100.         delta_x=x2-x1; //计算坐标增量
  101.         delta_y=y2-y1;
  102.         uRow=x1;
  103.         uCol=y1;
  104.         if(delta_x>0)incx=1; //设置单步方向
  105.         else if(delta_x==0)incx=0;//垂直线
  106.         else {incx=-1;delta_x=-delta_x;}
  107.         if(delta_y>0)incy=1;
  108.         else if(delta_y==0)incy=0;//水平线
  109.         else{incy=-1;delta_y=-delta_y;}
  110.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  111.         else distance=delta_y;
  112.         for(t=0;t<=distance+1;t++ )//画线输出
  113.         {  
  114.                 gui_fill_circle(uRow,uCol,size,color);//画点
  115.                 xerr+=delta_x ;
  116.                 yerr+=delta_y ;
  117.                 if(xerr>distance)
  118.                 {
  119.                         xerr-=distance;
  120.                         uRow+=incx;
  121.                 }
  122.                 if(yerr>distance)
  123.                 {
  124.                         yerr-=distance;
  125.                         uCol+=incy;
  126.                 }
  127.         }  
  128. }   
  129. ////////////////////////////////////////////////////////////////////////////////
  130. //5个触控点的颜色(电容触摸屏用)                                                                                                 
  131. const u16 POINT_COLOR_TBL[OTT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};  
  132. ////电阻触摸屏测试函数
  133. void rtp_test(void)
  134. {
  135.         u8 key;
  136.         u8 i=0;          
  137.         while(1)
  138.         {
  139.                  key=KEY_Scan(0);
  140.                 tp_dev.scan(0);                  
  141.                 if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  142.                 {       
  143.                          if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
  144.                         {       
  145.                                 if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
  146.                                 else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);                //画图                                    
  147.                         }
  148.                 }else delay_ms(10);        //没有按键按下的时候             
  149.                 if(key==KEY0_PRES)        //KEY0按下,则执行校准程序
  150.                 {
  151.                         LCD_Clear(WHITE);        //清屏
  152.                     TP_Adjust();                  //屏幕校准
  153.                         TP_Save_Adjdata();         
  154.                         Load_Drow_Dialog();
  155.                 }
  156.                 i++;
  157.         //        if(i%20==0)LED0=!LED0;
  158.         }
  159. }
  160. //电容触摸屏测试函数




  161. void ctp_test(void)
  162. {
  163.        
  164.         u8 t=0;
  165.         u8 i=0;                      
  166.         u16 lastpos[5][2];                //最后一次的数据
  167.        
  168.         while(1)
  169.         {
  170.                
  171.                 tp_dev.scan(0);
  172.                 for(t=0;t<OTT_MAX_TOUCH;t++)
  173.                 {
  174.                         if((tp_dev.sta)&(1<<t))
  175.                         {
  176.                                 if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)
  177.                                 {
  178.                                         if(lastpos[t][0]==0XFFFF)
  179.                                         {
  180.                                                 lastpos[t][0] = tp_dev.x[t];
  181.                                                 lastpos[t][1] = tp_dev.y[t];
  182.                                         }
  183.                                         lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],2,POINT_COLOR_TBL[t]);//画线
  184.                                         lastpos[t][0]=tp_dev.x[t];
  185.                                         lastpos[t][1]=tp_dev.y[t];
  186.                                                
  187.                                         if(tp_dev.x[t]>random&&tp_dev.x[t]<random+30&&tp_dev.y[t]>dom&&tp_dev.y[t]<dom+30)       //水平方向,可以来进行类似的按键检测
  188.                                         {

  189.                                                 random=RNG_Get_RandomRange(35,365);//获取[0,9]区间的随机数   x
  190.             dom=RNG_Get_RandomRange(235,665);//获取[0,9]区间的随机数      y
  191.                                                 delay_ms(10);
  192.                                                 Load_Drow_Dialog();//清除
  193.                                                 delay_ms(10);
  194.                                                 LCD_Fill(33,233,400,700,WHITE);
  195.                                                 LED1=!LED1;
  196.                                                 LCD_Fill(random,dom,random+30,dom+30,BLUE);
  197.                                                 qwer=qwer+17;
  198.                                                 LCD_ShowNum(30+5*16,150,qwer,5,16); //显示随机数
  199.                                                 if(qwer>1000)
  200.                                                 {
  201.                         Show_Str(30,210,200,16,"您是MVP:",16,0);
  202.                                                       Show_Str(30,210,200,16,"您是MVP:",16,0);

  203.                                                 }
  204.                                        
  205.                                         }
  206.                                 }
  207.                         }else lastpos[t][0]=0XFFFF;
  208.                 }
  209.                
  210.                 delay_ms(5);i++;
  211.                 //if(i%20==0)LED0=!LED0;
  212.         }       
  213. }
  214.        

  215. void retc()
  216. {
  217. RTC_TimeTypeDef RTC_TimeStruct;
  218.         RTC_DateTypeDef RTC_DateStruct;
  219. u8 x;
  220.                 u8 tbuf[40];
  221. x++;
  222.                 if((x%10)==0)        //每100ms更新一次显示数据         RTC_TimeStruct.RTC_Hours
  223.                 {

  224.                         RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
  225.                        
  226.                         sprintf((char*)tbuf,"Time:%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
  227.                         LCD_ShowString(30,140,210,16,16,tbuf);       
  228.                        
  229.                         RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
  230.                        
  231.                         sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date);
  232.                         LCD_ShowString(30,160,210,16,16,tbuf);       
  233.                         sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.RTC_WeekDay);
  234.                         LCD_ShowString(30,180,210,16,16,tbuf);
  235.                                
  236.                 }
  237. }       




  238. void jiemian()
  239. {
  240. LCD_Fill(33,33,333,400,GREEN);
  241. LCD_Fill(533,33,750,400,BLUE);

  242. }




  243. int main(void)
  244. {  
  245.      RTC_TimeTypeDef RTC_TimeStruct;
  246.         RTC_DateTypeDef RTC_DateStruct;
  247. u8 x;
  248.                 u8 tbuf[40];
  249.         u32 fontcnt;                  
  250.         u8 i,j;
  251.         u8 t;
  252.         u8 fontx[2];//gbk码
  253. u32 miao=0;

  254.         u8 key;//t;
  255.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  256.         delay_init(168);  //初始化延时函数
  257.         uart_init(9600);                //初始化串口波特率为115200
  258.         LED_Init();                                        //初始化LED  
  259.         LCD_Init();                                        //LCD初始化  
  260.         KEY_Init();                                        //按键初始化  
  261.         RNG_Init();
  262.         //My_RTC_Init();                                 //初始化RTC
  263.         tp_dev.init();                                //触摸屏初始化
  264.         TIM3_Int_Init(10000-1,8400-1);        //定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数5000次为500ms   
  265.         W25QXX_Init();                                //初始化W25Q128
  266.         usmart_dev.init(84);                //初始化USMART
  267.         my_mem_init(SRAMIN);                //初始化内部内存池
  268.         my_mem_init(SRAMCCM);                //初始化CCM内存池
  269.         exfuns_init();                                //为fatfs相关变量申请内存  
  270.           f_mount(fs[0],"0:",1);                 //挂载SD卡
  271.         f_mount(fs[1],"1:",1);                 //挂载FLASH.
  272.        
  273.        
  274.         //RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);                //配置WAKE UP中断,1秒钟中断一次
  275.        
  276.        
  277.         while(font_init())                         //检查字库
  278.         {
  279. UPD:   
  280.                 LCD_Clear(WHITE);                           //清屏
  281.                 POINT_COLOR=RED;                        //设置字体为红色                                
  282.                 LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
  283. //                while(SD_Init())                        //检测SD卡
  284. //                {
  285. //                        LCD_ShowString(30,70,200,16,16,"SD Card Failed!");
  286. //                        delay_ms(200);
  287. //                        LCD_Fill(30,70,200+30,70+16,WHITE);
  288. //                        delay_ms(200);                    
  289. //                }                                                                                                                     
  290.                 LCD_ShowString(30,70,200,16,16,"SD Card OK");
  291.                 LCD_ShowString(30,90,200,16,16,"Font Updating...");
  292.                 key=update_font(20,110,16,"0:");//更新字库
  293.                 while(key)//更新失败               
  294.                 {                                           
  295.                         LCD_ShowString(30,110,200,16,16,"Font Update Failed!");
  296.                         delay_ms(200);
  297.                         LCD_Fill(20,110,200+20,110+16,WHITE);
  298.                         delay_ms(200);                       
  299.                 }                   
  300.                 LCD_ShowString(30,110,200,16,16,"Font Update Success!   ");
  301.                 delay_ms(1500);       
  302.                 LCD_Clear(WHITE);//清屏               
  303.         }  
  304.         POINT_COLOR=RED;     

  305. jiemian();


  306.         if(tp_dev.touchtype!=0XFF)LCD_ShowString(30,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示
  307.         delay_ms(1500);
  308.         Load_Drow_Dialog();                
  309.         LCD_Fill(random,dom,random+30,dom+30,BLUE);

  310.         if(tp_dev.touchtype&0X80)ctp_test();//电容屏测试
  311.         else rtp_test();                                         //电阻屏测试
  312.         while(1)
  313.         {
  314.                 fontcnt=0;
  315.                 //retc();
  316.                
  317.                
  318.                 Show_Str(30,210,200,16,"您是MVP:",16,0);
  319.                
  320.                
  321.                 x++;
  322.                 if((x%10)==0)        //每100ms更新一次显示数据         RTC_TimeStruct.RTC_Hours
  323.                 {

  324.                         RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
  325.                        
  326.                         sprintf((char*)tbuf,":%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
  327.                         LCD_ShowString(530,140,210,24,24,tbuf);       
  328.                        
  329.                         RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
  330.                        
  331.                         sprintf((char*)tbuf,"日期:20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date);
  332.                         LCD_ShowString(530,180,210,24,24,tbuf);       
  333.                        
  334.                         sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.RTC_WeekDay);
  335.                         LCD_ShowString(530,220,210,24,24,tbuf);
  336.                                
  337.                 }
  338.                
  339.                
  340.                
  341.                
  342.                
  343.                
  344.                
  345.                
  346.                
  347.                
  348.                
  349.                 for(i=0x81;i<0xff;i++)
  350.                 {               
  351.                         fontx[0]=i;
  352. //                        LCD_ShowNum(118,150,i,3,16);                //显示内码高字节  
  353.                        
  354.                         for(j=0x40;j<0xfe;j++)
  355.                         {
  356.                                 if(j==0x7f)continue;
  357.                                 fontcnt++;
  358. //                                LCD_ShowNum(118,170,j,3,16);        //显示内码低字节         
  359. //                                LCD_ShowNum(118,190,fontcnt,5,16);//汉字计数显示         
  360.                                  fontx[1]=j;
  361. //                                Show_Font(30+132,220,fontx,24,0);          
  362. //                                Show_Font(30+144,244,fontx,16,0);                                            
  363. //                                Show_Font(30+108,260,fontx,12,0);                                            
  364. //                                t=200;
  365.                                
  366.                                
  367. //                               
  368. //                               
  369. //                               
  370. //                                while(t--)//延时,同时扫描按键
  371. //                                {
  372. //                                        delay_ms(1);
  373. //                                        key=KEY_Scan(0);
  374. //                                        if(key==KEY0_PRES)goto UPD;
  375. //                                }
  376. //                //                LED0=!LED0;
  377.                         }   
  378.                 }       
  379.         }
  380. }
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:225148 发表于 2017-8-6 15:54 | 只看该作者
没人喵
回复

使用道具 举报

板凳
ID:421423 发表于 2018-11-5 23:22 来自手机 | 只看该作者
顶一个
回复

使用道具 举报

地板
ID:420026 发表于 2018-11-6 09:01 | 只看该作者
好东西,必须顶起来
回复

使用道具 举报

5#
ID:368791 发表于 2018-11-6 22:32 来自手机 | 只看该作者
好东西,顶上去
回复

使用道具 举报

6#
ID:444708 发表于 2018-12-12 11:22 | 只看该作者
......好东西,但是突然发现还有1-20行的库我没有....
完全没办法跑
回复

使用道具 举报

7#
ID:467442 发表于 2020-6-7 23:56 | 只看该作者
来试试
回复

使用道具 举报

8#
ID:91165 发表于 2020-6-8 09:51 | 只看该作者
这个真好,准备买个407
回复

使用道具 举报

9#
ID:793851 发表于 2020-7-8 20:55 | 只看该作者
有仿真图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表