0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32按键检测之短按与长按方法

冬至子 来源:奇遇单片机 作者:奇遇单片机 2023-06-12 11:41 次阅读

电路设计中,我们经常需要读取外部的电平信号。比如,在项目中,我们需要通过按键来输入一些数据,那么就需要检测按键是否被按下。电平分为高电平读取和低电平读取,读取高电平,需要设置IO为下拉电阻输入模式,反之,设置IO为上拉电阻输入模式。

图片

S4按下时,单片机IO为高电平,S1-S3按下时,为低电平。我们设置S1为上拉输入模式,S4为下拉输入模式。本节使用按键实现2个功能:

S1短按一次,LED2点亮,S1再短按一次,LED2熄灭。S1长按,LED1点亮,S1再长按,LED1熄灭。这种方式可以用来实现短按调节菜单,长按保存参数

S4短按一次,LED4点亮,S4再短按一次,LED4熄灭。S4长按且不松手,LED4闪烁。这种方式可以用来实现短按调节数字,长按快速调节数字。在下一节,我们讲解数码管数字显示时,再来实现数字慢调和快调这个功能。下图是程序的大概流程思路以及框架:

图片

关于IO输入输出初始化,上一节讲过如何配置。这里按键设置上拉输入和下拉输入,LED设置推挽低速输出。一般来说,我们会把应用代码写在单独的一个文件里,比如按键检测就是KEY.c,然后其他文件用到的函数和宏定义,可以直接写在对应的头文件里KEY.h。在哪个文件里使用,就在该文件里include头文件即可。每个外设电路都由一组C文件和H文件组成,一般来说,在复杂的项目中,在USER.c文件里调用外设函数编写用户程序,在主函数里调用用户函数即可。下图就是一个按键的头文件。

图片

下图列出了一些按键检测的核心代码,KEY.c部分代码:

图片

ScanKey()函数中的if语句是用来判断键值是否变化的,如果键值变化,则执行按键处理函数keyDeal();

按键键值读取的思路:while语句每循环一次所需时间是已知的,假设是100us,按键在被按下的过程中,IO的电平是剧烈变化的,只有完全按下时,IO的电平才会稳定。因此,当检测到低电平时,开始计数,每100us检测一次,假设检测了100次都是低电平,那么就可以确定按键真的被按下了。这里千万别采用长延时,防止程序被堵塞,一直空等待。

有的人是这样设计的,当检测到低电平时,就开始延迟100ms,然后再次检测到低电平,就认为按键被按下一次。这种方式是不合理的,在这100ms延时期间,CPU什么也没干,一直在那空运行,以至于其他程序无法被执行。而我们现在采用的策略是,while循环体里一般会有一些程序要被执行,这些程序执行是需要花时间的,那么循环一次花的时间,乘以循环次数,就可以达到延迟的目的。这样做,既可以延迟,也不影响其他程序执行。下面列出一些按键检测的核心代码。

图片

关于长按,短按,是根据不同的循环次数来区分的。当达到长循环次数时,就认为长按,在键值上加上长按标志。如果松手后,循环次数没有达到长按次数,就认为是短按。如果检测到长按,就在长按执行代码里,设置另一个变量,每循环几次就执行数字递增或者递减。这就是长按快速计数的原理。

如果长按用来实现数据保存,那么,就直接在长按执行代码里设置保存标志位或者直接保存数据。这里KEY4按键长按LED闪烁是在按键检测函数里直接执行的,而短按是在键值处理函数里执行的。之所以这么做,是因为按键长按不松手,键值一直不变,按键处理函数只会被执行一次,请看前文的ScanKey函数。KEY1长按,短按都是在键值处理函数里执行的。

在按键处理函数中,首先分离出长按标志位,然后根据键值去匹配是哪个按键被按下。在键值处理代码段里,根据长按标志位来判断执行短按操作还是长按操作。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 上拉电阻
    +关注

    关注

    5

    文章

    346

    浏览量

    30260
  • 下拉电阻
    +关注

    关注

    4

    文章

    141

    浏览量

    20287
  • led灯
    +关注

    关注

    22

    文章

    1554

    浏览量

    107037
  • STM32单片机
    +关注

    关注

    58

    文章

    545

    浏览量

    57945
收藏 人收藏

    评论

    相关推荐

    跪求基于verilog的短按键长按键的程序

    小弟新手,只会短按键的程序,跪求基于verilog的短按键长按键的程序,不胜感激
    发表于 03-18 14:47

    mico按键长按短按怎么实现

    mico按键长按短按怎么实现?
    发表于 07-31 17:02

    stm32按键是如何去实现长按及其短按

    stm32按键是如何去实现长按及其短按的?具体实现过程是怎样的?
    发表于 12-01 08:06

    如何通过外部中断实现按键长按短按

    瑞萨单片机通过外部中断实现按键长按短按
    发表于 12-01 07:57

    stm32按键长按/短按怎么实现?

    stm32按键长按/短按怎么实现?
    发表于 12-02 07:41

    实现单片机按键长按短按功能的方法

    写在前面 一般我们在写单片机程序的时候都要用到按键,在按键较少的情况下我们需要一个按键可以返回不同的按下结果,也就是长按短按。程序实现 大
    发表于 12-06 07:40

    stm32f103按键短按得识别原理是什么

    stm32f103按键短按得识别原理需要一个定时器,用来计算按键按下的时间,可以一秒钟检测100次, 设置初始化为10ms的中断,比如使用
    发表于 01-06 07:03

    STM32按键短按加一次而长按连续加的功能实现

    STM32按键短按加一次而长按连续加的功能题目要求思路过程解决过程anjian.c注意anjian.htimer.c注意timer.h题目
    发表于 01-06 07:03

    MCU里按键短按长按功能如何实现?

    MCU里按键短按长按功能如何实现?
    发表于 02-09 06:54

    STM32按键长按短按控制指示灯闪烁

    大佬们,这个怎么写呀利用状态机设计思想,编写按键长按短按处理程序,按键B1长按则控制指示灯LD2闪烁2次后关闭;
    发表于 10-12 22:05

    按键长按短按效果

    按键长按短按效果 C51单片机源码,KEIL源文件,C语言编写
    发表于 06-20 16:15 60次下载

    基于状态机的单片机按键短按长按功能的实现

    本文主要介绍了基于状态机的单片机按键短按长按功能的实现,按键的击键过程也是一种状态的切换,也可以看着是一个状态机,一个按键的击键过程包括:按
    发表于 12-28 08:43 1.8w次阅读
    基于状态机的单片机<b class='flag-5'>按键</b><b class='flag-5'>短按</b><b class='flag-5'>长按</b>功能的实现

    瑞萨单片机之外部中断实现按键长按短按(二)

    瑞萨单片机通过外部中断实现按键长按短按
    发表于 11-22 14:21 19次下载
    瑞萨单片机之外部中断实现<b class='flag-5'>按键</b>的<b class='flag-5'>长按</b>与<b class='flag-5'>短按</b>(二)

    如何实现单片机按键长按短按功能

    写在前面 一般我们在写单片机程序的时候都要用到按键,在按键较少的情况下我们需要一个按键可以返回不同的按下结果,也就是长按短按。程序实现 大
    发表于 11-23 18:06 36次下载
    如何实现单片机<b class='flag-5'>按键</b><b class='flag-5'>长按</b>和<b class='flag-5'>短按</b>功能

    基于STM32F103C8T6的多按键检测 | 有限状态机短按长按识别 | 标准库函数实现方法

    制作航模遥控器需要用到多按键检测,使用有限状态机实现检测短按长按,修正了原文中的一些错误
    发表于 11-26 11:21 36次下载
    基于<b class='flag-5'>STM32</b>F103C8T6的多<b class='flag-5'>按键</b><b class='flag-5'>检测</b> | 有限状态机<b class='flag-5'>短按</b>、<b class='flag-5'>长按</b>识别 | 标准库函数实现<b class='flag-5'>方法</b>