集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2389|回复: 5

锦夏笔记(二) 矩阵键盘消抖模块

[复制链接]
wuyongduoduo 发表于 2016-8-23 08:54:13 | 显示全部楼层 |阅读模式
本帖最后由 wuyongduoduo 于 2016-8-23 08:54 编辑

        今天是进行矩阵键盘计算器项目的第2天,主要任务是设计按键消抖及简单的数码管显示模块,实现按下按键数码管显示出相应的按键号的功能。该模块属于键盘模块,模块命名为key_xd。



        主要框图如上所示,上一阶段已经完成了keyscan键盘扫描模块,该模块根据按下的按键输出相应[4:0]key_num,我们需对key_num进行消抖处理。
        之前学习过一种消抖方法,在已知按下按键后的稳定状态应为低电平时,在检测到低电平后延时10ms后再检测一下当前状态是否为低电平,是则认为状态稳定按键按下,否则继续检测。由于矩阵键盘情况较为复杂,按下后的状态不是简单的高低电平,可能存在多种状态,所以采用一种新的消抖方法,具体方法如下:
        一般按键抖动的过程为10ms,若我们将抖动过程分为10份,即每份为1ms(1khz)。每1ms检测一个数据,判断这个数据是否同上一个检测到的数据相同,是则计数器加1并继续进行后续检测,否则返回原始状态重新开始检测,直至检测到的10个(多几次或者少几次均可,根据具体情况来定)的数据均相同,即判断按键状态稳定,输出真实按键值[4:0]real_num,并输出一个按键是能信号key_en。
主要代码如下:
always @ (posedge clk or negedge rst_n)   /**************生成一个1khz的时钟,用于检测key_num***************/
        begin
                if(!rst_n)
                        begin
                                cnt <= 15'd0;
                                clk_1k <= 0;
                        end
                else
                        if( cnt >=25000)
                                begin
                                        cnt <= 0;
                                        clk_1k <= ~clk_1k;
                                end
                        else
                                cnt <= cnt + 1'b1;                                       
        end
always @ (posedge  clk_1k  or  negedge  rst_n)
        begin
                if(!rst_n)
                        begin
                                state <= 3'd0;
                                num_temp <= 5'b0_0000;
                                num_temp1 <= 5'b0_0000;
                                real_num <= 5'b0_0000;
                                key_en <= 0;
                        end
                else
                        begin
                                case(state)
                                0: begin
                                                num_temp <= key_num;
                                                state <= 1;
                                        end
                                1: begin
                                                num_temp <= key_num;
                                                num_temp1 <= num_temp;
                                                state <= 2;
                                        end
                                2: begin          /******************比较检测到的key_num,相同则继续,不同则返回0状态**********************/
                                                if(num_temp1 == num_temp)   
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 3;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                3: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 4;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                4: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 5;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                5: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 6;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                6: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 7;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                7: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 8;
                                                        end
                                                else
                                                        state <= 0;
                                end
                                8: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 9;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                9: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 10;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                10: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 11;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                11: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 12;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                12: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 13;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                13: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 14;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                14: begin
                                                if(num_temp1 == num_temp)
                                                        begin
                                                                num_temp <= key_num;
                                                                num_temp1 <= num_temp;
                                                                state <= 15;
                                                        end
                                                else
                                                        state <= 0;
                                        end
                                15: begin/***********************经过13次比较,每次检测到的状态都一致,说明按键状态稳定*************************/
                                                real_num <= key_num;
                                                state <= 0;
                                                if(key_num[4])
                                                key_en <= 1;  /**************按键使能信号,用于判断按键按下************************/
                                                else
                                                key_en <= 0;  /**************按键使能信号,用于判断按键抬起或者没有按键按下************************/
                                        end
                                               
                                default:
                                                begin
                                                        state <= 0;
                                                end
                                endcase
                        end
        end
        
        过程中出现的问题:受之前学习的按键消抖的影响,当老师给出了要给矩阵键盘消抖时我的第一反应时给矩阵键盘反馈的[3:0]row消抖,但在对矩阵键盘进行扫描时,其反馈出的[3:0]row一直处于变化状态(具体可参看锦夏笔记(一)中的总结),无法进行消抖操作。

本帖子中包含更多资源

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

x
Blondie 发表于 2016-8-23 09:20:31 | 显示全部楼层
                                            感谢分享
芙蓉王 发表于 2016-8-23 09:26:00 | 显示全部楼层
                  不错,支持
Esmiamor 发表于 2016-8-23 09:35:37 | 显示全部楼层
             实用。
zhiweiqiang33 发表于 2016-8-23 11:30:52 | 显示全部楼层
硬件的概念有一个了解  支持
大辉 发表于 2017-8-4 11:44:50 | 显示全部楼层
你是新手吗?感觉好牛逼呀
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

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

GMT+8, 2025-6-29 05:55 , Processed in 0.071163 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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