集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 8434|回复: 15

键盘扫描代码

[复制链接]
奋斗的小孩 发表于 2016-7-13 16:21:59 | 显示全部楼层 |阅读模式
module key_board (clk, rst_n, row, col, data, valid, clk_1k);

        input clk;
        input rst_n;
        input [3:0] row;
       
        output reg [3:0] col;
        output reg [3:0] data;
        output reg valid;
        output reg clk_1k;

        reg [14:0] cnt;
       
        parameter T1ms = 24999;
       
        always @ (posedge clk or negedge rst_n)
                begin
                        if (!rst_n)
                                begin
                                        clk_1k <= 1'b1;
                                        cnt <= 15'd0;
                                end
                        else
                                begin
                                        if (cnt < T1ms)
                                                begin
                                                        cnt <= cnt + 15'd1;
                                                end
                                        else
                                                begin
                                                        cnt <= 15'd0;
                                                        clk_1k <= ~clk_1k;
                                                end
                                end       
                end

        reg [7:0] row_col;
        reg [1:0] state;
        reg [4:0] count;
       
        always @ (posedge clk_1k or negedge rst_n)
                begin
                        if (!rst_n)
                                begin
                                        col <= 4'b0000;
                                        row_col <= 8'd0;
                                        state <= 0;
                                        valid <= 0;
                                        count <= 0;
                                end
                        else
                                begin
                                        case (state)
                                                0 : begin
                                                                if (row == 4'b1111)
                                                                        begin
                                                                                col <= 4'b0000;
                                                                        end
                                                                else
                                                                        begin
                                                                                state <= 1;
                                                                        end
                                                        end
                                               
                                                1 : begin
                                                                if (row == 4'b1111)
                                                                        begin
                                                                                state <= 0;
                                                                                count <= 0;
                                                                        end
                                                                else
                                                                        begin
                                                                                if (count < 19)
                                                                                        begin
                                                                                                count <= count + 1;
                                                                                        end
                                                                                else
                                                                                        begin
                                                                                                count <= 0;
                                                                                                state <= 2;
                                                                                                col <= 4'b0111;
                                                                                        end
                                                                        end       
                                                        end
                                                       
                                                2 : begin
                                                                if (row == 4'b1111)
                                                                        begin
                                                                                col <= {col[2:0],col[3]};
                                                                                state <= 2;
                                                                        end
                                                                else
                                                                        begin
                                                                                row_col <= {row,col};
                                                                                state <= 3;
                                                                                valid <= 1;
                                                                        end
                                                        end
                                                       
                                                3 : begin
                                                                if (row == 4'b1111)
                                                                        begin
                                                                                state <= 0;
                                                                                valid <= 0;
                                                                        end
                                                                else
                                                                        begin
                                                                                valid <= 0;
                                                                                state <= 3;
                                                                        end
                                                        end
                                               
                                                       
                                                default : state <= 0;
                                               
                                        endcase
                                end
                end       

        always @ (*)
                begin
                        case (row_col)
                                8'b0111_0111 : data = 4'hf;
                                8'b0111_1011 : data = 4'he;
                                8'b0111_1101 : data = 4'hd;
                                8'b0111_1110 : data = 4'hc;
                               
                                8'b1011_0111 : data = 4'hb;
                                8'b1011_1011 : data = 4'ha;
                                8'b1011_1101 : data = 4'h9;
                                8'b1011_1110 : data = 4'h8;
                               
                                8'b1101_0111 : data = 4'h7;
                                8'b1101_1011 : data = 4'h6;
                                8'b1101_1101 : data = 4'h5;
                                8'b1101_1110 : data = 4'h4;
                               
                                8'b1110_0111 : data = 4'h3;
                                8'b1110_1011 : data = 4'h2;
                                8'b1110_1101 : data = 4'h1;
                                8'b1110_1110 : data = 4'h0;
                               
                                default : data = 4'h0;
                        endcase
                end


endmodule
 楼主| 奋斗的小孩 发表于 2016-7-13 16:22:30 | 显示全部楼层
欢迎留言······················至芯科技奋斗的小孩
4798345 发表于 2017-3-15 11:40:56 | 显示全部楼层
感谢楼主分享
fpga_feixiang 发表于 2017-3-15 12:33:49 | 显示全部楼层
很强大,很牛
fpga_wuhan 发表于 2017-3-23 16:20:25 | 显示全部楼层
键盘扫描代码
4798345 发表于 2017-3-23 16:58:54 | 显示全部楼层
键盘扫描代码
星坠天际 发表于 2017-3-24 08:54:28 | 显示全部楼层

键盘扫描代码
南烟的北木 发表于 2017-3-26 11:32:11 | 显示全部楼层
很强势,必须支持一波。
大鹏 发表于 2017-3-26 17:22:19 | 显示全部楼层
厉害呀,我的楼主!
fpga_feixiang 发表于 2017-3-27 14:21:25 | 显示全部楼层
这个程序写的NB
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

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

GMT+8, 2024-12-24 00:04 , Processed in 0.087991 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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