73

帖子

0

TA的资源

一粒金砂(初级)

101
 
KeyScan()在5ms定时器中断里运行

回复

80

帖子

0

TA的资源

一粒金砂(初级)

102
 
引用 89 楼 huhuheyaoyao 的回复:
软件防抖比较方便,下面是个例子,希望能给你帮助
if(key2==0)
                {
                        delay(10);//防抖
                        if(key2==0)
                                {
                                        if(num==0)
                                        num=60;
                                        num--;
                                        while(!key2);
                                }

巨傻的办法!!
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

103
 
按键可以用状态机表示。
每10mS执行一次键盘扫描任务
0、无键,若有键进入状态1
1、第一次检到有键。若有键进入状态2,同时将键值送缓冲区。 若无键进入状态0。
2、若有键则计时,按键超过300ms进入状态3,同时将键值送缓冲区。 若无键进入状态1。
  表示第一次按键后如果长按键则300ms后认为有一次按键。
3、若有键则计时,按键超过200ms则将键值送缓冲区。 若无键进入状态1。
  表示长按键则以后每200ms后认为有一次按键。

void KeyScan()    //每10mS执行一次键盘扫描任务
{
    switch(KeyState)
    {
        case 0:
            if(KeyIsKeyDown())  //有键
            {
                KeyState = 1;
            }
            break;
        case 1:
            if(KeyIsKeyDown())  //有键
            {
                KeyState = 2;
                KeyBufIn();   //将键值送缓冲区
                KeyStartRptCnt = 0;
            }
            else
            {
                KeyState = 0;
            }
            break;
        case 2:
            if(KeyIsKeyDown())  //有键
            {
                if(KeyStartRptCnt++ >= 30)
                {
                    KeyState = 3;
                    KeyRptCnt = 0;
                    KeyBufIn();
                }
            }
            else
            {
                KeyState = 1;
            }
            break;
        case 3:
            if(KeyIsKeyDown())  //有键
            {
                if(KeyRptCnt++ >= 20)
                {
                    KeyRptCnt = 0;
                    KeyBufIn();
                }
            }
            else
            {
                KeyState = 1;
            }
            break;
        default:
            break;
    }
}
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

104
 

10ms-40ms,对普通的按钮都可以。
要区分按钮的状态,这样可实现按键的单,双,连等击键。
2@1ic的站长blog有详细的叙述,要是没记错的话

 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

105
 
一般是10ms吧,我都是用10ms的
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

106
 
路过  学习
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

107
 
5ms
 
 
 

回复

45

帖子

0

TA的资源

一粒金砂(初级)

108
 
引用楼主 tracing 的回复:
当有键按下去的时候,我延时一段时间,然后再判断,发送数据完毕之后,再延时一段时间,把波形的首尾都滤掉,我不知道这个延时多少才合适呢,我现在的延时是试出来的,不知道有没有其他办法



机械按键,去抖动时间一般为50ms,可以用定时器作去抖动。可参考 《匠人手记》或《OO教你玩USB》
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

109
 
up up
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

110
 
学习了。谢谢
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

111
 
学习了!!!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

112
 
学习学习
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

113
 
路过
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

114
 
硬件防抖,软件防抖都可以,具体还要自己试验
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

115
 
引用 1 楼 shuiyan 的回复:
按键防抖跟按键的类型有关,一般的触点式按键延时10-50ms不等,开关式10ms足矣。
可以考虑用硬件防抖,RC滤波即可。


顶一个
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

116
 
硬件怎么防抖呢
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

117
 
硬件上滤波,程式上延迟判断,应该都可以解决
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

118
 
楼上回答的很精彩,学习了
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

119
 
楼上回答的很精彩,学习了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

120
 
学习了
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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