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

    文章

    359

    浏览量

    30565
  • 下拉电阻
    +关注

    关注

    4

    文章

    147

    浏览量

    20495
  • led灯
    +关注

    关注

    22

    文章

    1592

    浏览量

    107824
  • STM32单片机
    +关注

    关注

    59

    文章

    549

    浏览量

    58637
收藏 人收藏

    评论

    相关推荐

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

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

    mico按键长按短按怎么实现

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

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

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

    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 64次下载

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

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

    使用单片机实现按键长按短按效果的C语言程序免费下载

    本文档的主要内容详细介绍的是使用单片机实现按键长按短按效果的C语言程序免费下载。
    发表于 11-26 17:31 54次下载

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

    瑞萨单片机通过外部中断实现按键长按短按
    发表于 11-22 14:21 20次下载
    瑞萨单片机之外部中断实现<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>

    基于89C51单片机的按键长按短按效果源程序

    基于89C51单片机的按键长按短按效果源程序
    发表于 05-16 09:45 16次下载