15177|20

79

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

按键防抖程序问题 [复制链接]

请问大家有没有好的防抖程序或防抖电路。我遇到一个按键抖动的问题,有的话跟大家分享一下哦。谢谢!
此帖出自单片机论坛

最新回复

case 2://清零 TR0=0;//关中断 keycnt=-1;//显示清零 break; case 3: //运行 TR0=1; //开中断 keycnt=0;不理解keycnt的值为什么你要给-1和0,既然你前面写的是keycnt++,那么keycnt的值最好都是大于等于1的数字。另一个问题就是你的switch语句里面咋没有default,有的时候你按键按下时,keycnt的值可能会累加好几次,导致case语句里面找不到你要的值。导致程序跑飞,按键不灵。你的方法和思路都正确,不过软件漏洞比较多!  详情 回复 发表于 2010-6-1 17:30
点赞 关注
 

回复
举报

557

帖子

0

TA的资源

裸片初长成(初级)

沙发
 

办法是很多的,如何选择取决于你的设计

   解决消抖的方法还是比较多的,这里只举出三个层次的例子(包括你提的程序--软件的方法):

1、比较原始的:采用RS触发器,可以取得比较可靠的结果,适用于比较小的(按键较少的)应用;

2、采用口的定时(软件延时识别判定)方法,在本论坛上讨论的很多了。

3、采用专用的功能型芯片,可以:1、同时处理LED显示问题;2、可以处理很多键的比较复杂的结构;3、节省你的CPU的软硬件资源。但这适合于键比较多的场合(例如MAXIM的MAX6954等等)。

还是那句话,方法很多,最终选择取决于具体的课题要求,因此也建议你提的具体些,别太笼统,就好讨论了。这里真行家很多,别错过机会。
此帖出自单片机论坛
 
 

回复

79

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
我就是用到一个按键,按键控制的数码管显示,按一次停止运行,再按一次清零,再按一次运行。但我试了程序的方法,可能我没写正确吧,没达到预期的效果。请大家帮帮忙。
此帖出自单片机论坛
 
 
 

回复

802

帖子

24

TA的资源

五彩晶圆(中级)

4
 
这个问题 你就用楼上说的第二种方法 就OK了,软件延时去抖,
这个名字就很直观了 呵呵
此帖出自单片机论坛
 
个人签名生活在激情中 ... 希望 哈哈

https://home.eeworld.com.cn/?80086
 
 

回复

537

帖子

0

TA的资源

五彩晶圆(初级)

5
 
这个使用循环采集按键的方法很容易搞定,
此帖出自单片机论坛
 
 
 

回复

79

帖子

0

TA的资源

纯净的硅(初级)

6
 
5楼的你好,能说具体点怎么个循环采集按键?能说清楚或举例说一下可以吗?
此帖出自单片机论坛
 
 
 

回复

79

帖子

0

TA的资源

纯净的硅(初级)

7
 
4楼的你好,能说一下你的程序防抖吗?
此帖出自单片机论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

8
 
原帖由 HUI535233725 于 2010-5-4 09:02 发表
我就是用到一个按键,按键控制的数码管显示,按一次停止运行,再按一次清零,再按一次运行。但我试了程序的方法,可能我没写正确吧,没达到预期的效果。请大家帮帮忙。

 既已做到这么具体,何不贴一下你的按键电路和相关程序呢?处理办法的好坏都是和具体方案相联系的。一般用软件去抖省成本,并个电容去抖省脑筋,但都是有条件的,无法一概而论。另外“没达到预期的效果”也可能有别的原因,比如跃变沿的检测逻辑不对等等。
此帖出自单片机论坛
 
 
 

回复

79

帖子

0

TA的资源

纯净的硅(初级)

9
 
[qq]535233725[/qq]好的
void kelay()
{
     if(!stop) //如果按键按下
   {
     delay1(10);//延时10MS
      if(!stop) //如果按键真的按下
      {
        keycnt++//按键自加
     
        switch (keycnt)
     {
      
      case 1:    //停止运行
         TR0=0;  //关中断
         break;
      case 2://清零
            TR0=0;//关中断
          keycnt=-1;//显示清零
          break;
      case 3:    //运行
         TR0=1; //开中断
         keycnt=0; //按键清零
         break;
      //  while(!stop);
                    }
      while(!stop);
   
        }
  
     }
}

[ 本帖最后由 HUI535233725 于 2010-5-4 13:46 编辑 ]

12.jpg (14.33 KB, 下载次数: 0)

12.jpg
此帖出自单片机论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

10
 
 电路可以,但源码中对keycnt值的控制意图不明,好像应该是1→2→3→1→……变化吧?如此case 2的“keycnt=-1”和case 3的“keycnt=0”恐怕就不对了。
此帖出自单片机论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

11
 

补充

 如对去抖没把握的话,可先在开关两端并一0.1uF电容用硬件去抖,软件暂不处理,调通控制逻辑再说。
此帖出自单片机论坛
 
 
 

回复

79

帖子

0

TA的资源

纯净的硅(初级)

12
 
10的我那程序应该是这样的,上次发错了。

void kelay()
{
     if(!stop) //如果按键按下
   {
     delay1(10);//延时10MS
      if(!stop) //如果按键真的按下
      {
        keycnt++//按键自加
     
        switch (keycnt)
     {
      
      case 1:    //停止运行
         TR0=0;  //关中断
         break;
      case 2://清零
            TR0=0;//关中断
        temp=0;//显示清零(这个是用于数码管显示清零的)
          break;
      case 3:    //运行
         TR0=1; //开中断
         keycnt=0; //按键清零
         break;
      //  while(!stop);
                    }
      while(!stop);
   
        }
  
     }
}
此帖出自单片机论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

13
 

楼上程序的执行结果仍不对吗?

1、keycnt应该是个静态(或全程)变量,初始值赋了吗?
2、是否已确认delay1()的正确性?如无把握可先去掉,并电容一试。
此帖出自单片机论坛
 
 
 

回复

2771

帖子

0

TA的资源

裸片初长成(中级)

14
 
原帖由 HUI535233725 于 2010-5-4 12:38 发表
535233725好的
void kelay()
{
     if(!stop) //如果按键按下
   {
     delay1(10);//延时10MS
      if(!stop) //如果按键真的按下
      {
        keycnt++//按键自加
     
        switch (keycn ...
[qq]66545301[/qq]
此帖出自单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(初级)

15
 
就像上面所说的延时去抖就能解决啦
此帖出自单片机论坛
 
 
 

回复

79

帖子

0

TA的资源

纯净的硅(初级)

16
 
哦,我还没想到静态变量呢,谢谢13楼的提醒。
此帖出自单片机论坛
 
 
 

回复

340

帖子

0

TA的资源

纯净的硅(初级)

17
 
做个循环
此帖出自单片机论坛
 
 
 

回复

702

帖子

0

TA的资源

一粒金砂(高级)

18
 

回复 10楼 仙猫 的帖子

对,是他说的那样
此帖出自单片机论坛
 
个人签名你好呀
 
 

回复

27

帖子

0

TA的资源

一粒金砂(初级)

19
 
哈哈,又是按键抖动的问题。不知道当初我那篇帖子还能找得到不。当初我那帖子也是炸出了不少高手牛人来讨论呢
此帖出自单片机论坛
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(初级)

20
 
void kelay()
{
        if(!stop) //如果按键按下
        {
                delay1(10);//延时10MS
                if(!stop) //如果按键真的按下
                {
                        keycnt++//按键自加
                        switch (keycnt)
                        {
                                case 1: //停止运行
                                TR0=0; //关中断 break;
                                case 2://清零 TR0=0;//关中断 keycnt=-1;//显示清零 break;
                                case 3: //运行 TR0=1; //开中断 keycnt=0; //按键清零 break; //  
                        }
                while(!stop);
                }
                  
        }
}
此帖出自单片机论坛
 
个人签名一生只做一件事
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表