打印
[STC单片机]

单片机判断按键单击或双击

[复制链接]
9366|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. 然后封装一层判断两次按下事件的间隔时间。随便你爱怎么判断就怎么判断。

使用特权

评论回复
5
sedatefire| | 2013-8-17 23:01 | 只看该作者
给你个伪代码,几天后来检查你的作业
void key_scan_10ms(void)
{
   1. 读入io电平,去抖动

   2. 判断按下 还是 弹起

}

使用特权

评论回复
6
奔牛滚滚| | 2013-8-17 23:01 | 只看该作者
这程序写的,苦等100ms.天大的浪费.单片机能干的事情不多了

使用特权

评论回复
7
sedatefire| | 2013-8-17 23:02 | 只看该作者
不要delay硬延时了,把key_scan_10ms(void),每10ms执行一次即可。

使用特权

评论回复
8
创隆电子| | 2013-8-18 08:02 | 只看该作者
对于初学者,就让他用delay延时吧!!100毫秒太小,加大到1秒,再判断是否离开,就行了嘿嘿嘿

使用特权

评论回复
9
创隆电子| | 2013-8-18 08:03 | 只看该作者
你可以建立一个标志位,来判断按下欲离开。

使用特权

评论回复
10
opal11|  楼主 | 2013-8-18 13:26 | 只看该作者
delay延时到200-400毫秒测试,双击功能可以实现,但每次双击的同时单击的功能也会有,不知要怎么改?

使用特权

评论回复
11
chenyu988| | 2013-8-18 14:48 | 只看该作者
标志位是好东西啊

使用特权

评论回复
12
liusanshan| | 2013-8-18 16:36 | 只看该作者
基本逻辑是不是有错误啊!
1,有按键;
2,等待,直到无按键;
3,延时100ms,判断是否有按键进行逻辑处理;这里100ms要很快啊。这个地方应该是一个while循环的等待。


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

4楼兄弟说的也很有道理,将业务和逻辑进行分开。

使用特权

评论回复
13
lnulibin| | 2013-8-18 16:57 | 只看该作者
if(key == 0)
      {                        //确认第二次按下
        LED2=~LED2;

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

不过,建议楼主还是利用定时器中断来处理此类功能。
不然,死等的时间太长了。浪费了单片机很多精力。

使用特权

评论回复
14
79xiaozaizai| | 2013-8-18 19:52 | 只看该作者
标志位好东西,还可以防止误操作

使用特权

评论回复
15
Harvard| | 2013-8-18 21:07 | 只看该作者
定时扫描+ 标志位状态机. 这种直接延时的做法. 也只有书本上才有,用来忽悠人

使用特权

评论回复
16
opal11|  楼主 | 2013-8-18 21:19 | 只看该作者
加上13楼补充的
while(!key);    //////加上这一句就好了。不会出现单双击同时执行了。
可以了,
但不知版主说的伪代码是怎么写的?

使用特权

评论回复
17
gdutxzy| | 2013-8-18 21:48 | 只看该作者
把两次按键之间时间定义为若不大于0.5秒则视为双击。

使用特权

评论回复
18
coody| | 2013-8-19 10:19 | 只看该作者
很简单,检测两次键的间隔,判断其值。就是单键时,执行会有点点滞后,取决与判断双击的时间间隔。
一般可以判断单击、双击、长按。。。。

使用特权

评论回复
19
guangbiao| | 2013-8-21 14:34 | 只看该作者
“小朋友”的程序没有问题,是操作的问题。你手按下按键后不要松开,然后颤抖一下,按下按键的那个手指就可以了。

使用特权

评论回复
20
freelife80| | 2013-8-21 17:36 | 只看该作者
19楼正解,但你这一抖还是要符合100mS的要求,不然,LED2还是不理你的,说不定你这一抖100mS还是过去了,呵呵.

使用特权

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

本版积分规则

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

10

主题

392

帖子

1

粉丝