天天看點

鍵盤顯示電路 Verilog 代碼

module jp(clk100khz,din,scan,dout);
input clk100khz;//數位管掃描參數,為100khz
input [3:0] din;//按鍵輸入
output reg [7:0] dout;//七段數位管值
output reg [5:0] scan;//數位管位碼
reg[3:0] cnt,s;//數位管掃描參數
reg [7:0]temp,led1,led2,led3,led4,led5,led6;
reg flag,clk1;//flag有鍵按下的标志,clk1分頻參數
reg[25:0] count;//分頻參數
always @ (posedge clk100khz)//分頻子產品。Clk1=3.3hz
begin
if(count=='d15000)
begin clk1=~clk1;count<=0;end
else 
begin count<=count+1'b1;end
end

always @ (posedge clk1)//接收按鍵的值并譯碼,将數位管的值左移
begin
if(din[3:0]<4'b1111) begin flag<=0;
case (din[3:0])
4'b1110:begin temp[7:0]<=8'b00000110;end//1
4'b1101:begin temp[7:0]<=8'b01011011;end//2
4'b1011:begin temp[7:0]<=8'b01001111;end//3.
4'b0111:begin temp[7:0]<=8'b01100110;end//4
4'b1100:begin temp[7:0]<=8'b01101101;end//5
4'b1010:begin temp[7:0]<=8'b01111101;end//6
4'b0110:begin temp[7:0]<=8'b00000111;end//7
4'b1001:begin temp[7:0]<=8'b11111111;end//8
default: begin temp[7:0]<=8'b000000000;end
endcase

end


if(flag==0&led6==6'b000) begin flag<=1;
led6<=led5;led5<=led4;led4<=led3;led3<=led2;led2<=led1;led1<=temp;//滾動
end
else if(din[3:0]==4'b1111) begin flag<=1;end
end

always @ (posedge clk100khz)//數位管顯示及重新整理
begin 
if(cnt==3'b101)
begin cnt<=0;end
else
begin cnt<=cnt+1;end
end


always @(cnt)
begin
case(cnt)
3'b000:begin scan<=6'b000001;dout[7:0]<=led1;end
3'b001:begin scan<=6'b010;dout[7:0]<=led2;end
3'b010:begin scan<=6'b0100;dout[7:0]<=led3;end
3'b011:begin scan<=6'b01000;dout[7:0]<=led4;end
3'b100:begin scan<=6'b010000;dout[7:0]<=led5;end
3'b101:begin scan<=6'b100000;dout[7:0]<=led6;end
default:begin scan<=6'b000;end
endcase
end
endmodule
           

代碼分析:在原來例子代碼基礎上修改一句flag==0&led6==6'b000,就是當led6為0時輸入才有效。

繼續閱讀