霡霂的个人空间 https://blog.eetop.cn/maimu [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

矩阵式键盘扫描程序

已有 1276 次阅读| 2006-8-19 18:02 |个人分类:备份

天气: 晴朗
心情: 高兴

/*2*2键盘扫描程序*/


module ffd(data_in ,CLK,EN ,key_buf,data_out );

        input [1:0] data_in ; //列定义

        input EN,CLK;
   
        output [1:0] data_out;//行定义
    output [3:0] key_buf ;
    parameter DELAY=1,ROW1=2,ROW2=3,ROW1TEMP=4,ROW2TEMP=5,KEY=6,WAIT=7,DELAY1=8,KEYTEMP=9;//状态定义
        reg [1:0] data_out ;
    reg [3:0] key_buf;
    reg [3:0] key_buf1;//键值寄存器
    reg [4:0] count,count1;
    reg [4:0] STATE;
    reg [4:0] STATE_TEMP;

   
        always @(posedge CLK )   
     if(EN)
     begin  
     case(STATE)
         KEY:
                begin
                data_out <= 2'b00;  //行线全部置0
                STATE=DELAY;
                STATE_TEMP=KEYTEMP;
                end
         KEYTEMP:
                begin
                 if(data_in ==2'b11) //判断是否有按键按下
                   STATE=KEY;
                 else
                   begin
                   STATE=DELAY;     //如果有就延时去抖
                   STATE_TEMP=ROW1TEMP;
                  end
                end

         ROW1TEMP:  begin
                    data_out <= 2'b10;  //第一行扫描
                    STATE=DELAY;
                    STATE_TEMP=ROW1;
                    end

         ROW1:
                begin
                case({data_out ,data_in})  //第一行判断
                   4'b1011: begin          //无键按下
                          key_buf1<=4'b0000;
                          STATE=ROW2TEMP;  //进入第二行扫描
                          end
                   4'b1010: begin
                          key_buf1<=4'b1011;//键值放入key_buf1
                          STATE=WAIT;       //等待弹起
                          end
                   4'b1001: begin
                          key_buf1<=4'b0111;
                          STATE=WAIT;
                          end
                  default: begin
                           key_buf<=4'b0000;
                           STATE=ROW2TEMP;
                           end

                  endcase
             end
          ROW2TEMP:  begin
                     data_out <= 2'b01;  //第二行扫描

                     STATE=DELAY;
                     STATE_TEMP=ROW2;
                     end
         
          ROW2:
                begin
      
                case({data_out ,data_in})
                   4'b0111: begin
                          key_buf1<=4'b0000;//同上
                          STATE=KEY;
                          end

                   4'b0110: begin
                          key_buf1<=4'b1110;
                          STATE=WAIT;
                          end
                   4'b0101: begin
                          key_buf1<=4'b1101;
                          STATE=WAIT;
                          end
                   default: begin
                            key_buf<=4'b0000;
                            STATE=KEY;
                            end

                   endcase
                end

        DELAY:          //去抖延时
              begin
               if(count==1)
                begin
                STATE=STATE_TEMP;  //进入第一行扫描         
                count<=0;
                end
               else
                 count<=count+1;

              end
        WAIT:         //等待弹起
              begin
            
              if(data_in ==2'b11)
                begin
                STATE=DELAY1;
                key_buf<=key_buf1;//把键值存起来
                end
               else
                STATE=WAIT;

              end
      
        DELAY1:      //弹起后的延时
              begin
               if(count1==1)
                begin
                STATE=KEY;   //从新扫描         
                count1<=0;
              end
               else
                 count1<=count1+1;

              end
        
   
       endcase  
  end   
else  //变量初始化
   begin
   STATE=KEY;
   count<=0;
   count1<=0;
   key_buf<=4'b1111;
   data_out<= 2'b11;
   end
endmodule


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 1

    好友
  • 6

    获赞
  • 45

    评论
  • 3123

    访问数
关闭

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

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 05:35 , Processed in 0.018527 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部