集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1181|回复: 1

雾盈FPGA笔记之(二十七)六位四则运算计算器(3)矩阵键盘消抖模块

[复制链接]
雾盈 发表于 2016-8-28 12:51:35 | 显示全部楼层 |阅读模式
本帖最后由 雾盈 于 2016-8-28 13:43 编辑

六位四则运算计算器(3)矩阵键盘消抖模块

                                       
雾盈 2016-8-27


雾盈FPGA笔记汇总目录

一、写在前面

        今天谈矩阵键盘模块的第二个小模块——矩阵键盘消抖模块。
       
       

        同样,按键消抖也有很多方式,但是他们遵循的原则和达到的目的都是一样的,今天讲其中一种,你们也可以和其他方法对比着看。


二、按键消抖原理

        1)按键为什么要消抖?

        我们通常所用的按键开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会马上断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了避免这种现象造成的干扰而作的措施就是按键消抖。
配一张图。
       
       

        而我们矩阵键盘消抖与单个按键消抖的不同之处就是,矩阵键盘消抖主要是防止在一个按键按下的同时,其他按键发生抖动而出现不同的键值。
所以,我们就采用下面的方法去消抖。


三、程序实现按键消抖

        我们采用的是在一次按键动作,扫描时钟扫过整个矩阵键盘时,对产生的键值取其中某七次来 比较,当七次键值全部相同时,输出当前键值,否则重新检测比较。七次是在时钟1kHz频率下的经验数值,你可以根据不同的扫描时钟,比较不同的次数。

四,代码解释

        因为原理比较简单,我们就直接解读程序吧。

        第一步:连续取出七次按键过程中产生的键值,将其存放在寄存器keynum_r中,留做第二步比较。
这段代码如下:

       

        第二步:键值比较

        键值比较写在两个always块里。
        下面这段代码,引入了一个六位寄存器keyf,它的作用我们来看下面

       

         状态S0时,将keyf赋零,自状态S1开始,让当前的寄存器值keynum_r与上一个值进行比较,若相同,则将此值对应的keyf位赋1 ,否则赋零。以此类推,到S6。
       
        这种比较寄存器值的技巧,我们需要学习一下。引入另外一个对应位数的寄存器,让其每一位相与来获得比较结果。
        这样就可以少写很多,if else 语句来判断,达到代码简化的效果。
   
        下面这个always块就是将寄存器keyf的每一位相与,看其是否全部为1 ,全部为1 就说明取的七个键值全部相同,就可以输出当前键值,否则说明不完全相同,需要重新检测比较。
       
       


附上源代码。 
       
       

本帖子中包含更多资源

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

x
芙蓉王 发表于 2016-8-29 10:50:28 | 显示全部楼层
                              很不错
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-16 18:39 , Processed in 0.058948 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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