单片机编程中,如何用一个按键同时检测点按与长按

1. 前言

事先说明,我这篇博客的目的是给入门学裸机编程的提供一个思路,不涉及操作系统任务阻塞之类的。在我们平常使用按键的编程过程中,一般说来,某一个按键实现的是单一的功能,比如简单的点亮一盏LED灯,按一次亮起,再按一次就是熄灭这种。但是如果我们的按键很少,此时要是用一个按键能够实现多种功能那么就可以节约我们的硬件资源。本博客带来的就是用一个按键实现检测点按与长按,进而就可以控制两种不同的功能。

2. 代码

话不多说,以下是实现的代码:

#define Long_Press_Time_Judge 250  //超过这个值就表示长按,且注意两次点按的间隔不能超过这个值
#define Long_Press  1
#define Short_Press 2
uint8_t Key_Scan(void)
{
	uint8_t long_press_flag;  //长按标志位
	uint8_t short_press_flag;  //点按标志位
	if(key==0)
	{
		delay_ms(10);     //按键消抖
		if(key==0)
		{
			short_press_flag=1;
			delay_ms(Long_Press_Time_Judge);  //点按的时间不能多于250ms
			if(key==0)
			{
				long_press_flag=1;
			}while(!key);
			if(long_press_flag==1)  //先判断是否长按,因为长按中包括了点按
			{
			   return Long_Press;
			}
			if(short_press_flag==1) //后判断是否点按
			{
				 return Short_Press;
			}
		}
	}
	return 0;
}

3. 说明

通过返回值得到按键是点按还是长按,若是长按,返回Long_Press;点按则返回Short_Press,这两个是宏定义;若是没有检测到按键按下,就返回0。但是本代码在使用过程中要注意的是两次点按的间隔不能小于250ms,否则也会被当成是长按,适用于一些实时性要求没有太高的场合。当然,延时的250ms可以改变,依据个人习惯更改长按的等待时间即可。

更多精彩,欢迎各位老板们关注公众号“脑补空间”~
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT狼~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值