51單片機學(xué)習記錄——數碼管動(dòng)態(tài)顯示
但使用數碼管輸出時(shí),如果不添加延時(shí)語(yǔ)句,那么一直有顯示混亂的現象,有時(shí)完全無(wú)法分辨清楚數字。
本文引用地址:http://dyxdggzs.com/article/201611/318260.htm如果在傳送完數據以后延時(shí)1ms,顯示混亂情況會(huì )好轉。
同時(shí)發(fā)現延時(shí)的時(shí)間越長(cháng),顯示效果越好。但是當然,相應的顯示穩定程度也會(huì )下降,即數碼管閃爍。
程序中在送完段選數據以后已經(jīng)使用了參考書(shū)中的“消影”語(yǔ)句:
1 dula=1;2 P0=table[k];3 dula=0;4 P0=0xff;//“消影”
可是這個(gè)語(yǔ)句只是在有延時(shí)的情況下才有效果,如果我不寫(xiě)延時(shí)語(yǔ)句,那么顯示依舊混亂。
雖然在顯示過(guò)程延時(shí)不會(huì )影響中斷的計時(shí),但是我總不想依賴(lài)for語(yǔ)句寫(xiě)出來(lái)的延時(shí)。= =
于是自己就嘗試了很多方法,想要解決這個(gè)問(wèn)題,我的目標就是不寫(xiě)延時(shí)語(yǔ)句讓數碼管正常顯示。
我有試過(guò)先向P0傳送數據,然后打開(kāi)鎖存器,馬上關(guān)閉。
如:
1 P0=table[k];2 dula=1;3 dula=0;
但是問(wèn)題依舊
也嘗試過(guò)在打開(kāi)任一鎖存器之前,再鎖一次另一鎖存器(即送一次低電平),仍然無(wú)效。
最后發(fā)現需要在輸出數據之前加這么一段代碼:
1 P0=0xff;2 wela=1;3 wela=0;4 P0=0x00;5 dula=1;6 dula=0;//初始化消除干擾
加了這段代碼,數碼管顯示不再混亂。語(yǔ)句的功能就類(lèi)似于初始化一下鎖存器的內容。
經(jīng)過(guò)兩天的研究,終于明白了期中的貓膩?,F在發(fā)出來(lái)跟大家分享一下:(轉載請說(shuō)明出處)
數碼管之所以有“影”,根本原因是段選,位選數據無(wú)法同時(shí)送達。
具體解釋一下:當我改變了位選的值后(改變了要顯示的數碼管),接下來(lái)才改變段選的值(改變要顯示的數字)。而在這中間有微小的時(shí)間間隔,位選的值改變了,但是段選的值沒(méi)變。也就是說(shuō),我改變了要顯示的數碼管,但是這個(gè)數碼管顯示的是上一個(gè)數碼管的數字!想到這里,我有如醍醐灌頂,豁然開(kāi)朗!當然,反之亦然,如果你是先段選再位選,同樣有問(wèn)題。請大家自己考慮。
所以不難解釋上面那段代碼的作用了,就是在輸出之前將之前那個(gè)數碼管顯示空(或者不選擇任何數碼管)。
所以顯然這個(gè)初始化代碼還可以簡(jiǎn)化,但是要取決于你是先段選還是先位選。如果先位選,那么就要清空段選數據。
1 P0=0x00;2 dula=1;3 dula=0;
反過(guò)來(lái)也一樣。如果先段選,那么清空位選數據即可。
百度百科有人問(wèn)了一個(gè)差不多的問(wèn)題,這里引用過(guò)來(lái)供大家參考:
經(jīng)驗總結:數碼管的顯示,段選數據和位選數據要緊貼,中間不要夾雜其他語(yǔ)句。換句話(huà)說(shuō),計算在先,最后一次性傳送數據。
評論