⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.v

📁 本程序为Verilog扫描键盘成,然后送给51单片机处理的程序.
💻 V
字号:
/*扫描原理:column作为列线为输入线,row作为行线为输出线
            当无键按下时候,所有的列线被置为高电平,当有键按下时候,对应的列线就
            为低电平,即row!=1111,证明有键按下,然后去抖动,然后让行线依次为0
            进行扫描以确定按键的位置。
*/
//module key1(clk1,rst1,column1,scan_key1,key_flag1,row1,beep1);
module key1(clk1,rst1,column1,scan_key1,row1,beep1);
input clk1,rst1;
input[3:0] column1;//列线
output[3:0] row1;
output[3:0] scan_key1;
output beep1;
reg beep1;
reg[3:0] row1;
reg[3:0] scan_key1; //扫描码寄存器
reg[23:0] cnt_scan1;//扫描频率计数
reg[15:0] beep_time;
reg [18:0] delay_time;
//reg[3:0] scan_key1;
//定义键值
parameter KEY_0=4'B0000,KEY_1=4'B0001,KEY_2=4'B0010,KEY_3=4'B0011,
          KEY_4=4'B0100,KEY_5=4'B0101,KEY_6=4'B0110,KEY_7=4'B0111,
          KEY_8=4'B1000,KEY_9=4'B1001,KEY_UP=4'B1010,KEY_DOWN=4'B1011,
          KEY_CLR=4'B1100,KEY_ENTER=4'B1101,KEY_DP=4'B1110,KEY_F=4'B1111;
always@(posedge clk1 or negedge rst1)
begin
    if(!rst1)
       begin 
            cnt_scan1<=0;    //扫描频率计数器清0
            delay_time<=0;   //延时寄存器清0
            beep1<=0;
            row1=4'b1110;
       end
    else
       begin
           if(cnt_scan1==24'h4fffff)     //200MS扫描一次
             begin
                  if(column1!=4'b1111)      //有键按下 
                     begin
                        if(delay_time==19'h7ffff)     //延时14ms,去抖动
                           begin
                               if(column1!=4'b1111)
                                  begin
                                        row1[3:1]<=row1[2:0];
			                            row1[0]<=row1[3];  //4根行线循环送出低电平	
                                        beep1<=1;            //蜂鸣器发声标志为1
                                        cnt_scan1<=0;
                                  end
                               else                     //无键按下
                                  begin                   
                                       row1=4'b1110;     
                                       cnt_scan1<=0;    //扫描频率计数器清0
                                       delay_time<=0;   //延时寄存器清0
                                       beep1<=0;
                                   end
                           end
                        else  delay_time<=delay_time+1;
                     end
                   else  
                        begin                   //无键按下
                              row1=4'b1110;     
                              cnt_scan1<=0;    //扫描频率计数器清0
                              delay_time<=0;   //延时寄存器清0
                              beep1<=0;
                        end
             end
           else  cnt_scan1<=cnt_scan1+1;    //扫描频率计数器自加1
           if (cnt_scan1==24'h0fffff) beep1<=0;  //关闭蜂鸣器  
       end
end

always@(posedge clk1 or negedge rst1)
  begin 
        if(!rst1)begin
             scan_key1<=4'b0000;                       //清键值寄存器
               end
        else  begin                           
              // if(!key_flag1)  
                         case (row1)                //键值译码
                              4'b1110:
                                case (column1)
                                 4'b1110:
                                     scan_key1<=KEY_0;
                                 4'b1101:
                                     scan_key1<=KEY_1;
                                 4'b1011:
                                     scan_key1<=KEY_2;
                                 4'b0111:
                                     scan_key1<=KEY_3;           
					             endcase
					          4'b1101:
                                case (column1)
                                 4'b1110:
                                     scan_key1<=KEY_4;
                                 4'b1101:
                                     scan_key1<=KEY_5;
                                 4'b1011:
                                     scan_key1<=KEY_6;
                                 4'b0111:
                                     scan_key1<=KEY_7;
					             endcase
					          4'b1011:
                                case (column1)
                                 4'b1110:
                                     scan_key1<=KEY_8;
                                 4'b1101:
                                     scan_key1<=KEY_9;
                                 4'b1011:
                                     scan_key1<=KEY_UP;
                                 4'b0111:
                                     scan_key1<=KEY_DOWN;      
					              endcase
					         4'b0111:
                                case (column1)
                                 4'b1110:
                                     scan_key1<=KEY_CLR;
                                 4'b1101:
                                     scan_key1<=KEY_ENTER;
                                 4'b1011:
                                     scan_key1<=KEY_DP;
                                 4'b0111:
                                     scan_key1<=KEY_F;        
					             endcase					
                           /*  default:
                                   begin
                                     key_flag1<=1; 
                                   end          */
                             endcase           
               end
  end

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -