51單片機(jī)學(xué)習(xí)記錄——數(shù)碼管動(dòng)態(tài)顯示
但使用數(shù)碼管輸出時(shí),如果不添加延時(shí)語句,那么一直有顯示混亂的現(xiàn)象,有時(shí)完全無法分辨清楚數(shù)字。
本文引用地址:http://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)過兩天的研究,終于明白了期中的貓膩?,F(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)論