单片机实现同一个按键的长按3s与长按10s操作

如何实现单片机单击、双击、长按操作,可以参考别人文章:https://blog.csdn.net/qq997758497/article/details/80606710;

在这里我主要将这个功能再进行扩展,实现按键的单击、双击、长按3s、长按10s操作。

需要修改的地方:

 

1、预定义:

//#define key_long_3   3    注释这行代码
#define key_long_3s	    3    //返回值,长按3s
#define key_long_10s	4    //返回值,长按10s

#define key_state_4 4   //定义一个新的状态值

2、修改key_driver()函数:

unsigned char key_driver(void)
{

	unsigned char key_return = key_no;
	
	
	key1 = ((keys_flag)&(0x00080000));//key_input;  //read the I/O states
	
	switch(key_state_buffer1)
	{
		case key_state_0:
			if(key1 == KeyOn())
				key_state_buffer1 = key_state_1; 
				//按键被按下,状态转换到按键消抖和确认状态//
			break;
			
		case key_state_1://消抖
			if(key1 == KeyOn())
			{
				key_timer_cnt1 = 0;
				key_state_buffer1 = key_state_2;
				//此时按键仍然处于按下的状态
				//消抖完成,key_timer_cnt1开始计时//10ms自加一次
				//状态切换到按下时间开始计时状态
			}
			else
				key_state_buffer1 = key_state_0;
				//如果按键抬起释放,那么按键状态回到初始状态
			break; //软件消抖
			
		case key_state_2:
			if(key1 == KeyOff()) 
			{
				key_return = key_click;  //如果按键抬起释放,完成一次单击(短按)操作
				key_state_buffer1 = key_state_0;  //切换到按键的初始状态
			}
			else if(++key_timer_cnt1 >= 300)  //如果按键处于继续按下的状态当计时计数器超过3s时
			{
				key_state_buffer1 = key_state_3;  //等待长按之后的按键释放
			}
			break;
			
		case key_state_3:
			{
				if( key1 == KeyOn() && ++key_timer_cnt1 >= 1000)//按键继续按下,计时超过10s
				{
					key_return = key_long_10s; //送回长按10s事件
					key_state_buffer1 = key_state_4;  //等待释放
				}
				if( key1 == KeyOff() && key_timer_cnt1 <1000 ) //按键松开,计时小于10s
				{
				 	key_return = key_long_3s;
					key_state_buffer1 = key_state_0;
				}
			 
			}
			break;
		case key_state_4:  //等待按键释放
			if(key == KeyOff())  //按键释放
				key_state_buffer1 = key_state_0;  //切回按键初始状态
			break;


	}

	return key_return;
}

有一点需要注意:key_timer_cnt1 的定义需要修改为unsigned int类型,不然计数值不会超过255

你可能感兴趣的:(单片机实现同一个按键的长按3s与长按10s操作)