按键消抖、长按的处理方案(中断法、延时法)

这篇具有很好参考价值的文章主要介绍了按键消抖、长按的处理方案(中断法、延时法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单片机开发中经常使用按键进行人机交互。由于按键的机械特性,会在按下和松开的瞬间发生抖动,通常持续10-20ms,如下图所示,

按键消抖代码,单片机,嵌入式硬件
如果程序不采取一些算法进行消抖,会出现一次按下,多次检测到按键的情况,造成识别异常。常见的消抖算法如下:

if(key == 0//假设按键低电平有效
{
	delay_ms(10);   //延时10ms,进行消抖
	if(key == 0{
		do_thing();
		while(key == 0);//松手判断
	}
}

以上的代码可以起到良好的消抖作用,在一些小项目中经常运用。但是由于该方式,在消抖延时期间和松手判断期间都会长时间占用CPU,有可能影响其他功能,对系统的实时性造成影响。

再来看下面代码

void Timer_ISR()      //定时中断,10ms进一次中断
{
	static u8 ReadData=0,Trg=0,Cont=0;
	static u16 long_pree_cnt=0;
	
	ReadData=0;
	if(KEY == 0) 		ReadData |= 0x01;			 		
	
	Trg = 0;
	Trg = ReadData & (ReadData ^ Cont);
	Cont = ReadData;
	
	if(Trg & 0x01)             //按键短按
	{	 
		key_press_flag = 1;   //按键按下标志位
	}
    
	if(Cont & 0x01)               //按键长按10s
	{
		if++long_pree_cnt == 1000)
		{
			long_pree_cnt = 0;
			key_long_press_flag = 1
		}	
	}
	else
		long_pree_cnt = 0;
	
}

void main()
{
	while1{
		if(key_press_flag)          //按键按键,执行对应的处理函数
		{
			key_press_flag = 0;
			key_press();
		}
		
		if(key_long_press_flag)
		{
			key_long_press_flag = 0;
			key_long_press();
		}
	}
}

以上代码,基本逻辑就是设置一个10ms的定时中断,在中断扫描按键。按键的消抖、按下、松开、长按都可以在中断中快速检测,不会有延时函数长时间占用CPU。在中断中将标志位置一,在主循环中执行处理函数,避免因执行处理函数,占用中断过长时间。文章来源地址https://www.toymoban.com/news/detail-612297.html

到了这里,关于按键消抖、长按的处理方案(中断法、延时法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验

    之前的延时消抖,是直接借助delay函数进行的,但是这样会浪费CPU的性能。我们采用延时函数的方式实现,可以实现快进快出。  定时器消抖,必须是在t3的时间点才可以,当在t1,t2的时间点每次进入中断函数都要重新开启定时器的计时 但是,这两个时间点的时间小于定时器设

    2024年02月14日
    浏览(73)
  • 蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

    此片文章用于记录蓝桥杯单片机的学习 篮球杯单片机上的矩阵按键原理图如下:   使用矩阵键盘时,要将跳线帽J5跳至KBD模式。   值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用。如果单片机为IAP15,则在上述原理图中,要将P36换成P42,P37换成P44。  

    2023年04月10日
    浏览(49)
  • STM32:基于HAL 库的外部中断按键以及消抖

    第一次写博客,有错误与问题欢迎指正。 这部分直接上代码,假设PB5为输入端且上拉,PB11为输出。 在CubeMx中配置完引脚(下降沿触发)并在NVIC中开启外部中断后,我们注意到,上一个程序有5个要素(我写了注释的5个): 中断回调函数HAL_GPIO_EXTI_Callback是一个虚函数,我们

    2024年04月10日
    浏览(49)
  • 【Linux 裸机篇(八)】I.MX6U EPIT 定时器中断、定时器按键消抖

    EPIT 的全称是: Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的。学过 STM32 的话应该知道, STM32 里面的定时器还有很多其它的功能,比如输入捕获、 PWM 输出等等。但是 I.MX6U 的 EPIT 定时器只是完成周期性中断定时的,仅此一

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

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

    2024年02月01日
    浏览(44)
  • 用verilog编写按键消抖代码

    本代码在按键按下和松开情况下均能消抖,消抖延时20ms(时钟频率为100MHz时)。 代码如下 module key3_led2( //from system input     input    clk,     input    rstn, //from external input to pl     input    ex_key1,        //按键从PL端输入 //from pl to ps     output    reg    pl_key1    //处理

    2024年02月02日
    浏览(44)
  • 蓝桥杯单片机类按键代码讲解和考点探究(三行代码消抖讲解)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 CON3中将1,2用跳线帽短接是矩阵键盘,可用范围为S4到S19。将2,3短接则是独立按键,可用范围是S4到S7. 按键原理讲解 单取一个按键,一端接到GND,一段接到单片机的IO口上(以下称I口,输入口)。当按

    2023年04月20日
    浏览(70)
  • (软件02)单片机按键处理,区分短按与长按

    本文目录     本篇前言     代码思路     实操练习 本篇前言         今天接着上篇与大家继续分享软件方面关于按键事件的处理,上篇软件01篇已提到整个软件框架时基的处理,其中提到了关于按键的处理,这篇将具体地介绍按键处理的思路与实例。         话不

    2024年02月03日
    浏览(37)
  • STM32 HAL库 中断处理中使用延时函数(HAL_Delay)

    今天在学习STM32 HAL库外部中断,使用的是按键触发外部中断,想在外部中断里面写一个按键消抖,也就是在HAL库外部中断处理函数中使用了HAL_Delay() 函数,后来经过实验,在外部中断处理函数(void EXTI1_IRQHandler(void))和中断回调函数(void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin))里面都

    2024年03月16日
    浏览(45)
  • ARM实验6-基于中断的按键处理程序实验

    一、实验名称:基于中断的按键处理程序实验 二、实验目的:         1.掌握ARM处理器的中断处理过程。         2.掌握ARM处理器中断服务程序的编写方法。         3.通过该编程实验,进一步巩固和强化学生ARM汇编编程的能,ARM应用程序框架,培养学生实际应用的

    2024年02月08日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包