/**************************************************************************
函数功能:按键扫描
入口参数:双击等待时间
返回 值:按键状态 0:无动作 1:单击 2:双击
*************************************************************************/
/
3个计数值:只要按键按下 ,Forever_count就会计数,松开就清零
第一次按键按下之后,count_single才会计数
count_key像是为了协助,能在一次按键按下之后同时实现 1.double++ 以及 double_key是否等于2
按键按下一次之后,double_key = 1,再次进入循环的时候,count_single就会一直累加,当count_single加到time值时(即超过了设定的时间间隔)
那么就判定为单击。如果在count_single累加且未到time的过程中,再次松开按下,则认为按下两次,双击。每次按下就会有Forever_count累加
一松开就为0,所以如果Forever_count加到了我们设定的值,就是长按,就返回0
*/
u8 click_N_Double (u8 time)
{
static u8 flag_key,count_key,double_key; //按键按下一次标志位,按下的次数计数值,两次标志位
static u16 count_single,Forever_count; //按键按下一次之后一直计数值, 每次按键按下之后一直计数值,按键一旦松开就清0
// count_single是从按键按下第一次之后才计数,按键,Forever_count是只要
if(KEY0 == 0) Forever_count++;
else Forever_count = 0;
if(KEY0 == 0 && flag_key == 0) flag_key = 1;//则为按键按下
if(count_key == 0) //按键按下的次数计数 如果按键松开了(上一次检测时只要按键松开了,这个标志位就清零,说明松开的)
{
if(flag_key == 1) //单击一次进去一次
{
double_key++;
count_key = 1;
}
//按键松开时,double_key是2说明按下了两次
if(double_key == 2) //判断双击
{
double_key = 0;
count_single = 0;
return 2;
}
}
if(KEY0 == 1) flag_key=0 , count_key=0;//在进行判断有没有按下第二次时要先判断有没有松开,松开则清除标志位和计数值
if(double_key == 1)
{
count_single++; //按键按下一次以后就一直计数
//判断设定的时间间隔与计数值
if(count_single > time && Forever_count < time) //中间间隔时间太长 判断为的单击 Forever_count<time<count_single
{
double_key=0;
flag_key=0;
return 1;
}
//如果按键按下的值已经超过了我们设定的时间
if(Forever_count > time) //长按不放
{
double_key=0;
count_single=0;
}
}
return 0;
}
/**************************************************************************
函数功能:按键扫描
入口参数:无
返回 值:按键状态 0:无动作 1:单击
**************************************************************************/
u8 click(void)
{
static u8 key_up_flag; //按键松开标志
if(key_up_flag==1 && KEY0 == 0)
{
delay_ms(10);
if(KEY0 == 0)
{
key_up_flag = 0;
return 1;
}
else if(1 == KEY0) key_up_flag =1;
return 0;
}
}
/**************************************************************************
函数功能:长按检测
入口参数:无
返回 值:按键状态 0:无动作 1:长按2s
**************************************************************************/
u8 Long_Press(void)
{
static u16 Long_Press_count,Long_Press;
if(Long_Press == 0 && KEY0 == 0)
{
delay_ms(10);
if(KEY0 == 0)
{
Long_Press_count++;
}
}
else
Long_Press_count = 0;
if(Long_Press_count > 200)
{
Long_Press_count = 0;
Long_Press = 1;
return 1;
}
if(Long_Press == 1)
Long_Press = 0;
return 0;
}