一、检测长按短按
//检测开关按键
if(key_delay20ms>=10) //200ms检测一次
{
switch(key_station)
{
case 0:
{
if(key_on==0)
{ key_station = 1;} //检测到此时按键处于按键状态,转到case1
else
{ key_station = 0;}
}break;
case 1:
{
if(key_on==0)
{
key_station = 2;//检测到此时仍在按下状态,转到case2
key_delay = 0;
}
else
{ key_station = 0;}
}break;
case 2:
{
if(key_on==0) //如果按键仍在按下,循环检测60次*200ms后,定义为按键长按
{
key_delay++;
if(key_delay>=60)
{
key_delay = 0;
key_station = 3;
keyon_l = 1;
}
}
else
{
keyon_s = 1; //按键短按标志位
key_station = 0;
}
}
case 3:
{
if(key_on) key_station = 0;
`}break;
default: key_station = 0; break;
}
}
每次调用按键标志位后,需将标志位手动清零
二、多个按键不同功能
//**************************************/
void Key_scan(void) // 2毫秒执行一次
{
static uint8 key_value0=0;//按键前一次的状态寄存器
static uint8 key_delay=0;//延时抖动时间存器
static uint8 key_longtime;//长按按键基准时间1
static uint8 key_longtime1;//长按按键时间 总时间=key_longtime*key_longtime1*2ms+10ms(10ms为清抖时间)
key_value=0;
if(!P_K1)//按键扫描SW1
{
key_value=1;
}
if(!P_K2)//按键扫描SW2
{
key_value=2;
}
if(!P_K3)//按键扫描SW3
{
key_value=4;
}
if(!P_K4)//按键扫描SW4
{
key_value=8;
}
if(!P_K5)//按键扫描SW5
{
key_value=16;
}
if(key_value==key_value0)//如不相等,保存当前按键值,清抖,两毫秒后程序再次走到这里即判定为按下
{
if(key_delay>5)//抖动处理
{
if(key_value>0)//无按键按下确认,等于0时表示无按键,清释放标识位
{
if(!f_onkey)//判断按键是否释放
{
f_onkey=1;
switch(key_value)
{
case 1://SW1有效执行内容
break;
case 2://SW2有效执行内容
break;
case 4://SW3有效执行内容
break;
case 8://SW4有效执行内容
break;
case 16://SW5有效执行内容
break;
default:
break;
}
}
else
{
if(++key_longtime>90)
{
key_longtime=0;
if(++key_longtime1>6)
{
key_longtime1=0;
f_longkey=1;//长按按键有效
}
}
}
}
else//按键释放
{
f_onkey=0;
f_longkey=0;
}
}
else //有按键
{
key_delay++;
}
}
else//第一次检测到按键保存当前按键值
{
key_value0=key_value;
key_delay=0;
}
}