基于stm32f4的按键检测

所谓按键检测,即是检测按键是长按,还是短按。(长按、短按由按键的时间的长短来衡量)通过查阅相关资料,找到了两种比较好理解的按键检测方法。一种是通过输入捕获的方式检测按键按下前后的电平转换时间,来判断按键是长按还是短按;另外一种是通过将按键扫描函数放在定时器中断里,检测按键按下前后的电平转换时间,进而判断按键状态 。但总的来说,以上这两种方式所用的方法是类似的,即通过检测电平转换时间的长短,从而确定按键是长按还是短按。
第一种方式对应部分源码如下:

    long long temp=0;temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=0XFFFFFFFF;                      //溢出时间总和temp+=TIM5CH1_CAPTURE_VAL;          //得到总的高电平时间printf("HIGH:%lld us\r\n",temp); //打印总的高点平时间if(temp>=500000)//长按0.5s{switch_flag=1;}else if(temp>=100000)//短按至少0.1s{switch_flag=0;}

第二种方式对应部分源码如下:

    //定时器3中断服务函数
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断{Key_scan();}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}//Key_scan函数
void Key_scan(void)
{//1 表示高电平,0表示低电平。低电平时按下 if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) )//按键按下 记录按下的时间 {delay_ms(20);//消抖时间,后加count++;}else //按键松开 计数值清零并返回按下的时间值{if(count>100)//按下经过1s  10*10ms=100ms{//长按switch_flag= 1;}else if(count>10 && count <100)//表示超过10ms{//短按switch_flag= 0;}else{    delay_ms(20);//消抖时间,后加}count=0;}
...
}

而在判断出按键状态之后,可以简单地实现检测单个按键连续两次按下的相关状态。如一个按键短按一次,长按一次,控制LED翻转;随后再短按一次,长按一次,控制LED翻转。部分代码如下;

unsigned int switch_flag=1;//初始状态设置为1,防止第一次长按时误判断
unsigned int switch_flag_old=1;//初始状态设置为1,防止第一次长按时误判断
unsigned int switch_flag_state=0;
//以下语句放在key_scan函数中,上接...
static unsigned int switch_flag_old=1;//利用static变量,防止第一次长按时,误判断     if((switch_flag==1)&&(switch_flag_old==0)) //{if(switch_flag_state==0)//区分swtich开关状态,判断上一次开关的状态switch_on();elseswitch_off(); }
switch_flag_old=switch_flag;//表示前一个状态,到这里
//switch闭合函数
void switch_on(void)
{LED1=!LED1;//DS1翻转switch_flag_state=1;
}
//switch断开函数
void switch_off(void)
{LED1=!LED1;//DS1翻转switch_flag_state=0;
}

在实际调试过程中,参照了之前产生上升沿波形的例子。而对switch_flag,及switch_flag_old的初值设置为1,可以避免在第一次按键长按时,就会进入按键判断语句,从而使功能有误。完整代码已通过正点原子stm32f407开发板检测。欢迎各位指正。

基于stm32f4的按键检测相关推荐

  1. 源代码,基于Stm32f030单片机开发日历显示,内部包括,按键检测、蓝牙通讯、温度传感器读取以及贪吃蛇游戏

    源代码,基于Stm32f030单片机开发日历显示,内部包括,按键检测.蓝牙通讯.温度传感器读取以及贪吃蛇游戏. OLED 屏幕的i2c驱动代码. 非常是初学者用于参考学习. :862564016125 ...

  2. STM8S903K3T6C基于ST Visual Develop开发输入输出按键检测示例

    STM8S903K3T6C基于ST Visual Develop开发输入输出按键检测示例 使用IAR开发stm8调用标准库,有时候非常卡顿,虽然开发起来方便,但是体验感很差. 开发环境 ST Visu ...

  3. 基于STM32F4的智能门锁系统

    基于STM32F4的智能门锁系统 前言 一.项目背景 二.项目所预想功能 三.外置硬件准备 四.项目开发 简介及涉及协议 蓝牙模块 1.蓝牙接线图 2.使用说明: 3.蓝牙代码 USART3.C 蓝牙 ...

  4. 基于STM32F4开发的智能台灯

    基于STM32F4开发的智能台灯 写这篇博客的目的有2个,首先是记录一下学习STM32大半年来的第一个自己动手开发的项目,整理一下开发过程和思路:其次也是希望可以和更多的同行交流开发经验,有什么问题可 ...

  5. 【DND图形库】四、文本绘制和按键检测

    四.文本绘制和按键检测 (甲)文本绘制 文本是Text类,本质上是基于Sprite的,但是用户不需要考虑这么多.首先我们需要准备一个字体文件,在系统的C:\Windows\Fonts目录,有许多的字体 ...

  6. 基于STM32F4的CANOpen移植教程(超级详细)

    CANopen移植到STM32F4平台 前言 1 物品准备 2 相关软件安装 2.1 CAN上位机 2.2 对象字典生成工具objdictedit环境配置 3 将CANopen移植到STM32F407 ...

  7. 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效

    基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...

  8. 煤气检测与报警程序C语言,基于单片机的煤气检测报警系统毕业设计.doc

    基于单片机的煤气检测报警系统毕业设计 届 别 学 号 毕业设计 基于单片机的煤气检测报警系统 姓 名 系 别. 专 业 导 师 姓 名.职 称 完 成 时 间 目录 摘要3 Abstract3 1 绪 ...

  9. 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机.在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲 ...

最新文章

  1. 线程同步--线程间通信
  2. 查看文件时间及修改(MACN,stat命令,touch命令)
  3. java axis2 开发webservice_利用Axis2开发WebService(3)—用Java实现调用WebService的客户端程序 | 学步园...
  4. 买到春节回家的票了吗?用Python刷票,还不快来试试!(建议收藏) 为回家做准备...
  5. 多套 企业/工厂/超市/仓库库存管理系统源码 工具软件程序源代码
  6. java中Excel转图片实现
  7. 百度地图兴趣点抓取工具
  8. python爬取中央气象台台风网当前台风实况和预报数据
  9. 大师系列之彼得•林奇层查股
  10. 服务器 备份 本地文件,云服务器备份本地文件
  11. 如何自动识别文字并提取?这三个方法教你搞定识别文字
  12. VSCODE 系列(一)VSCODE下载和安装
  13. Hash-based Shuffle内幕彻底解密
  14. 现场总线过程控制系统实验装置
  15. 华为智慧屏x65鸿蒙系统,华为智慧屏X65迎来鸿蒙系统2.0版本升级
  16. 算法导论 — 思考题8-6 合并有序列表的下界
  17. Elixir应用简介
  18. Java计算1~n的和
  19. [012量化交易] python 最高价 最低价
  20. 三星苹果鏖战:苹果未衰败 研发能力决胜千里

热门文章

  1. 数据库修改表名,字段名 字段类型
  2. LOAM论文和程序代码的解读
  3. 又来了!10分钟实现微信 “炸屎“大作战
  4. git clone速度太慢的解决办法
  5. axios拦截器、ElementUI组件的使用
  6. 国内的服务器的优势就是,国产芯片服务器的优势是什么
  7. nginx(项目部署)linux版
  8. 高数 | 【概念剖析】多元函数的偏导数、方向导数、梯度以及微分之间的关系
  9. LaTex:实现在Springer可以使用bibtex自动生成引用文献,而不用写Bibitem
  10. [java] JNLP文件安装