独立按键检测短按、长按,松手后响应操作

这篇具有很好参考价值的文章主要介绍了独立按键检测短按、长按,松手后响应操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

有项目使用独立按键检测,短按、长按。根据使用效果,发现松手后,也就是按键弹起后响应操作比较好操作。

记得之前,博主写过一篇关于按键的检测的文章,但是过于复杂了。可能很难懂,这里就简单一点,只处理一个按键。并且这个按键,只检测短按、长按两种状态。

硬件

硬件原理图如下

这里不管使用哪个型号的MCU基本上都一样了,就是按键上拉,按下按键MCU管脚有个低电平输入信号。如下图所示,这里允许我偷个懒,把之前的图拿上来。因为实际项目的图,拿上来影响不好。反正原理就是这样的,你也可以将KEY上拉,这里的上拉可以在MCU的管脚配置为输入上拉。

如下图所示按下按键,单片机管脚KEY得到一个低电平输入。

独立按键检测短按、长按,松手后响应操作

 软件

这里就不限于使用的MCU,按键采用扫描的方式,获取按键值。

首先使用定时器定时1ms

这段代码是根据使用的MCU平台实现定时器的初始化配置,保证定时器中断1ms来一次,不同的MCU平台这里的代码都不一样的。例如STM32/GD32/等等其他的8位的MCU都可以。

void timer_init(void)
{

    //根据MCU平台实现,初始化代码

}

定时器中断函数,实现按键扫描

这里的key_val/key_val_buf你可以理解上全局变量,读取按键消息,如果有按键就将按键值保存下来。


void    TIM_IRQHandler()
{

		key_val = ReadKey();
		if(key_val != NO_KEY)
		{
			key_val_buf = key_val;
		}
		

}  

具体检测长按的函数,这里是最关键

用一个状态机实现

代码如下

这里简单解释一下,每次定时器中断来,首先读取按键的管脚的当前值

如果状态0,检测到有按键按下,进入状态1,消除抖动

状态1确认有按键按下,则进入状态2

状态2等待按键松手,根据KeyTimeCnt 的数值来确定输出长按还是短按

这里2ms到1000ms为短按
1000ms以上认为短按

这个数值可以根据你自己的使用习惯进行调整。我这里也是根据实际按键的效果来调整得到的。


unsigned char ReadKey(void)
{
	static unsigned char KeyState = 0;
	static unsigned int KeyTimeCnt = 0;
	static unsigned int no_key_times = 0;
	unsigned char KeyReturn = NO_KEY;
	static unsigned char KeyCurValue = NO_KEY;
	KeyCurValue = key; //读取按键值

	switch(KeyState)
	{
		case 0:
		{
            if(KeyCurValue == 0)        //检测到有键按下
            {
               KeyState++;                   //转到消抖确认状态 
               KeyTimeCnt = 0;
			   no_key_times = 0;
            }
			else
			{
				no_key_times++;
				if(no_key_times >= 500)//500*20ms=10s
				{
					no_key_times = 0;
				}
			}
			break;
		}
        case 1:
		{
            if(KeyCurValue == 0)   //和上次按键相同确认有键按下
            {
				KeyState++;                  //转入等待按键释放状态
			
            }
            else
                KeyState--;                  //两次键值不同 返回等待按键状态
            KeyTimeCnt = 0; 
			break;
		}
		//增加时间按键的长按、短按检测
		case 2:  
		{
			if(NO_KEY == KeyCurValue)           // 按键已经释放
			{
				if((KeyTimeCnt > 2) && (KeyTimeCnt < 1000))     
				{
					KeyReturn = KEY1_DOWN;  
					KeyTimeCnt = 0; 
					KeyState = 0;
				}
				else if(KeyTimeCnt >= 1000)
				{
					KeyReturn = KEY1_DOWN_LONG;  //检测到长按
					KeyTimeCnt = 0; 
					KeyState = 0;
				}
				else
				{
					KeyReturn = NO_KEY;
					KeyTimeCnt = 0; 
					KeyState = 0;
				}
			}
			else
			{
				KeyTimeCnt++;
				
			}
			break;
		}
		default:
		{
			KeyState = 0;
			break;
		}
    }
    return KeyReturn;
}

之前的博客,也可以参考,有点复杂

这个按键检测就复杂很多了

STM32独立按键扫描,支持同时按下、长按、快速键值_stm32按键扫描_大牛攻城狮的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-482714.html

到了这里,关于独立按键检测短按、长按,松手后响应操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32独立按键扫描,支持同时按下、长按、快速键值

    有个项目在实际应用中,采用8个独立按键,每个按键都赋予不同功能,实际使用过程中很多时候都是需要比较特殊的按键操作,例如:长按10s按键、长按5s按键,或者长按需要有快速按键值的反馈,这个情况就类似,我们需要快速增加一个设定值时,按住加号+按键不松手,这

    2024年02月12日
    浏览(37)
  • MCU短按长按的功能

    .外设:一个io口、一个定时器。 为了降低上手的门槛,本文仅使用一个IO口作演示。 实现思路 使用定时器,定时20ms来读取简化的按键状态机。 这里简化了状态机,大家只需明白三个概念。 状态:数量为有限个,记录按键状态。可根据条件切换。对应的代码中,用switch cas

    2024年02月01日
    浏览(43)
  • 短按开机/长按关机的电路和代码实现思路

    在我们实际的项目中,我们做的设备或者自己的DIY一个东西的时候,经常要实现的一个功能是:通过一个按键实现短按开机,长按关机。下面我就给大家简单介绍一下其中一种的实现方法,包含电路和代码的实现 首先是电路图: 先给大家介绍一下上面几个网络标号的意义:

    2024年02月12日
    浏览(80)
  • Android 开关机POWER键 长按短按代码分析

    路径:frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

    2024年02月11日
    浏览(46)
  • 初学者思路-实现独立按键检测(以STM32为例)

            本文以初学者角度切入,详细剖析按键检测原理,实现按键短按、短按抬起、首次长按、持续长按次数、长按抬起功能; 目录 前言 波形图分析 抖动原因 为什么要消抖 如何消抖 原理图分析 程序设计思路 代码实践 按键配置 按键检测 实验结果 留下反思         如

    2024年01月16日
    浏览(55)
  • 单个按钮实现长按开关机,短按可以当普通按钮控制单片机

    在看郭天祥老师的课程时学到的电路,之后发现这种控制原理很流行。 核心思路有两个: 1、用两个二极管隔离开q1和io_check,两端都可以响应按钮的状态,从而实现按钮复用。 2、用d2和q2,实现了与的功能,两者任意一个对地短路都可以保持mcu供电。 使用步骤: 1、长按sw

    2024年01月18日
    浏览(35)
  • 蓝桥杯单片机 | 特训案例【进阶02】长按与短按控制数码管显示

    新建工程,以 I/O模式 编写代码,在CT107D单片机综合训练平台上,实现以下功能: 1、系统上电后,关闭蜂鸣器和继电器,关闭全部指示灯,数码管最右边两位显示计数初始值28,其余数码管关闭。 2、利用 定时器0 实现 10ms 的间隔定时,将其作为长定时的基本单位,用于记录

    2023年04月09日
    浏览(47)
  • 单片机_按键——单击,双击,长按

    调用

    2024年02月16日
    浏览(50)
  • 按键状态机(实现单击,长按,双击)的模块分享

    目录 一、相关说明 二、分析 三、模块代码 三、代码讲解 四、作者的话         1.需要的资源:一个定时器,一个按键。         2.相关设置:利用定时器计时中断,10ms进行一次按键扫描。         3.使用说明:定时器中断的优先级要设置高一点,相关的宏定义可以

    2024年02月07日
    浏览(66)
  • 按键消抖、长按的处理方案(中断法、延时法)

    如果程序不采取一些算法进行消抖,会出现一次按下,多次检测到按键的情况,造成识别异常。常见的消抖算法如下: 以上的代码可以起到良好的消抖作用,在一些小项目中经常运用。但是由于该方式,在消抖延时期间和松手判断期间都会长时间占用CPU,有可能影响其他功能

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包