關於按鍵消抖以及LED燈控制的乙個例項

2021-09-25 21:17:13 字數 3366 閱讀 9712

要求:1.未按建則所有led全黑;

2.按k1按鈕,則用前8個led燈二進位制顯示25;

3.按k2按鈕,則12只led合併顯示流水燈效果,3個led點亮並向右流水。

注:是hr-240b fpga 創新實驗系統,其核心板的核心晶元為 epm240t100c5n 。

分析:led是共陰極,所以點亮led需要高電平;

有兩個按鍵k1和k2,所以需要按鍵消抖;

按下k1,用前8個led顯示二進位制25,也就是00011001;

按下k2,用12個led燈,3個led燈點亮,向右流水,也就是迴圈右移。

系統時鐘是50mhz,

整個程式,除了按鍵消抖有點需要思考,其他還是很簡單實現的。

系統時鐘50mhz,也就是週期為20ns,按鍵抖動時間一般為15ms,如下圖(按鍵未按下時為高電平,按下後為低電平):

但是,在按鍵按下或者釋放的時候都會出現乙個不穩定的抖動時間,如果不處理好這個抖動時間,我們就無法正確採集到正確有效的按鍵值,所以我們的設計中必須有效消除按鍵抖動。

消除按鍵抖動的原理是檢測到按鍵值變化後,不能立即取樣,而是需要計數15ms之後取樣按鍵值。

根據上述分析,給出verilog設計**:

單個按鍵消抖模組:

module one_key (

input clk, // clock

input rst_n, // asynchronous reset active low

input key_in1,

output reg key_out1 );

reg [19 : 0] count;

reg key_in1_r;

reg key_in1_rr;

//對按鍵值進行兩拍寄存,為了後面檢測按鍵變化

always @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

key_in1_r <= 1;

key_in1_rr <= 1;

end

else begin

key_in1_r <= key_in1 ;

key_in1_rr <= key_in1_r;

endend

wire edge_l, edge_h;

assign edge_h = ~key_in1_rr & key_in1_r; //上公升沿檢測

assign edge_l = ~key_in1_r & key_in1_rr; //下降沿檢測

//按鍵值變化後,edge_en有效

wire edge_en;

assign edge_en = edge_l | edge_h;

reg [19 : 0] cnt;

always @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

cnt <= 0;

end

else if(edge_en) begin

cnt <= 0;

endelse begin

cnt <= cnt + 1;

endend

always @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

key_out1 <= 1;

end

else if(cnt == 20'd7000_000) begin

key_out1 <= key_in1;

endelse ;

end

endmodule

在下面模組中例化按鍵消抖模組:

module key_ctrl_led (

input clk, // clock

input rst_n, // asynchronous reset active low

input [1 : 0] key_in, //key_in[0] represents k1, key_in[1] represents k2;

output [11 : 0] led //led[0] represents first led,... );

wire [1 : 0] key_out;

one_key inst_one_key1 (.clk(clk), .rst_n(rst_n), .key_in1(key_in[0]), .key_out1(key_out[0]));

one_key inst_one_key2 (.clk(clk), .rst_n(rst_n), .key_in1(key_in[1]), .key_out1(key_out[1]));

reg [1 : 0] mode;

reg [11 : 0] led_reg;

always @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

mode <= 0;

end

else if(~key_out[0]) begin

mode <= 2'b01;

endelse if(~key_out[1]) begin

mode <= 2'b10;

led_reg <= 12'b1110_0000_0000;

endelse ;

endalways @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

led_reg <= 0;

end

else if(mode == 2'b01) begin

led_reg <= 12'b0000_10011000; //(前8個燈顯示25,也即00011001,led燈的約束按照大對大,小對小)

endelse if(mode == 2'b10) begin

led_reg <= ;

endend

assign led = led_reg;

endmodule

思路是這樣子的,很簡單,但是由於時間原因還未上板子驗證,請自行驗證。

引腳約束按照高對高,低對低約束。

注意,這裡的復位採用的是低電平復位,如果你的板子是高電平復位,需要稍微修改下**。

藍橋杯 獨立按鍵控制LED燈及消抖

按鍵在閉合或斷開時,觸點會有抖動現象,大部分是通過軟體處理,也可用硬體處理。include unsigned char num 0 unsigned char flag 0 標記值 bit s7 0,s6 0,s5 0,s4 0 bit 的取值範圍為1 10 void delayms int ms ...

中斷 按鍵控制LED燈

xjp的資源 初始化函式 init.c 進行一些初始化 include s3c24xx.h led1,led2,led4對應gpf4 gpf5 gpf6 define gpf4 out 1 define gpf5 out 1 define gpf6 out 1 define gpf4 msk 3 d...

Mixly按鍵控制LED燈

include include rfid rfid 10,5 unsigned char rc size unsigned char blockaddr 選擇操作的塊位址0 63 unsigned char i,tmp unsigned char status unsigned char str m...