打印

按键三秒后抬键的判断

[复制链接]
2847|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuoulyy|  楼主 | 2010-2-1 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠好:
     我在程序中,按住设置键3S,进入上限温度,并显示HHH。  抬起按键,再次按住设置键一下,显示下限温度,显示LLL。   抬起再按一次,返回显示当前温度。   可是我按住设置键不放时,当前温度,HHH,LLL,轮流显示。(按4-6秒,可能原本是想设定上限温度,它一下跑到下限温度设定。)

问题是按住设置键3S后,进入HHH上限温度设定时,程序没有把按键抬起作处理。
除了加一抬键标志位,还是否有更简捷的思路。我见别人的程序并没有在设置键子程序中加抬键标志位。

相关帖子

沙发
liuoulyy|  楼主 | 2010-2-2 11:33 | 只看该作者
大家指点下啦

使用特权

评论回复
板凳
jerkoh| | 2010-2-2 11:53 | 只看该作者
本帖最后由 jerkoh 于 2010-2-2 11:55 编辑

帮忙顶下
看 hot的那个 按键代码分析 里面有长键的处理

使用特权

评论回复
地板
原野之狼| | 2010-2-2 12:15 | 只看该作者
搜索论坛的帖子 有很多帖子都是讨论这个按键扫描的

使用特权

评论回复
5
xymxym| | 2010-2-2 13:03 | 只看该作者
不要把过程想得那么复杂,就长按和单击的关系,然后就是菜单状态转换,单击事件根据当前不同的状态去做不同的事.

使用特权

评论回复
6
程序匠人| | 2010-2-2 13:12 | 只看该作者
用状态机思路去解决吧

使用特权

评论回复
7
ljolove| | 2010-2-2 13:29 | 只看该作者
本帖最后由 ljolove 于 2010-2-2 14:19 编辑

晕了,怎么一打开是首页,谢谢匠人的提醒,算了还是再复制一遍吧
void scan_key(void)
{
switch(Keystate)
{
  case KEY_IDEL :
   Key_v=PIND&0x0f;
   if(Key_v!=NONE_KEY_DOWN)
   {
    Keystate=KEY_DELAY;
    KeyDelaytime=0;
   }
  break;
  case KEY_DELAY :
        if(KeyDelaytime>=KEY_DELAY_TIME)
        {
           Key_v=PIND&0x0f;
    if(Key_v!=NONE_KEY_DOWN)
    {
           if(Keylock==1)
           {
               if(Key_v==KEY_ENTER)
               {
                   Key_lock_2s=0;
               }
               else if(Key_v==KEY_RESET)
               {
                   if(Unstable_bit==0)
                   {
                       PORTB&=0xf9;
                       Led_state&=0xf9;
                       CH452_Write(CH452_NO_BCD);
                                            CH452_Write(CH452_DIG0|Led_state);
                                            Delay_timer=0;
                   }
               }
           }
           else
           {
               Key_pro(Key_v);
           }
           KeySound();
           Keystate=WAIT_KEY_OPEN;
          }
   else
          {
        Keystate=KEY_IDEL;
   }
       }
  break;
  case WAIT_KEY_OPEN :
   Key_v=PIND&0x0f;
   if(Key_v==NONE_KEY_DOWN)
   {
       Keystate=KEY_IDEL;
       Key_lock_2min=0;
       return_disp=0;
   }
          else if(Key_v==KEY_ENTER)
   {
       if(Key_lock_2s>=2000)
       {
           Machine_state=DISP_UNLOCK;//DISP_Unlock();
           Key_lock_disp_time=0;
           Key_lock_2s=0;
           Keylock=0;
       }
   }
  break;
        }
}
扫描按键处理,第三个状态是判断按键抬起的,你要做什么设置都可以在里面加,我的代码里有一个是判断按两秒开锁的,LZ描述的功能通过这个应该可以轻松实现

使用特权

评论回复
8
程序匠人| | 2010-2-2 13:44 | 只看该作者
7楼的连接地址有误

使用特权

评论回复
9
ljolove| | 2010-2-2 14:21 | 只看该作者
在加一句,LZ最好在主程序也分几个状态,这样可以方便操作

使用特权

评论回复
10
liuoulyy|  楼主 | 2010-2-5 19:48 | 只看该作者
谢谢

使用特权

评论回复
11
红心J| | 2010-2-6 14:56 | 只看该作者
加一后判断,超过三秒的固定到三秒,以免定时器溢出到零

使用特权

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

本版积分规则

134

主题

472

帖子

1

粉丝