打印

按键问题

[复制链接]
1687|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2012-7-26 15:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
se, TI, TE, ST, code
本帖最后由 victor3l 于 2012-7-26 15:58 编辑

我想实现一个长按键的功能,具体做法如下:
我写一个键盘扫描函数
void KeyScan()
{
static uchar keyCount = 0;
static uchar keyCode  = 0;
static bit   keyFlag   = 0;
uchar temp ;
temp = P1 & 0x3f;
if(0x3f != temp)
{
  keyCount++;
  if(10 == keyCount )
  {
   keyFlag = 1;
   keyCode = temp;
  }
}
else
{
  keyCount = 0;
  if(keyFlag)
  {
   switch(keyCode)
   {
    case 0x3e: keyVal = 1;break;//mod键按下
    case 0x3d: keyVal = 2;break;//left键按下
    case 0x3b: keyVal = 3;break;//取消键
    case 0x37: keyVal = 4;break;//清零键按下
    case 0x2f: keyVal = 5;break;//up键按下
    case 0x1f: keyVal = 6;break;//设定键按下
    default:break;
   }
   keyFlag = 0;   
  }
}
}


然后用定时器定时20ms,在中断中调用上面的按键扫描函数
在我检测到一个键如第6个键,我想把他长按3秒钟在执行相关操作,代码写成下面的形式:
if(6 == keyVal)
{
        keyVal = 0;
        timeCount++;
        if(timeCount > 150)
        {
               timeCount = 0;
               长按标志位置位;
        }
}

为什么我的程序时钟不能走到长按标志位那里,我的思路对吗?请大侠给我点思路,谢谢。

相关帖子

沙发
joyme| | 2012-7-26 16:15 | 只看该作者
keyVal是键松了之后赋值的,所以上面的做法是错的
static bit LongPress = 0;

if(0x3f != temp)
{
  keyCount++;
  if(10 == keyCount )
  {
         keyFlag = 1;
         keyCode = temp;
  }
  if(keyCount >= 150)
        LongPress = 1;
}

if(keyVal == 6)
{
       keyVal = 0;
       if(LongPress)
      {
            process_long_press
            LongPress = 0;
      }
      else
      {
            process_short_press
      }
}

使用特权

评论回复
板凳
victor3l|  楼主 | 2012-7-26 16:44 | 只看该作者
2# joyme
谢谢您的指导,但是我需要的是长按3s,松手后在做相应处理,您给的是长按到时间后就处理

使用特权

评论回复
地板
ayb_ice| | 2012-7-26 16:45 | 只看该作者
这样处理好了

有按键按下时对变量加一,达到3秒时,输出一次按键值

使用特权

评论回复
5
joyme| | 2012-7-26 17:16 | 只看该作者
仔细看,在你按下去的处理时遇到>=3s 置一个标志,后面的处理本来就是放在松手条件里的

使用特权

评论回复
6
dlyt_test001| | 2012-7-27 10:13 | 只看该作者
源代码要自己写。
你先把逻辑弄出来,要大家帮助分析。
只要逻辑对了,源代码不是问题,你要做不到这一点。。。:lol

使用特权

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

本版积分规则

77

主题

308

帖子

5

粉丝