數碼管動(dòng)態(tài)掃描 led數碼管(LED Segment Displays)是由多個(gè)發(fā)光二極管封裝在一起組成“8”字型的器件,引線(xiàn)已在內部連接完成,只引出它們的各個(gè)筆劃,公共電極。led數碼管常用段數一般為7段,如上圖中的abcdefg,有的還會(huì )有一個(gè)小數點(diǎn),如圖中的h。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png 數碼管要正常顯示,就要用驅動(dòng)電路來(lái)驅動(dòng)數碼管的各個(gè)段碼,從而顯示出我們要的數字。按發(fā)光二極管單元連接方式可分為共陽(yáng)極數碼管和共陰極數碼管。共陽(yáng)數碼管是指將所有發(fā)光二極管的陽(yáng)極接到一起形成公共陽(yáng)極(COM)的數碼管,共陽(yáng)數碼管在應用時(shí)應將公共極COM接到+5V,當某一字段發(fā)光二極管的陰極為低電平時(shí),相應字段就點(diǎn)亮,當某一字段的陰極為高電平時(shí),相應字段就不亮。共陰數碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數碼管,共陰數碼管在應用時(shí)應將公共極COM接到地線(xiàn)GND上,當某一字段發(fā)光二極管的陽(yáng)極為高電平時(shí),相應字段就點(diǎn)亮,當某一字段的陽(yáng)極為低電平時(shí),相應字段就不亮。 下表列出了要顯示的數字,以及對應的abcdefg的值。
例如,共陽(yáng)數碼管中,abcdefg的值分別是1001111時(shí),也就是b和c字段亮,其他字段不亮,這時(shí)就顯示了數字“1”。 如果要顯示多個(gè)數碼管,根據數碼管的驅動(dòng)方式的不同,可以分為靜態(tài)式和動(dòng)態(tài)式兩類(lèi)。 靜態(tài)驅動(dòng)也稱(chēng)直流驅動(dòng)。靜態(tài)驅動(dòng)是指每個(gè)數碼管的每一個(gè)段碼都由一個(gè)單片機的I/O端口進(jìn)行驅動(dòng),或者使用如BCD碼二-十進(jìn)制譯碼器譯碼進(jìn)行驅動(dòng)。靜態(tài)驅動(dòng)的優(yōu)點(diǎn)是編程簡(jiǎn)單,顯示亮度高,缺點(diǎn)是占用I/O端口多,如驅動(dòng)5個(gè)數碼管靜態(tài)顯示則需要5×8=40根I/O端口來(lái)驅動(dòng),要知道一個(gè)89S51單片機可用的I/O端口才32個(gè),實(shí)際應用時(shí)必須增加譯碼驅動(dòng)器進(jìn)行驅動(dòng),增加了硬件電路的復雜性。 數碼管動(dòng)態(tài)顯示接口是應用最為廣泛的一種顯示方式之一,動(dòng)態(tài)驅動(dòng)是將所有數碼管的8個(gè)顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個(gè)數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線(xiàn)控制,當要輸出字形碼時(shí),所有數碼管都接收到相同的字形碼,但究竟是哪個(gè)數碼管會(huì )顯示出字形,取決于單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開(kāi),該位就顯示出字形,沒(méi)有選通的數碼管就不會(huì )亮。通過(guò)分時(shí)輪流控制各個(gè)數碼管的的COM端,就使各個(gè)數碼管輪流受控顯示,這就是動(dòng)態(tài)驅動(dòng)。在輪流顯示過(guò)程中,每位數碼管的點(diǎn)亮時(shí)間為1~2ms,由于人的視覺(jué)暫留現象及發(fā)光二極管的余輝效應,盡管實(shí)際上各位數碼管并非同時(shí)點(diǎn)亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會(huì )有閃爍感,動(dòng)態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節省大量的I/O端口,而且功耗更低。 明德?lián)P開(kāi)發(fā)板上一共有2組4位的共陽(yáng)數碼管,也就是說(shuō)一共有8個(gè)共陽(yáng)數碼管。數碼管的配置電路如下。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 圖中的SEG_A,SEG_B~SEG_DP,是段選信號,這些信號都是8個(gè)數碼管共用的。 DIG1~DIG8是位選信號,分別對應8個(gè)數碼管。對應的位選信號為0,就表示將段選信號的值賦給該數碼管。例如DIG3為0,表示將段選信號SEG_A~SEG_DP的值賦給數碼管3。 SEG_A~SEG_DP,DIG1~DIG8,都是連接到電阻,如下圖。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 由此可見(jiàn),SEG_A~SEG_DP是由SEG0~SEG7產(chǎn)生的,DIG1~DIG8是由DIG_EN1~DIG_EN8產(chǎn)生的。 而SEG0~SEG7和DIG_EN1~DIG_EN8直接連到FPGA的IO上。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image007.png 這些信號與FPGA管腳的對應關(guān)系如下表。
也就是說(shuō),FPGA通過(guò)控制上面中的管腳,就控制了數碼管的顯示。 開(kāi)發(fā)板或者模塊是有 8 位數碼管,本次設計需要使用 8 個(gè)數碼管,實(shí)現數碼管顯示功能,具體要求如下: 復位后,數碼管 0 顯示數字 0;1 秒后,輪到數碼管 1 顯示數字 1;1 秒后,輪到數碼管 2 顯示數字 2;以此類(lèi)推,每隔 1 秒變化,最后是數碼管 7 顯示數字 7。然后再次循環(huán)。 上板效果圖如下圖所示。 上板的演示效果,請登陸網(wǎng)址查看:www.mdy-edu.com/xxxx。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image017.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image021.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image023.jpg 三、模塊設計我們要實(shí)現的功能,概括起來(lái)就是控制8個(gè)數碼管,讓數碼管顯示不同的數字。要控制8個(gè)數碼管,就需要控制位選信號,即FPGA要輸出一個(gè)8位的位選信號,設為seg_sel,其中seg_sel[0]對應數碼管0,seg_sel[1]對應數碼管1,以此類(lèi)推,seg_sel[7]對應數碼管7。 要顯示不同的數字,就需要控制段選信號,不需要用到DP,一共有7根線(xiàn),即FPGA要輸出一個(gè)7位的段選信號,設為seg_ment,seg_ment[6]~segm_ment[0]分別對應數碼管的abcdefg(注意對應順序)。 我們還需要時(shí)鐘信號和復位信號來(lái)進(jìn)行工程控制。 綜上所述,我們這個(gè)工程需要4個(gè)信號,時(shí)鐘clk,復位rst_n,輸出的位選信號seg_sel和輸出的段選信號seg_ment。其中,seg_sel和seg_ment的對應關(guān)系下如下:
我們先分析要實(shí)現的功能,數碼管0顯示數字0,翻譯成信號就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0001。數碼管1顯示數字1,也就是說(shuō)seg_sel的值為8’b1111_1101,seg_ment的值為7’b100_1111。以此類(lèi)推,數碼管7顯示數字7,就是seg_sel的值為8’b0111_1111,seg_ment的值為7’b000_1111。 再留意下,以上都是每隔1秒進(jìn)行變化,并且是8個(gè)數碼管輪流顯示,那么波形示意圖如下圖所示。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image025.png 上圖就是seg_sel和seg_seg信號的變化波形圖。在顯示第1個(gè)時(shí),seg_sel=8’hfe,seg_ment=7’h01并持續1秒;在第1個(gè)時(shí),seg_sel=8’hfd,seg_ment=7’h4f并持續1秒;以此類(lèi)推,第8個(gè)時(shí),seg_sel=8’h7f,seg_ment=7’h0f并持續1秒。然后又再次重復。 由波形圖可知,我們需要1個(gè)計數器用來(lái)計算1秒的時(shí)間。本工程的工作時(shí)鐘是50MHz,即周期為20ns,計數器計數到1_000_000_000/20=50_000_000個(gè),我們就能知道1秒時(shí)間到了。另外,由于該計數器是不停地計數,永遠不停止的,可以認為加1條件一直有效,可寫(xiě)成:assignadd_cnt==1。綜上所述,該計數器的代碼如下。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image027.jpg 再次觀(guān)察波形圖,我們發(fā)現有第1個(gè),第2個(gè)直到第8個(gè),說(shuō)明這還需要另外一個(gè)計數器來(lái)表示第幾個(gè)。該計數器表示第幾個(gè),自然是完成1秒就加1,因為加1條件可為end_cnt0。該計數器一共要數8次。所以代碼為: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image029.jpg 有了兩個(gè)計數器,我們來(lái)思考輸出信號seg_sel的變化。概括起來(lái),在第1次的時(shí)候輸出值為8’hfe;在第2次的時(shí)候輸出值為8’hfd;以此類(lèi)推,在第8次的時(shí)候輸出值為8’h7f。我們用信號cnt1來(lái)代替第幾次,也就是:當cnt1==0的時(shí)候,輸出值為8’hfe;在cnt1==1的時(shí)候輸出值為8’hfd;以此類(lèi)推,在cnt1==7的時(shí)候輸出值為8’h7f。再進(jìn)一步翻譯成代碼,就變成如下: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image030.png 讀者有沒(méi)有發(fā)現,上面代碼基本上和文字描述是一模一樣的,這進(jìn)一步展現了verilog是“硬件描述語(yǔ)言”。上面的代碼是能正確實(shí)現seg_sel功能的,從實(shí)現角度和資源角度來(lái)說(shuō),都挺好。但代碼進(jìn)一步概括,可以化簡(jiǎn)如下: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image031.png 對上面代碼解釋一下,第131行是指先將8’b1向左移位,再取反后的值,賦給seg_sel。假設此時(shí)cnt1等于0,那么8’b1<<0的結果是8’b0000_0001,取反的值為8’hfe;假設cnt1等于3,那么8’b1<<3的結果為8’b000_1000,取反后的結果為8’b1111_0111,即8’hf7。與第一種寫(xiě)法的結果都是相同的。 我們來(lái)思考輸出信號seg_ment的變化。概括起來(lái),在第1次的時(shí)候輸出值為7’h01;在第2次的時(shí)候輸出值為7’h4f;以此類(lèi)推,在第8次的時(shí)候輸出值為7’h0f。我們用信號cnt1來(lái)代替第幾次,也就是:當cnt1==0的時(shí)候,輸出值為7’h01;在cnt1==1的時(shí)候輸出值為7’h4f;以此類(lèi)推,在cnt1==7的時(shí)候輸出值為7’h0f。再進(jìn)一步翻譯成代碼,就變成如下: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image032.png 上面的代碼正確地實(shí)現了seg_ment的功能,對于本工程說(shuō)已經(jīng)完美。但我們分析一下,就知道上面代碼實(shí)現了類(lèi)似譯碼的功能,將數字設成數碼管顯示的值,代碼里只對0~7進(jìn)行譯碼。很自然的,我先做一個(gè)通用的譯碼模塊,將0~9都進(jìn)行譯碼,以后就方便調用了。例如改成下面代碼。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image033.png 然后我們只要控制好data就能實(shí)現想要在數碼管顯示的數字,如下面代碼。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image034.png 當cnt1=0,則數碼管會(huì )顯示0。當cnt1=1,則數碼管會(huì )顯示1。 在代碼的最后一行寫(xiě)下endmodule file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image035.png 至此,主體程序已經(jīng)完成。接下來(lái)是將module補充完整。 將module的名稱(chēng)定義為my_seg。并且我們已經(jīng)知道該模塊有4個(gè)信號:clk、rst_n、seg_sel和seg_ment,代碼如下: |
1.4 MB, 下載積分: 積分 -1