数码管的动态扫面---

 一、原理:

      由于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  
 

仿真验证:

    略

仿真效果图:

 略

原文地址:https://www.cnblogs.com/fhyfhy/p/4550408.html