1. 程式人生 > 其它 >基於FPGA的數碼管驅動設計(靜態顯示)

基於FPGA的數碼管驅動設計(靜態顯示)

1.專案介紹

  學習LED數碼管的工作原理和程式設計方法,掌握LED數碼管的設計應用。

2.設計要求

  利用LED數碼管,在數碼管上顯示0-F字樣。系統框圖如下圖所示。其中,data_in[3:0]為按鍵輸入,seg_n[7:0]為數碼管的段選端,sel_n[7:0]為數碼管的位選端。

3.實驗原理

(1)什麼是數碼管

  數碼管,也稱作輝光管,是一種可以顯示數字和其他資訊的電子裝置。它是由8個發光二極體構成,並按照一定的圖形及排列封轉在一起的顯示器件。因為發光二極體的電流是3mA-10mA,故需新增限流電阻。數碼管引腳如下圖所示

  上圖兩個com引腳實際是連在一起的,其他引腳的公共端,稱為位選,位選的高低電平決定改數碼管能否點亮,其他管腳為段選訊號,決定數碼管上哪個二極體發光。

(2)數碼管基本構造

  數碼管連線方式不同分為共陰極數碼管和共陽極數碼管。共陰極就是7段的顯示字碼共用一個電源的負極,是高電平點亮,共陽極就是7段的顯示字碼共用一個電源的正極,是低電平點亮。只要控制其中各段LED的亮滅即可顯示相應的數字、字母或符號。

  共陰和共陽極數碼管的內部電路,它們的發光原理是一樣的,只是它們的電源極性不同而已,共陰為所有的LED負極接在一起,共陽為為所有的LED正極接在一起。如下圖為1位數碼管的共陰極和共陽極原理圖:

(3)數碼管顯示原理

  要是數碼管顯示數字,有兩個條件:1.是要在公共端加合適的電源(一般每顆LED還需串上合適的電阻,起限流作用);2.要使(a,b,c,d,e,f,g,dp)端接低電平或“0”電平。這樣才能顯示的。

例如下圖的共陽極數碼管,須在公共端接上VCC,(a,b,c,d,e,f,g,dp)端接到控制器的引腳上;如果要使其中一個LED亮時,對應的控制器引腳輸出低電平,即可點亮LED等。

(4)數碼管驅動方式

根據LED數碼管的驅動方式的不同,可以分為靜態式和動態式兩類。

  1)靜態驅動也稱直流驅動,靜態驅動是指每個數碼管的每一個段碼都由一個I/O埠進行驅動。靜態驅動的優點是程式設計簡單,顯示亮度高,缺點是佔用I/O埠多。如驅動5個數碼管靜態顯示則需要5×8=40根I/O口來驅動,要知道一個89S51微控制器可用的I/O口才32個呢。故實際應用時必須增加驅動器進行驅動,增加了硬體電路的複雜性。

  2)動態驅動是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp "的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制。-當微控制器輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是那個數碼管會顯示出字形,取決於微控制器對位元選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制開啟,該位就顯示出字形,沒有選通的數碼管就不會亮。

  通過分時輪流控制各個LED數碼管的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數碼管的點亮時間為1~2ms,由於人的視覺暫留現象及發光二極體的餘輝效應,儘管實際上各位數碼管並非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示資料,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O口,而且功耗更低。

4. 設計實現

  1 module tube_static_v1(
  2     input     wire        [3:0]        data_in,
  3     output     reg        [7:0]        seg_n,
  4     output     wire        [7:0]        sel_n
  5 );
  6     
  7     parameter       NUM0 = 8'b1100_0000,
  8                     NUM1 = 8'b1111_1001,    
  9                     NUM2 = 8'b1010_0100,    
 10                     NUM3 = 8'b1011_0000,    
 11                     NUM4 = 8'b1001_1001,    
 12                     NUM5 = 8'b1001_0010,    
 13                     NUM6 = 8'b1000_0010,    
 14                     NUM7 = 8'b1111_1000,    
 15                     NUM8 = 8'b1000_0000,    
 16                     NUM9 = 8'b1001_0000,
 17                     NUMA = 8'b1000_1000,
 18                     NUMB = 8'b1000_0011,
 19                     NUMC = 8'b1100_0110,
 20                     NUMD = 8'b1010_0001,
 21                     NUME = 8'b1000_0110,
 22                     NUMF = 8'b1000_1110;
 23     
 24     assign sel_n = 8'b0000_0000;
 25     
 26     always@(*)begin
 27         case(data_in)
 28             4'b0000: seg_n = NUM0;
 29             4'b0001: seg_n = NUM1;
 30             4'b0010: seg_n = NUM2;
 31             4'b0011: seg_n = NUM3;
 32             4'b0100: seg_n = NUM4;
 33             4'b0101: seg_n = NUM5;
 34             4'b0110: seg_n = NUM6;
 35             4'b0111: seg_n = NUM7;
 36             4'b1000: seg_n = NUM8;
 37             4'b1001: seg_n = NUM9;
 38             4'b1010: seg_n = NUMA;
 39             4'b1011: seg_n = NUMB;
 40             4'b1100: seg_n = NUMC;
 41             4'b1101: seg_n = NUMD;
 42             4'b1110: seg_n = NUME;
 43             4'b1111: seg_n = NUMF;
 44             default: seg_n = 8'd0;
 45         endcase
 46     end
 47     
 48 
 49 
 50 //共陽型數碼管,數碼管顯示0-f對應的段選輸出訊號
 51 //    parameter     NUM0 = 8'hc0,
 52 //                    NUM1 = 8'hf9,    
 53 //                    NUM2 = 8'ha4,    
 54 //                    NUM3 = 8'hb0,    
 55 //                    NUM4 = 8'h99,    
 56 //                    NUM5 = 8'h92,    
 57 //                    NUM6 = 8'h82,    
 58 //                    NUM7 = 8'hf8,    
 59 //                    NUM8 = 8'h80,    
 60 //                    NUM9 = 8'h90,
 61 //                    NUMA = 8'h88,
 62 //                    NUMB = 8'h83,
 63 //                    NUMC = 8'hc6,
 64 //                    NUMD = 8'ha1,
 65 //                    NUME = 8'h86,
 66 //                    NUMF = 8'h8e;
 67 
 68 //共陰型數碼管,數碼管顯示0-f對應的段選輸出訊號    
 69 //    parameter       NUM0 = 8'b1100_0000,
 70 //                    NUM1 = 8'b1111_1001,    
 71 //                    NUM2 = 8'b1010_0100,    
 72 //                    NUM3 = 8'b1011_0000,    
 73 //                    NUM4 = 8'b1001_1001,    
 74 //                    NUM5 = 8'b1001_0010,    
 75 //                    NUM6 = 8'b1000_0010,    
 76 //                    NUM7 = 8'b1111_1000,    
 77 //                    NUM8 = 8'b1000_0000,    
 78 //                    NUM9 = 8'b1001_0000,
 79 //                    NUMA = 8'b1000_1000,
 80 //                    NUMB = 8'b1000_0011,
 81 //                    NUMC = 8'b1100_0110,
 82 //                    NUMD = 8'b1010_0001,
 83 //                    NUME = 8'b1000_0110,
 84 //                    NUMF = 8'b1000_1110;
 85 
 86 
 87 //共陰型數碼管,數碼管顯示0-f對應的段選輸出訊號        
 88 //parameter          NUM0 = 8'b0011_1111,
 89 //                NUM1 = 8'b0000_0110,    
 90 //                NUM2 = 8'b0101_1011,    
 91 //                NUM3 = 8'b0100_1111,    
 92 //                NUM4 = 8'b0110_0110,    
 93 //                NUM5 = 8'b0110_1101,    
 94 //                NUM6 = 8'b0111_1101,    
 95 //                NUM7 = 8'b0000_0111,    
 96 //                NUM8 = 8'b0111_1111,    
 97 //                NUM9 = 8'b0110_1111,
 98 //                NUMA = 8'b0111_0111,
 99 //                NUMB = 8'b0111_1100,
100 //                NUMC = 8'b0011_1001,
101 //                NUMD = 8'b0101_1110,
102 //                NUME = 8'b0111_1001,
103 //                NUMF = 8'b0111_0001;
104 
105 
106 
107 //共陰型數碼管,數碼管顯示0-f對應的段選輸出訊號    
108 //parameter         NUM0 = 8'h3f,
109 //                NUM1 = 8'h06,    
110 //                NUM2 = 8'h5b,    
111 //                NUM3 = 8'h4f,    
112 //                NUM4 = 8'h66,    
113 //                NUM5 = 8'h6d,    
114 //                NUM6 = 8'h7d,    
115 //                NUM7 = 8'h07,    
116 //                NUM8 = 8'h7f,    
117 //                NUM9 = 8'h6f,
118 //                NUMA = 8'h77,
119 //                NUMB = 8'h7c,
120 //                NUMC = 8'h39,
121 //                NUMD = 8'h5e,
122 //                NUME = 8'h79,
123 //                NUMF = 8'h71;
124 
125 endmodule 

參考資料如下: