[STC单片机] 单片机判断按键单击或双击

[复制链接]
10172|21
 楼主| opal11 发表于 2013-8-17 22:07 | 显示全部楼层 |阅读模式
/*****************************
        用单片机判断按键单击双击,自己写的,实现不了,LED1可以亮灭,LED2不行,
以下是部分程序:
*********************/
if(key == 0)                 //假设有键按下时 key = 0 。
{                       //发现按下按键
   Delay(10)            //延时约10ms
   if(key == 0)  
   {                         //确认第一次按下
     while(!key);       //等待释放
     Delay(100)         //多延时一会,约100ms
     if(key == 0)
      {                        //确认第二次按下
        LED2=~LED2;
      }
      else
     {
        LED1=~LED1;
     }
   }
}
dirtwillfly 发表于 2013-8-17 22:32 来自手机 | 显示全部楼层
延时100mS太苛刻,人手操作不到此时刚好被按下
linfeng24 发表于 2013-8-17 22:52 | 显示全部楼层
100ms这个时间你怎么确定的啊?改大些试试,500ms
sedatefire 发表于 2013-8-17 22:58 | 显示全部楼层
分层啦兄弟
1. 请事先一个按键扫描程序,去抖动时间为30ms左右即可。
判断按下、弹起两个事件。

2. 然后封装一层判断两次按下事件的间隔时间。随便你爱怎么判断就怎么判断。

sedatefire 发表于 2013-8-17 23:01 | 显示全部楼层
给你个伪代码,几天后来检查你的作业
void key_scan_10ms(void)
{
   1. 读入io电平,去抖动

   2. 判断按下 还是 弹起

}
奔牛滚滚 发表于 2013-8-17 23:01 | 显示全部楼层
这程序写的,苦等100ms.天大的浪费.单片机能干的事情不多了
sedatefire 发表于 2013-8-17 23:02 | 显示全部楼层
不要delay硬延时了,把key_scan_10ms(void),每10ms执行一次即可。
创隆电子 发表于 2013-8-18 08:02 | 显示全部楼层
对于初学者,就让他用delay延时吧!!100毫秒太小,加大到1秒,再判断是否离开,就行了嘿嘿嘿
创隆电子 发表于 2013-8-18 08:03 | 显示全部楼层
你可以建立一个标志位,来判断按下欲离开。
 楼主| opal11 发表于 2013-8-18 13:26 | 显示全部楼层
delay延时到200-400毫秒测试,双击功能可以实现,但每次双击的同时单击的功能也会有,不知要怎么改?
chenyu988 发表于 2013-8-18 14:48 | 显示全部楼层
标志位是好东西啊
liusanshan 发表于 2013-8-18 16:36 | 显示全部楼层
基本逻辑是不是有错误啊!
1,有按键;
2,等待,直到无按键;
3,延时100ms,判断是否有按键进行逻辑处理;这里100ms要很快啊。这个地方应该是一个while循环的等待。


刚刚开了一个别人发的邮件,建议用定时器处理等待,这样不占用CPU资源,说的很有道理。

4楼兄弟说的也很有道理,将业务和逻辑进行分开。
lnulibin 发表于 2013-8-18 16:57 | 显示全部楼层
if(key == 0)
      {                        //确认第二次按下
        LED2=~LED2;

             while(!key);    //////加上这一句就好了。不会出现单双击同时执行了。
      }
      else
     {
        LED1=~LED1;
     }

不过,建议楼主还是利用定时器中断来处理此类功能。
不然,死等的时间太长了。浪费了单片机很多精力。
79xiaozaizai 发表于 2013-8-18 19:52 | 显示全部楼层
标志位好东西,还可以防止误操作
Harvard 发表于 2013-8-18 21:07 | 显示全部楼层
定时扫描+ 标志位状态机. 这种直接延时的做法. 也只有书本上才有,用来忽悠人
 楼主| opal11 发表于 2013-8-18 21:19 | 显示全部楼层
加上13楼补充的
while(!key);    //////加上这一句就好了。不会出现单双击同时执行了。
可以了,
但不知版主说的伪代码是怎么写的?
gdutxzy 发表于 2013-8-18 21:48 | 显示全部楼层
把两次按键之间时间定义为若不大于0.5秒则视为双击。
coody 发表于 2013-8-19 10:19 | 显示全部楼层
很简单,检测两次键的间隔,判断其值。就是单键时,执行会有点点滞后,取决与判断双击的时间间隔。
一般可以判断单击、双击、长按。。。。
guangbiao 发表于 2013-8-21 14:34 | 显示全部楼层
“小朋友”的程序没有问题,是操作的问题。你手按下按键后不要松开,然后颤抖一下,按下按键的那个手指就可以了。
freelife80 发表于 2013-8-21 17:36 | 显示全部楼层
19楼正解,但你这一抖还是要符合100mS的要求,不然,LED2还是不理你的,说不定你这一抖100mS还是过去了,呵呵.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:选对一件事,坚持下去,一定会成功!

10

主题

392

帖子

1

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