按键三秒后抬键的判断

[复制链接]
3666|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 | 显示全部楼层
搜索论坛的帖子 有很多帖子都是讨论这个按键扫描的
xymxym 发表于 2010-2-2 13:03 | 显示全部楼层
不要把过程想得那么复杂,就长按和单击的关系,然后就是菜单状态转换,单击事件根据当前不同的状态去做不同的事.
程序匠人 发表于 2010-2-2 13:12 | 显示全部楼层
用状态机思路去解决吧
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描述的功能通过这个应该可以轻松实现
程序匠人 发表于 2010-2-2 13:44 | 显示全部楼层
7楼的连接地址有误
ljolove 发表于 2010-2-2 14:21 | 显示全部楼层
在加一句,LZ最好在主程序也分几个状态,这样可以方便操作
 楼主| liuoulyy 发表于 2010-2-5 19:48 | 显示全部楼层
红心J 发表于 2010-2-6 14:56 | 显示全部楼层
加一后判断,超过三秒的固定到三秒,以免定时器溢出到零
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

472

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部