新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)學(xué)習(xí)記錄——數(shù)碼管動(dòng)態(tài)顯示

51單片機(jī)學(xué)習(xí)記錄——數(shù)碼管動(dòng)態(tài)顯示

作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
正在學(xué)習(xí)51的數(shù)碼管以及中斷,打算利用六位數(shù)碼管實(shí)現(xiàn)一個(gè)時(shí)鐘的功能。

但使用數(shù)碼管輸出時(shí),如果不添加延時(shí)語句,那么一直有顯示混亂的現(xiàn)象,有時(shí)完全無法分辨清楚數(shù)字。

本文引用地址:http://m.butianyuan.cn/article/201611/318260.htm

如果在傳送完數(shù)據(jù)以后延時(shí)1ms,顯示混亂情況會(huì)好轉(zhuǎn)。

同時(shí)發(fā)現(xiàn)延時(shí)的時(shí)間越長(zhǎng),顯示效果越好。但是當(dāng)然,相應(yīng)的顯示穩(wěn)定程度也會(huì)下降,即數(shù)碼管閃爍。

程序中在送完段選數(shù)據(jù)以后已經(jīng)使用了參考書中的“消影”語句:

1 dula=1;2 P0=table[k];3 dula=0;4 P0=0xff;//“消影”

可是這個(gè)語句只是在有延時(shí)的情況下才有效果,如果我不寫延時(shí)語句,那么顯示依舊混亂。

雖然在顯示過程延時(shí)不會(huì)影響中斷的計(jì)時(shí),但是我總不想依賴for語句寫出來的延時(shí)。= =

于是自己就嘗試了很多方法,想要解決這個(gè)問題,我的目標(biāo)就是不寫延時(shí)語句讓數(shù)碼管正常顯示。

我有試過先向P0傳送數(shù)據(jù),然后打開鎖存器,馬上關(guān)閉。

如:

1 P0=table[k];2 dula=1;3 dula=0;

但是問題依舊

也嘗試過在打開任一鎖存器之前,再鎖一次另一鎖存器(即送一次低電平),仍然無效。

最后發(fā)現(xiàn)需要在輸出數(shù)據(jù)之前加這么一段代碼:

1         P0=0xff;2         wela=1;3         wela=0;4         P0=0x00;5         dula=1;6         dula=0;//初始化消除干擾

加了這段代碼,數(shù)碼管顯示不再混亂。語句的功能就類似于初始化一下鎖存器的內(nèi)容。

經(jīng)過兩天的研究,終于明白了期中的貓膩。現(xiàn)在發(fā)出來跟大家分享一下:(轉(zhuǎn)載請(qǐng)說明出處)

數(shù)碼管之所以有“影”,根本原因是段選,位選數(shù)據(jù)無法同時(shí)送達(dá)。

具體解釋一下:當(dāng)我改變了位選的值后(改變了要顯示的數(shù)碼管),接下來才改變段選的值(改變要顯示的數(shù)字)。而在這中間有微小的時(shí)間間隔,位選的值改變了,但是段選的值沒變。也就是說,我改變了要顯示的數(shù)碼管,但是這個(gè)數(shù)碼管顯示的是上一個(gè)數(shù)碼管的數(shù)字!想到這里,我有如醍醐灌頂,豁然開朗!當(dāng)然,反之亦然,如果你是先段選再位選,同樣有問題。請(qǐng)大家自己考慮。

所以不難解釋上面那段代碼的作用了,就是在輸出之前將之前那個(gè)數(shù)碼管顯示空(或者不選擇任何數(shù)碼管)。

所以顯然這個(gè)初始化代碼還可以簡(jiǎn)化,但是要取決于你是先段選還是先位選。如果先位選,那么就要清空段選數(shù)據(jù)。

1 P0=0x00;2 dula=1;3 dula=0;

反過來也一樣。如果先段選,那么清空位選數(shù)據(jù)即可。

百度百科有人問了一個(gè)差不多的問題,這里引用過來供大家參考:

經(jīng)驗(yàn)總結(jié):數(shù)碼管的顯示,段選數(shù)據(jù)和位選數(shù)據(jù)要緊貼,中間不要夾雜其他語句。換句話說,計(jì)算在先,最后一次性傳送數(shù)據(jù)。



評(píng)論


技術(shù)專區(qū)

關(guān)閉