• 4*4键盘扫描程序


      键盘扫描程序,用来扫描4*4键盘

    module keybd_scan  (
                                        clock ,
                                        reset ,
                                        ver_sig,   // vertical  signal 
                                        hor_sig  , // horizontal signal 
                                        data_out 
                                        );
        input clock ,reset ;
        input                [3:0]    ver_sig ;
        output     reg         [3:0]    hor_sig ;
        output   reg     [4:0]    data_out ; 
        
        reg   [3:0] cosc_state ; 
        reg             key_on ; 
        //-------------------------------------------------------
        always @ (posedge clock  )
        if(!reset )  
            begin 
                cosc_state  <= 4'd0 ; 
                key_on  <= 1'd0 ;  end 
        else 
            begin 
                    if (!(&ver_sig)) 
                            begin 
                                    cosc_state <=  4'b0000 ;
                                    key_on       <=  1'd1 ;     
                            end 
                    else   if (key_on )
                            case (cosc_state )
                                    4'b0000  :  begin  key_on <= 1'd1 ;     cosc_state <= 4'b0001  ;  end 
                                    4'b0001  :  begin  key_on <= 1'd1 ;     cosc_state <= 4'b0010   ; end 
                                    4'b0010  :  begin  key_on <= 1'd1 ;     cosc_state <= 4'b0100   ; end 
                                    4'b0100  :  begin  key_on <= 1'd1 ;     cosc_state <= 4'b1000   ; end 
                                    default  :   begin   key_on <= 1'd0 ; cosc_state <= 3'd0 ; end 
                            endcase   
                            
                    else 
                            begin 
                                    //key_on       <= 1'd0 ; 
                                    cosc_state <= 3'd0 ; 
                            end 
            end 
    
            reg    scan_state ; 
    // generate  codesan  
    always @(posedge clock )
        if(!reset )
            begin 
                hor_sig       <= 4'd0 ; 
                scan_state  <= 1'd0 ; 
            end 
        else if(key_on)
                case (scan_state)
                        1'b0  :   begin   hor_sig  <=  4'b1110 ;  scan_state  <=  1'b1; end 
                        1'b1  :   begin   hor_sig  <= {hor_sig[0],  hor_sig[3:1]}   ;   scan_state <= 1'b1;  end 
                endcase 
        else  
            begin 
                    scan_state  <=  1'b0 ; 
                    hor_sig       <=   4'b0000;
            end 
        
            
            reg [4:0]  data_out_reg ; 
    //--------------------------------------------------------------------------------------------------------------------------------------        
    always @ (posedge clock)          
    if(!reset )  data_out_reg  <= 5'd0 ;                                                  //------------------------------------------------
    else         case ({hor_sig,  ver_sig})                                       //             |   0        1        2         3       |        
                8'b0111_1110: data_out_reg <= 5'h00;                                    //       |   4         5          6          7       |
                8'b1011_1110: data_out_reg <= 5'h04;                                    //       |   8         9           a          b      | 
                8'b1101_1110: data_out_reg <= 5'h08;                                   //        |   c         d           e          f       |
                8'b1110_1110: data_out_reg <= 5'h0c;                           //        |-------------------------------------------------
                                                                                  //                 +         -           *          /   
                8'b0111_1101: data_out_reg <= 5'h01;
                8'b1011_1101: data_out_reg <= 5'h05;  
                8'b1101_1101: data_out_reg <= 5'h09;
                8'b1110_1101: data_out_reg <= 5'h0d; 
            
                8'b0111_1011: data_out_reg <= 5'h02;
                8'b1011_1011: data_out_reg <= 5'h06; 
                8'b1101_1011: data_out_reg <= 5'h0a;
                8'b1110_1011: data_out_reg <= 5'h0e; 
        
                8'b0111_0111: data_out_reg <= 5'h03;
                8'b1011_0111: data_out_reg <= 5'h07;  
                8'b1101_0111: data_out_reg <= 5'h0b;
                8'b1110_0111: data_out_reg <= 5'h0f;
                default              data_out_reg <= 5'h1f;
            endcase 
    
    always @ (posedge clock)
     if(!reset )  data_out  <= 5'd0 ; 
     else   begin 
        if ((data_out_reg >=5'h0)  && (data_out_reg <= 5'h0f)) 
                data_out     <=   data_out_reg;
        else if (!key_on)   data_out  <= 5'h1f;   end 
        //else if (1)   data_out  <= 5'h07;
    
    endmodule 

      ver_sig 是输入扫描信号,hor_sig 是键盘输出的信号。

  • 相关阅读:
    poj 2757 : 最长上升子序列(JAVA)
    POJ 2760: 数字三角形
    poj 1664:放苹果
    Poj 2756:二叉树
    poj机上的JAVA那些事儿
    浅谈HASH算法与CSDN密码泄漏事件
    如何防范密码被破解
    [转载自百度文库]数组拷贝(System.arraycopy,深度拷贝)--数组
    Java数学计算
    fzu Problem 1396 Large Caclulating Work
  • 原文地址:https://www.cnblogs.com/sepeng/p/3735788.html
Copyright © 2020-2023  润新知