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可以改变,依据个人习惯更改长按的等待时间即可。
更多精彩,欢迎各位老板们关注公众号“脑补空间”~