一、原理:
由于LED静态显示需要占用较多的I/O口, 且功耗较大, 因此在大多数场合通 常不采用静态显示, 而采用动态扫描的方法来控制LED数码管的显示。 动态 显示的特点是将所有位数码管的段选线并联在一起, 由位选线控制是哪一位 数码管有效。 点亮数码管采用动态扫描显示。 所谓动态扫描显示即轮流向各 位数码管送出字形码和相应的位选, 只要扫描显示速度够快, 利用发光管的 余辉和人眼视觉暂留作用, 使人的感觉好像各位数码管同时都在显示。 动态 显示的亮度比静态显示要差一些, 所以在选择限流电阻时应略小于静态显示 电路中的。 动态扫描显示时刷新频率最好大于50HZ,即没显示一轮的时间不 超过20ms, 每个数码管显示时间不能太长也不能太短, 时间太长会影响刷新 率, 导致总体显示呈现闪烁的现象, 时间太短发光二极管的电流导通时间也 就短, 会影响总体的显示亮度。 一般控制在1ms左右最佳
二、封装:
程序:
/********************************Copyright************************************** **----------------------------File information-------------------------- ** File name :shumaguan.v ** CreateDate :2015.05 ** Funtions : 数码管的封装,势能信号置位才会显示,否则不显示,八个输入数据分别对应8个数码管显示的数据, ** Operate on :EP2C8T114C8 ** Copyright :All rights reserved. ** Version :V1.0 **---------------------------Modify the file information---------------- ** Modified by : ** Modified data : ** Modify Content: *******************************************************************************/ module shumaguan( clk, rst_n, dis_en, data_1, data_2, data_3, data_4, data_5, data_6, data_7, data_8, seg_out, bit_out ); input clk; //50Mhz input rst_n; input dis_en; //数码管显示使能信号,为1的时候才会显示。 input [3:0] data_1; input [3:0] data_2; input [3:0] data_3; input [3:0] data_4; input [3:0] data_5; input [3:0] data_6; input [3:0] data_7; input [3:0] data_8; output [7:0] seg_out; output [7:0] bit_out; reg [7:0] seg_out; reg [7:0] bit_out; //******************************************************* reg [25:0] cnt; wire clk_500hz; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin cnt <= 'd0; end else if(!dis_en) cnt <= 'd0; else begin if(cnt == 26'd99999) begin cnt <= 'd0; end else cnt <= cnt + 1'b1; end end assign clk_500hz = (cnt == 26'd99999)?1'b1:1'b0; reg [2:0] state; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin bit_out <= 8'b1111_1111; end else if(!dis_en) bit_out <= 8'b1111_1111; else begin if(clk_500hz) begin state<= state + 3'd1; case(state) 3'b000: begin bit_out <= 8'b1111_1110; end 3'b001: begin bit_out <= 8'b1111_1101; end 3'b010: begin bit_out <= 8'b1111_1011; end 3'b011: begin bit_out <= 8'b1111_0111; end 3'b100: begin bit_out <= 8'b1110_1111; end 3'b101: begin bit_out <= 8'b1101_1111; end 3'b110: begin bit_out <= 8'b1011_1111; end 3'b111: begin bit_out <= 8'b0111_1111; end default: begin bit_out <= 8'b1111_1111; end endcase end end end reg [3:0] data_reg; always@(*) begin case(bit_out) 8'b1111_1110: data_reg = data_1; 8'b1111_1101: data_reg = data_2; 8'b1111_1011: data_reg = data_3; 8'b1111_0111: data_reg = data_4; 8'b1110_1111: data_reg = data_5; 8'b1101_1111: data_reg = data_6; 8'b1011_1111: data_reg = data_7; 8'b0111_1111: data_reg = data_8; default: data_reg = 4'h0; endcase end always @(* ) begin case(data_reg) 4'h0 : seg_out = 8'hc0;// "0" 4'h1 : seg_out = 8'hf9;// "1" 4'h2 : seg_out = 8'ha4;// "2" 4'h3 : seg_out = 8'hb0;// "3" 4'h4 : seg_out = 8'h99;// "4" 4'h5 : seg_out = 8'h92;// "5" 4'h6 : seg_out = 8'h82;// "6" 4'h7 : seg_out = 8'hf8;// "7" 4'h8 : seg_out = 8'h80;// "8" 4'h9 : seg_out = 8'h90;// "9" 4'ha : seg_out = 8'h88;// "a" 4'hb : seg_out = 8'h83;// "b" 4'hc : seg_out = 8'hc6;// "c" 4'hd : seg_out = 8'ha1;// "d" 4'he : seg_out = 8'h86;// "e" 4'hf : seg_out = 8'h8e;// "f" default : seg_out = 8'h00; // "消隐" endcase end endmodule
仿真验证:
略
仿真效果图:
略