我写一个按键程序,区分长按和短按,程序如下:
void KeyScan()
{
static uchar keyCount = 0;
static uchar keyCodeL = 0;//长按保存
static uchar keyCodeS = 0;//短按保存
uchar temp ;
temp = P0 & 0x3f;
if(0x3f != temp)
{
keyCount++;
keyCodeS = temp;//这里想把把短按键值保存下来
if(keyCount >= 250) //这里是一直按着的,当超过长按键的计数时,表示有长按键发生,所以要立即执行
{
keyCodeL = temp;
switch(keyCodeL)
{
case 0x1f:keyVal = 7;break;//这里我只检测一个长按键键
default:break;
}
}
}
else//这里表示松手了
{
if(keyCount < 250)//这里计数器时间没到长按的要求可知是短击
{
switch(keyCodeS)
{
case 0x3e: keyVal = 1;keyCount = 0; break;//mod键按下
case 0x3d: keyVal = 2;keyCount = 0; break;//left键按下
case 0x3b: keyVal = 3;keyCount = 0; break;//取消键
case 0x37: keyVal = 4;keyCount = 0; break;//清零键按下
case 0x2f: keyVal = 5;keyCount = 0; break;//up键按下
case 0x1f: keyVal = 6;keyCount = 0; break;//设定键按下
default:break;
}
}
}
}
问题是:当我长按松手,该键所对应的短按键事件也发生了,根据程序的逻辑来看没有问题啊,长按是在keyCount 大于250后发生的,这时松手后,该变量是静态的,程序去执行松手的部分,肯定也不满足keyCount 小于250 的条件啊?不知为什么,请大家帮忙分析,该案件是在10MS的中断中调用的,检测部分是
while(1)
{
if(7 == keyVal)
{
keyVal = 0;
LoadDat(0x76,0x82);
DispOn();
}
if(6 == keyVal)
{
keyVal = 0;
LoadDat(0x60,0xee);
DispOn();
}
}
。谢谢 |