标题:
单片机状态机方式按键处理程序,可实现长按,无法实现短按
[打印本页]
作者:
Tobby
时间:
2022-7-12 17:07
标题:
单片机状态机方式按键处理程序,可实现长按,无法实现短按
/******************************************************************************************/
//函数:Key_add
//功能:状态机方式
//输出参数:
//输入参数:
/****************************************************************************************/
u16 key_AddCnt;
u8 Key_add(void)
{
static u8 key_state=0;
u8 key_return=0;
switch(key_state)
{
case Key_state_0:
{
if(KEY_UP==0)
{
key_state=Key_state_1;
}
key_AddCnt=0;
}break;
case Key_state_1:
{
if(KEY_UP==0)
{
key_state=Key_state_2;
}
else
{
key_state=Key_state_0;
}
}break;
case Key_state_2:
{
key_AddCnt++;
if(KEY_UP)//按键松开
{
key_state=Key_state_0;
if(key_AddCnt<=key_short_time)//按键时间小于短按时间30ms
{
// key_AddCnt=0;
key_return=Key_upPress;
}
}
else
{
if(key_AddCnt>=key_long_time)
{
key_AddCnt=0;
key_return=Key_uplongprss;
key_state=Key_state_3;
}
}
}break;
case Key_state_3:
{
if(KEY_UP)//按键松开
{
key_state=Key_state_0;
}
}
}
return key_return;
}
作者:
lkc8210
时间:
2022-7-12 22:05
Key_add()在哪里运行?
key_short_time的值是多少?
key_long_time的值是多少?
作者:
Tobby
时间:
2022-7-26 09:43
lkc8210 发表于 2022-7-12 22:05
Key_add()在哪里运行?
key_short_time的值是多少?
key_long_time的值是多少?
放在定时器中运行,10ms运行一次,问题已解决,是key_short_time设置时间过短,设置是3,也就是30ms短按时间,数值改为20,也是就200ms,问题解决,感谢
作者:
bbxyliyang
时间:
2022-7-26 22:37
// 按键
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define key_no 0
#define key_click 1
#define key_double 2
#define key_long 3
sbit KEY = P0^4;
sbit key1=P5^0;// 红光
sbit key2=P3^0;//绿光开关
sbit key3=P0^2; //蓝
sbit key4=P4^0; //白
sbit key5=P0^3; //加湿度
sbit key6=P5^2;//自动
static unsigned char key_read(void)
{
static unsigned char key_state_buffer1 = key_state_0;
static unsigned char key_timer_cnt1 = 0;
static unsigned char temp=0;
unsigned char key_return = key_no;
// unsigned char key;
//key = KEY; //read the I/O states
switch(key_state_buffer1)
{
case key_state_0:
if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0))
{ key_state_buffer1 = key_state_1; temp=0;
return 0;
}
//按键被按下,状态转换到按键消抖和确认状态//
break;
case key_state_1:
if(KEY== 0)
{
temp=1;
key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
//按键仍然处于按下状态
//消抖完成,key_timer开始准备计时
//状态切换到按下时间计时状态
}
else if(key1==0)
{
temp=2;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key2==0)
{
temp=4;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key3==0)
{
temp=5;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key4==0)
{
temp=6;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key5==0)
{
temp=7;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else if(key6==0)
{
temp=8;
// key_timer_cnt1 = 0;
key_state_buffer1 = key_state_2;
}
else
{
key_state_buffer1 = key_state_0; temp=0;
}
//按键已经抬起,回到按键初始状态
break; //完成软件消抖
case key_state_2:
if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0))
{
key_state_buffer1 = key_state_2;
if(temp==1)
{
if(++key_timer_cnt1 >= 100) //按键继续按下,计时超过1000ms
{
key_return = key_long; //送回长按事件
key_state_buffer1 = key_state_3; //转换到等待按键释放状态
}
}
}
else
{
key_return = temp; //按键抬起,产生一次click操作
key_state_buffer1 = key_state_0; //转换到按键初始状态
}
/* if(KEY == 1)
{
key_return = key_click; //按键抬起,产生一次click操作
key_state_buffer1 = key_state_0; //转换到按键初始状态
}
else if(++key_timer_cnt1 >= 100) //按键继续按下,计时超过1000ms
{
key_return = key_long; //送回长按事件
key_state_buffer1 = key_state_3; //转换到等待按键释放状态
} */
break;
case key_state_3: //等待按键释放
if((KEY == 0)||(key1 == 0)||(key2==0)||(key3==0)||(key4==0)||(key5==0)||(key6==0)) //按键释放
key_state_buffer1 = key_state_3; //切回按键初始状态
else //按键释放
key_state_buffer1 = key_state_0; //切回按键初始状态
break;
}
return key_return;
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1