打印

一个按键程序的问题

[复制链接]
1779|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2012-9-16 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写一个按键程序,区分长按和短按,程序如下:
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();
  }
}
。谢谢

相关帖子

沙发
zwz7219| | 2012-12-8 14:08 | 只看该作者
问题出在 keyCount++ 一句上,它是单字节无符号整数,加到255的时候再加1结果为0,然后又是1、2、3...,可以在前面加上

if (keyCount < 255)
{
    keyCount++;

即使改正了程序也是不健壮的,你的按键检测程序没有去抖部分,很容易造成误判,仍会出现原先的现象。

还有 if(keyCount >= 250),此句会造成keyCount大于249时连续执行直至keyCont等于0为止,而非一次长按只执行一次,应改为 if(keyCount == 250)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝