你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32小项目分享

[复制链接]
STMCU小助手 发布时间:2022-6-23 21:00
一. 简介
将前面几篇文章介绍的几个小游戏整合在一起,加入了简陋的数字时钟和图片显示功能,合在一起作为一个小项目分享给大家,希望大家喜欢。只需要两个外设即可实现----显示屏和红外控制模块

二. 功能介绍
作为一个小项目来说,功能还是比较齐全的。1. 上电开机后,会进行一段开机动画的加载。
2. 然后是主界面的显示,一共包括三个部分,时钟、游戏和相册。
3. 通过红外按键进行选择。

4. 时钟 : 一个简单的时分秒的显示(#^.^#)。
5. 游戏 : 游戏下面又有一个界面显示,用来选择对应的游戏,贪吃蛇,俄罗斯方块和2048,都是一些常规的游戏。
6. 相册:一个简单的二值相册(经过边缘检测后的图像)显示,包括了我预先存储的三张图片。
7. 贪吃蛇: 贪吃蛇部分有必要单独拿出来说说,其中加入了算法部分,利用A*算法,可以自动寻找到食物的位置,并指导贪吃蛇的移动。算法的学习与贪吃蛇结合也是一个值得学习的点,同时也是一个难点。
以上就是本次小项目全部功能了。
三. 实现框架介绍
这次的设计为裸机程序,所以只能采用前后台系统的方式来实现。
前台为我们的应用程序,后外为我们的中断回调函数,里面主要用来红外模块数据的接收,以及时间的产生(贪吃蛇的移动以及俄罗斯方块的下落)。

  • 前台程序简要介绍

以贪吃蛇部分为例,进入到贪吃蛇部分后,就是清屏将上一个部分的显示清除掉,然后是贪吃蛇的初始化以及使能定时器4,用来记录数据,然后就是一个while循环了。根据不同的按键状态调用不同的函数。退出这个部分也很简单,修改当前的状态,然后break就可以了。其他部分都是如此。
  1.   else if(CurrMode == Snake)  //贪吃蛇游戏
  2.     {
  3.       LCDDMAFullOn(BackGround);
  4.       SnakeInit();
  5.       TIM_Cmd(TIM4,ENABLE);
  6.       while(1)
  7.       {
  8.         if(KEYState == KEYLEFT)
  9.           DirectionChange(MoveLeft);
  10.         else if(KEYState == KEYRIGHT)
  11.           DirectionChange(MoveRight);
  12.         else if(KEYState == KEYUP)
  13.           DirectionChange(MoveUp);
  14.         else if(KEYState == KEYDOWN)
  15.           DirectionChange(MoveDown);
  16.         else if(KEYState == KEYRETURN)
  17.         {
  18.           CurrIndex = 0;
  19.           SnakeDestory();
  20.           TIM_Cmd(TIM4,DISABLE);
  21.           CurrMode = Main;
  22.           break;
  23.         }
  24.       }
  25.     }
复制代码


2. 后台程序简要介绍
本次主要用到了两个后台程序,一个是红外数据的接收
  1. void EXTI0_IRQHandler(void)
  2. {
  3.   if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  4.   {
  5.     uint8_t data;
  6.     data = InfraredDataRecv();
  7.     if(data == InfraredLeft)
  8.         KEYState = KEYLEFT;
  9.     else if(data == InfraredRight)
  10.         KEYState = KEYRIGHT;
  11.     else if(data == InfraredUp)
  12.         KEYState = KEYUP;
  13.     else if(data == InfraredDown)
  14.         KEYState = KEYDOWN;
  15.     else if(data == InfraredReturn)
  16.         KEYState = KEYRETURN;
  17.     delay_ms(10);
  18.     /*清除标志位 */
  19.     EXTI_ClearITPendingBit(EXTI_Line0);
  20.   }
  21. }
复制代码



另外一个是定时器中断,其作用可以看注释
  1. void TIM4_IRQHandler(void)
  2. {
  3.     if(TIM_GetITStatus(TIM4,TIM_IT_Update) == SET)   //判断是否发生中断
  4.     {

  5.        if(CurrMode == Snake)
  6.             SnakeGame();  //蛇的移动
  7.         else if(CurrMode == Tetris)
  8.         {
  9.             TetrisFlag = 1;   //俄罗斯方块下落标志
  10.         }
  11.         else if(CurrMode == Clock)
  12.         {
  13.             DClockFlag = 1;   //数字时钟加一标志
  14.         }
  15.        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);    //清除中断标识
  16.     }
  17. }
复制代码


收藏 评论0 发布时间:2022-6-23 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版