zoukankan      html  css  js  c++  java
  • 数码管的动态扫面---

     一、原理:

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

    仿真验证:

        略

    仿真效果图:

     略

  • 相关阅读:
    2016去哪儿编程题:乘坐公交
    lintcode:交错正负数
    lintcode:Ugly Number I
    KMP算法
    适配器模式
    迭代器模式
    命令模式
    外观模式
    工厂方法模式
    代理模式
  • 原文地址:https://www.cnblogs.com/fhyfhy/p/4550408.html
Copyright © 2011-2022 走看看