unsigned int Key2Process()
{
if (KEY2==1)
{
// 有按键
if (startkey2flag==0)
{
// 是新的按键按下startkey2flag=1;
key2downtime=G_timebase;
shortkey2flag=0;
return NOKEY;
}
else
{
// 已经开始按键计时, 当检测按键计时超过长按时间则不管释放没有,一次长按, 并清除标志
if (G_timebase-key2downtime>LONGKEYTIME)
{
// 大于长按时间, 判断为长按startkey2flag=0;
return LONGKEY;
}
else
{
// 判断是否是双击第二次按下
if (key2doubleflag==2)
{
if (G_timebase-key2doublewaittime<WAITDOUBLETIME)
{
// 在没有超过双击等待时间内检测到再次按键,把标志改为并设置时间等待释放
key2doubleflag=1; key2downtime=G_timebase; return NOKEY;
}
else
{
// 超了时间,属于新的一次按键startkey2flag=1;
key2doubleflag=0; key2downtime=G_timebase;
shortkey2flag=0;
return NOKEY;直接判断
1,
}
}
else
{
// 没事做
return NOKEY;
}
}
}
}
else
{
// 无按键, 或是按键抖动或是按键释放
if (startkey2flag==1)
{
// 当前有按键待决
if (G_timebase-key2downtime>LONGKEYTIME)
{
// 大于长按时间, 判断为长按
startkey2flag=0;
return LONGKEY;
}
else
{
// 不到长按时间, 可能是短按或是长按的抖动
if (G_timebase-key2downtime>SHORTKEYTIME)
{
// 大于短按时间, 下面开始计时, 判断是抖动还是真正释放
if (shortkey2flag==1)
{
if (G_timebase-key2uptime>JITTERTIME)
{
// 大于抖动时间, 判断是真正的短按释放
if (key2doubleflag==1)
{
// 有双击标志,说明是双击的第二次释放key2doubleflag=0;
startkey2flag=0;
shortkey2flag=0;
return DOUBLEKEY;
}
else
{
// 没有双击标志,看时间是否超过双击等待间隔
if (G_timebase-key2uptime>WAITDOUBLETIME) {
// 大于双击间隔,说明是单击
startkey2flag=0;
key2doubleflag=0;
shortkey2flag=0;
return SHORTKEY;
}
else
{
// 可能是双击第一次释放,也可能是单击释放, 先做2 标志,表示待定,如果在规定时间又按下,说明是双击
key2doubleflag=2;
key2doublewaittime=G_timebase;
return NOKEY;
}
}
}
else
{
// 时间短, 是抖动,继续检测, 啥事都不做
return NOKEY;
}
}
else
{
// 第一次碰到释放, 做标志, 开始记录释放时间
shortkey2flag=1;
key2uptime=G_timebase;
return NOKEY;
}
}
}
}
else
{
// 当前没有按键, 啥事都不做
return NOKEY;
}
}
return NOKEY;
}。