又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了。

下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收、滤波、最好处理按键任务,大体上没什么问题,不过没具体测试过到时可能会有bug。

  1. /******************************************************************************
  2. * @file button.c
  3. * @author wule
  4. * @version
  5. * @date
  6. * @brief
  7. ******************************************************************************
  8. *
  9. *****************************************************************************/
  10.  
  11. typedef unsigned char ButtonSizeType;
  12.  
  13. typedef enum{
  14. RESET = ,
  15. SET = !RESET,
  16. }FLAG;
  17.  
  18. typedef struct button_bit{
  19. ButtonSizeType button1:;
  20. ButtonSizeType button2:;
  21. ButtonSizeType button3:;
  22. ButtonSizeType button4:;
  23. ButtonSizeType button5:;
  24. ButtonSizeType button6:;
  25. ButtonSizeType button7:;
  26. ButtonSizeType button8:;
  27. }ButtonBitType;
  28.  
  29. typedef union
  30. {
  31. ButtonBitType button_bit;
  32. ButtonSizeType button;
  33. }ButtonType;
  34.  
  35. ButtonType InputFlag;
  36.  
  37. //初始化按键标志状态
  38. void Init_Button_Variable(void)
  39. {
  40. InputFlag.button = ;
  41. }
  42.  
  43. //判断函数,读取每个按键的状态
  44. ButtonSizeType ReadButtonBit(void)
  45. {
  46. ButtonType button_bit;
  47.  
  48. button_bit.button = ;
  49.  
  50. button_bit.button_bit.button1 = ;
  51. button_bit.button_bit.button3 = ;
  52. button_bit.button_bit.button5 = ;
  53.  
  54. return button_bit.button;
  55. }
  56. //滤波,返回值代表当前按键的值
  57. ButtonSizeType Button_Filter(void)
  58. {
  59. ButtonSizeType bf_buf;
  60. static ButtonSizeType bf_pre_buf = ,bf_backval = ;
  61. static unsigned char bf_filtercnt = ;
  62.  
  63. bf_buf = ReadButtonBit();
  64.  
  65. if(bf_buf != bf_backval && bf_buf == bf_pre_buf)//判断两次是否相同
  66. {
  67. bf_filtercnt ++;
  68. if(bf_filtercnt > )//作一个简单的滤波
  69. {
  70. bf_backval = bf_pre_buf;
  71. }
  72. }
  73. else
  74. {
  75. bf_pre_buf = bf_buf;
  76. bf_filtercnt = ;
  77. }
  78.  
  79. return bf_backval;
  80. }
  81. //处在一个时间可控的位置,这里可以实现各种按键的操作
  82. void ButtonTask(void)
  83. {
  84. ButtonType bt_state = Button_Filter();//得到按键状态
  85.  
  86. if(InputFlag.button_bit.button1 == && bt_state.button_bit.button1 == )
  87. {
  88. //单次触发
  89. }
  90. else if(InputFlag.button_bit.button1 == && bt_state.button_bit.button1 == )
  91. {
  92. //单次释放
  93. }
  94.  
  95. if(bt_state.button_bit.button1 == )
  96. {
  97. //计时触发
  98. }
  99. else
  100. {
  101. //结束判断按的时间
  102. }
  103. }

【C语言】单片机上的按键检测框架的更多相关文章

  1. nRF52832 矩阵按键调试 同一列上的按键 任意两个按键 按下 检测不到低电平(电平拉不下来)

    参考链接:https://blog.csdn.net/zhanghuaishu0/article/details/78505045 调试过程中发现 同一列上的按键 任意两个按键 按下 检测不到低电平( ...

  2. 使用Twitter异常检测框架遇到的坑

    在Github上搜索“Anomaly Detection”,Twitter的异常检测框架(基于R语言)高居榜首,可见效果应该不错: 但是活跃度并不高,3-4年没人维护了: 因此在使用时难免会遇到一些坑 ...

  3. nRF51822外设应用[2]:GPIOTE的应用-按键检测

    版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 1. nRF51822寄存器类型 nRF51822的寄存器和一般的单片机有所差别,nRF51822 ...

  4. STM32f103按键检测程序实现长按短按

    背景 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去抖.初学者往往会在主循环调用按键检测程序(实时)并利用延时去抖(准确).这种在主循环内延时的做法对整个程序非常 ...

  5. 按键检测GPIO输入

    1. 项目 通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭. 2. 代码 mian.c #include "stm32f10x.h" //相当于51单片机中的 #includ ...

  6. 第12章 GPIO输入—按键检测

    第12章     GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  7. 第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列

    第12章     GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  8. 谁能用通俗的语言解释一下什么是 RPC 框架

    转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题~ 谁能用通俗的语言解释一下什么是 RPC 框架? ...

  9. 第13章 GPIO输入—按键检测

    本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘 ...

随机推荐

  1. robot自动化测试(一)---安装

    1.安装python 百度搜索安装程序即可:我安装的python 2.7.6 64位 2.安装wxpython 版本:wxPython2.8 下载地址:http://sourceforge.net/p ...

  2. Palindrome(POJ 1159 DP)

      Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 58168   Accepted: 20180 De ...

  3. QT是否流行还是和历史有关啊(各个平台不同时间的方案都讲到了)

    这个还是和历史有关啊..现在基于Qt的桌面软件越来越多的...许多GTK的也在向Qt迁移..可以说在XP时代,微软自己有一套MFC,和成熟的vs系列开发工具..而Qt-Creator是09左右才有项目 ...

  4. javascript之全局函数

    一.eval() //执行一段字符串中的javascript代码. 语法:eval(code); //可以将javascript写在字符串里面执行. var str = "document. ...

  5. C#中给线程传值并启动

    方法1: ParameterizedThreadStart 委托+Thread.Start 方法 (Object)         private void btnLogin_Click(object ...

  6. 锁sql server锁

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...

  7. UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>

    O - 酱神寻宝 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  8. 学生管理系统(list)

    学生管理系统:学习了一点文件指针的操作和链表操作,以前总想搞下子,刚好碰到同学要做这个,自己瞎搞了一通. 实现功能:数据添加,查找,删除,插入,修改只是在查找加几句就没写. #include < ...

  9. ZOJ2913Bus Pass(BFS+set)

    Bus Pass Time Limit: 5 Seconds      Memory Limit: 32768 KB You travel a lot by bus and the costs of ...

  10. cmd用到的基本操作

    dir #显示当前目录中的文件和子目录 dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件 a = all dir c: /a:d #显示 C 盘当前目录中的目录 d = direc ...