键盘扫描程序

步骤:
1、列输入0,行检测是不是全为1;
2、行检测到0,一列依次为0,看行是不是还是0
3、如果是根据行和列的值判断是第几行第几列。
Verilog HDL 4*4矩阵键盘扫描程序
在这里插入图片描述

module key

(

 clk,  //50MHZ

 reset,

 row,   //行

 col,   //列

 key_value  //键值

);

input clk,reset;

 input [3:0] row;

 output [3:0] col;

 output [3:0] key_value;


 reg [3:0] col;

 reg [3:0] key_value;

 reg [5:0] count;//delay_20ms

 reg [2:0] state;  //状态标志

 reg key_flag;   //按键标志位

 reg clk_500khz;  //500KHZ时钟信号

 reg [3:0] col_reg;  //寄存扫描列值

 reg [3:0] row_reg;  //寄存扫描行值


always @(posedge clk or negedge reset)

   if(!reset) begin clk_500khz<=0; count<=0; end

   else

    begin

      if(count>=50) begin clk_500khz<=~clk_500khz;count<=0;end

      else count<=count+1;

    end



 always @(posedge clk_500khz or negedge reset)

   if(!reset) begin col<=4'b0000;state<=0;end

   else

    begin

     case (state)

      0:

         begin

         col[3:0]<=4'b0000;

         key_flag<=1'b0;

         if(row[3:0]!=4'b1111) begin state<=1;col[3:0]<=4'b1110;end //有键按下,扫描第一行

         else state<=0;

         end

      1:

         begin

          if(row[3:0]!=4'b1111) begin state<=5;end   //判断是否是第一行

          else  begin state<=2;col[3:0]<=4'b1101;end  //扫描第二行

         end

      2:

         begin

         if(row[3:0]!=4'b1111) begin state<=5;end    //判断是否是第二行

         else  begin state<=3;col[3:0]<=4'b1011;end  //扫描第三行

         end

      3:

         begin

         if(row[3:0]!=4'b1111) begin state<=5;end   //判断是否是第三一行

         else  begin state<=4;col[3:0]<=4'b0111;end  //扫描第四行

         end

      4:

         begin

         if(row[3:0]!=4'b1111) begin state<=5;end  //判断是否是第一行

         else  state<=0;

         end

      5:

         begin

          if(row[3:0]!=4'b1111)

begin

 col_reg<=col;  //保存扫描列值

row_reg<=row;  //保存扫描行值

state<=5;

key_flag<=1'b1;  //有键按下

 end

          else

            begin state<=0;end

         end

     endcase

    end



 always @(clk_500khz or col_reg or row_reg)

     begin

        if(key_flag==1'b1)

                begin

                     case ({col_reg,row_reg})

                      8'b1110_1110:key_value<=0;

                      8'b1110_1101:key_value<=1;

                      8'b1110_1011:key_value<=2;

                      8'b1110_0111:key_value<=3;



                      8'b1101_1110:key_value<=4;

                      8'b1101_1101:key_value<=5;

                      8'b1101_1011:key_value<=6;

                      8'b1101_0111:key_value<=7;



                      8'b1011_1110:key_value<=8;

                      8'b1011_1101:key_value<=9;

                      8'b1011_1011:key_value<=10;

                      8'b1011_0111:key_value<=11;



                      8'b0111_1110:key_value<=12;

                      8'b0111_1101:key_value<=13;

                      8'b0111_1011:key_value<=14;

                      8'b0111_0111:key_value<=15;

                     endcase

              end

   end

 endmodule
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值