锆石科技社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 408|回复: 3

关于数字时钟项目实战中按键消抖的问题

[复制链接]

3

主题

26

帖子

1162

积分

金牌会员

Rank: 6Rank: 6

积分
1162
QQ
发表于 2017-5-2 10:08:30 | 显示全部楼层 |阅读模式


如图所示,在数字时钟的按键模块中,我发现最后一行代码,即assign key_out = key_reg & (~key_reg_n); 没有起到注释中的作用,它不能检测到按键的变化,反而会使key_out永远为8'h00。
假设一开始KEY为8'h00,经过一段时间后,KEY变为8'h01并且持续时间超过20ms,那么KEY的值就会赋给key_reg_n,key_reg_n的值又在时序电路中赋给key_reg,那么,此时key_reg与key_reg_n的值都是8'h01,那么assign key_out = key_reg & (~key_reg_n);不就永远是0吗?
不知道自己理解的对不对,烦请各路大神解惑呀~~~~~~~~~~~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

发表于 2017-5-2 15:13:30 | 显示全部楼层
这里我们假设按键默认状态是(0000_0000),也就是没有一个按键按下,此时如果KEY1按键按下,那么我们按键的值会立刻变成 (0000_0001),当20ms到达了以后,我们便会将0000_0001存入到key_reg中。如果我们KEY1按键按下后一直没有松开,那么此时key_reg中的值一直便会是0000_0001,而key_reg_n中的值也就是0000_0001,然后key_reg & (~key_reg_n) = 0000_0001 & (1111_1110) = 0000_0000,0000_0000也就意味着我们按键没有任何变化。但是当我们松开KEY1按键后,我们key_reg中的值仍是0000_0001,而我们的key_reg_n到了20ms后便会接收0000_0000,此时key_reg & (~key_reg_n) = 0000_0001 & (1111_1111) = 0000_0001,0000_0001也就意味着我们KEY1按键按下了,这里需要我们注意的是,0000_0001这个状态只会存在1个时钟周期,也就是只会在按下按键以后松开按键的一瞬间才会生成该信号,其他的时候则不会有任何变化,即使一直按下按键不松开,它也不会认为有按键按下,只有当按下按键松开的那一瞬间,它才能够判断出有按键按下。
回复 支持 反对

使用道具 举报

3

主题

26

帖子

1162

积分

金牌会员

Rank: 6Rank: 6

积分
1162
QQ
 楼主| 发表于 2017-5-3 08:38:58 | 显示全部楼层
锆石科技解答员 发表于 2017-5-2 15:13
这里我们假设按键默认状态是(0000_0000),也就是没有一个按键按下,此时如果KEY1按键按下,那么我们按键 ...

原来如此,谢啦~
回复 支持 反对

使用道具 举报

1

主题

61

帖子

78

积分

注册会员

Rank: 2

积分
78
发表于 2017-5-30 12:57:09 | 显示全部楼层
6666666666
回复 支持 反对

使用道具 举报

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

本版积分规则

手机版|小黑屋|锆石科技社区 ( 苏ICP备15059756号  

GMT+8, 2019-5-27 03:59 , Processed in 0.146807 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表