按鍵是常用的一種控制器件。生活中我們可以見到各種形式的按鍵,由於其結構簡單,成本低廉等特點,在家電、數碼產品、玩具等方面有廣泛的應用。
本實驗我們將介紹如何使用按鍵控制多個LED的亮滅。
1. 按鍵簡介
按鍵開關是一種電子開關,屬於電子元器件類。
我們的開發板上有兩種按鍵開關:
第一種是本實驗所使用的輕觸式按鍵開關(如下圖1),簡稱輕觸開關。
使用時以向開關的操作方向施加壓力使內部電路閉合接通,當撤銷壓力時開關斷開,其內部結構是靠金屬彈片受力后發生形變來實現通斷的;
第二種是自鎖按鍵(如下圖2),自鎖按鍵第一次按下后保持接通,即自鎖,第二次按下后,開關斷開,同時開關按鈕彈出來。
開發板上的電源鍵就是第一種開關。
圖1 輕觸式按鍵
圖2 自鎖式按鍵
2. 實驗任務
使用開發板上的四個按鍵控制四個LED燈。不同按鍵按下時,四個LED燈顯示不同效果。(由於按鍵1被復位鍵占用,故本實驗中使用按鍵2、按鍵3、按鍵4控制LED燈顯示四種狀態)
當按下按鍵2時,4個LED燈顯示從右向左流水燈效果。
當按下按鍵3時,4個LED燈顯示從左向右流水燈效果。
當按下按鍵4時,4個LED燈閃爍
3. 硬件設計
本實驗中,系統時鍾、復位按鍵、按鍵和LED燈的管腳如下表所示。
按鍵控制LED管腳分配圖
4. 程序設計
系統框圖
運行代碼:
/*********************************************************************** Filename : key_led.v Author : Company : Mail : Device : Altera Enviroment : Win10,Quartus16.1,modelsim 10.4 Created date : Version : V1.0 Description : Sim : Modified by : Modified date: Version : Description : ************************************************************************/ module key_led ( input i_sys_clk,/* 系統時鍾信號50MHz */ input i_sys_rst_n,/* 系統復位信號,低有效 */ input [2:0] i_key,/* 按鍵輸入信號 */ output [3:0] o_led/* LED輸出信號 */ ); /* 定義0.2s計數寄存器 */ parameter p_0_2s_counter = 10_000_000; reg [23:0] r_0_2s_counter = 24'd0; always @ (posedge i_sys_clk or negedge i_sys_rst_n) begin if (~i_sys_rst_n) r_0_2s_counter <= 24'd0; else if (r_0_2s_counter == (p_0_2s_counter - 1'b1)) r_0_2s_counter <= 24'd0; else r_0_2s_counter <= r_0_2s_counter + 1'b1; end /* 定義LED狀態轉換寄存器 */ reg [1:0] r_led_state_switch = 2'd0; always @ (posedge i_sys_clk or negedge i_sys_rst_n) begin if (~i_sys_rst_n) r_led_state_switch <= 2'b00; else if (r_0_2s_counter == (p_0_2s_counter - 1'b1)) r_led_state_switch <= r_led_state_switch + 1'b1; else r_led_state_switch <= r_led_state_switch; end /* 識別按鍵,切換顯示模式 */ reg [3:0] r_led; always @ (posedge i_sys_clk or negedge i_sys_rst_n) begin if (~i_sys_rst_n) r_led <= 4'b0000; /* 按鍵2按下時,從右向左流水燈效果 */ else if (i_key[0] == 1'b0) case (r_led_state_switch) 2'b00 : r_led <= 4'b1000; 2'b01 : r_led <= 4'b0100; 2'b10 : r_led <= 4'b0010; 2'b11 : r_led <= 4'b0001; default : r_led <= 4'b0000; endcase /* 按鍵3按下時,從左向右流水燈效果 */ else if (i_key[1] == 1'b0) case (r_led_state_switch) 2'b00 : r_led <= 4'b0001; 2'b01 : r_led <= 4'b0010; 2'b10 : r_led <= 4'b0100; 2'b11 : r_led <= 4'b1000; default : r_led <= 4'b0000; endcase /* 按鍵4按下時,LED閃爍 */ else if (i_key[2] == 1'b0) case (r_led_state_switch) 2'b00 : r_led <= 4'b1111; 2'b01 : r_led <= 4'b0000; 2'b10 : r_led <= 4'b1111; 2'b11 : r_led <= 4'b0000; default : r_led <= 4'b0000; endcase /* 無按鍵按下時,LED熄滅 */ else r_led <= 4'b0000; end assign o_led = r_led; endmodule