按键长按短按_按键弹起

需求描述

描述:实现按键长按和短按的共同识别,兼容识别。使用轮询扫描法;当时间低于1s的按键松开就是短按,长按3秒之后松开就是长按;

使用轮询模式累加;不能使用阻塞等待;

程序

 

#define key_long_key_max_time 300
uint8_t long_key_mode_counter(uint8_t mode,uint16_t *key_cnt   );
u8 KEY_Scan(u8 mode)
{	 
	static uint16_t k1,k2,k3,k4;
	static u8 key_up=1,key_old;//按键按松开标志
	uint8_t key=0;
	uint16_t *p;
	if(mode)key_up=1;  //支持连按		   ,如果是支持连按,每次扫描到都松开了  
	if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
	{
				delay_Ms_Block(10);//去抖动 
				key_up=0;
				if(KEY0==0) {  key =1; key_old=key;}
				else if(KEY1==0){key =2;key_old=key ;}
				else if(KEY2==0){ key =3;key_old=key;}
				else if(WK_UP==1){key = 4;key_old=key;}
		      
		
	}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; 	 //松开了   松开了再去判断长还是短按
	if(mode)
	{
	
					if(key_up!=1 )//没松开
					{     switch(key)
								{
										case 1:p=&k1;break;
										case 2:p=&k2;break;
										case 3:p=&k3;break;
										case 4:p=&k4;break;
						        default : break;
								
								}
								long_key_mode_counter( mode, p);
								if(k1>299)
								{
								    k1=k1;
								}
								//return key=0;//只要没松开就返回0
					}else//松开了
					{     if(k1>key_long_key_max_time||k2>key_long_key_max_time||k3>key_long_key_max_time||k4>key_long_key_max_time)
								{
										if(k1>key_long_key_max_time) key=5;								
										if(k2>key_long_key_max_time) key=6;								
										if(k3>key_long_key_max_time) key=7;								
										if(k4>key_long_key_max_time) key=8;
								}
								else 
                {
								    key=key_old;
								}
								{k1=0;k2=0;k3=0;k4=0;key_old=0;}
								return key;// 支持连按,这是返回
					}
	}
	else{
	
      return key;//不支持连按下,用这个返回
	}
}



uint8_t long_key_mode_counter(uint8_t mode,uint16_t *key_cnt   )
{
   if(mode)
	 {
	   (*key_cnt)++;
		 if(*key_cnt>30000)
		 { *key_cnt=30000;}
	 
	 }
	 else
	 {
	    *key_cnt=0;
	 
	 }

	
}

 

你可能感兴趣的:(java,linux,数据库)