數(shù)碼管動(dòng)態(tài)掃描幾乎是所有單片機(jī)入門書籍必寫的章節(jié)了,程序其實(shí)很簡(jiǎn)單,10句以內(nèi)就可解決(C51)。似乎是太簡(jiǎn)單太基礎(chǔ)了,幾乎所有的例程都沒(méi)不曾提到:在一個(gè)大型的、運(yùn)行時(shí)間較長(zhǎng)的程序里實(shí)現(xiàn)效果如何?
其實(shí)在做那個(gè)溫控器的時(shí)候就已經(jīng)碰到這個(gè)問(wèn)題,那次也是第一次用數(shù)碼管動(dòng)態(tài)掃描技術(shù),以前都是用液晶顯示器的,無(wú)論是段式的還是點(diǎn)陣式的,這個(gè)問(wèn)題就是:數(shù)碼管顯示的時(shí)候各位顯示亮度不完全一樣,總是最高位顯示的亮度最高,其他幾位較暗,但是亮度比較一致,這個(gè)問(wèn)題困擾了我一段時(shí)間,后來(lái)實(shí)際用的時(shí)候把最高位顯示給屏蔽了(確實(shí)也用不到這一位,但是掃描還是要掃到的),所有這個(gè)問(wèn)題算是忽略過(guò)去了。但是此次做調(diào)頻收音機(jī)時(shí)又一次碰到了。程序流程大致如下:共有兩個(gè)模塊用到數(shù)碼管顯示,一個(gè)是顯示調(diào)頻頻率,另一個(gè)是顯示當(dāng)前音量值,由音量控制按鈕來(lái)控制這兩個(gè)模塊的輪流調(diào)用,實(shí)際調(diào)試時(shí)發(fā)現(xiàn):輪到音量顯示的時(shí)候,兩位數(shù)字亮度是均勻的,而當(dāng)由頻率顯示的時(shí)候,最高位數(shù)字亮度最高,其他位要暗一半以上,無(wú)論是在程序中多處安插掃描程序或者改變位掃描間隔都不能改變這一情況。經(jīng)過(guò)兩個(gè)模塊的比較,發(fā)現(xiàn)了這兩段程序的重大不同點(diǎn),頻率顯示模塊實(shí)際是先從tea5767中讀出PLL數(shù)據(jù),然后經(jīng)過(guò)PLL到頻率的運(yùn)算,再經(jīng)過(guò)二進(jìn)制到BCD轉(zhuǎn)換,最后送顯示緩沖,期間用到了大量的乘除、浮點(diǎn)運(yùn)算,眾所周知51單片機(jī)的浮點(diǎn)運(yùn)算能力是很差的,這個(gè)從加載浮點(diǎn)運(yùn)算后程序所占空間大幅度增加就可以看出來(lái),也就是說(shuō),此處的頻率運(yùn)算時(shí)間是很長(zhǎng)的,而音量顯示模塊只是從ram中取了1字節(jié)做了一下二進(jìn)制到BCD的轉(zhuǎn)換,顯然速度要快的多。說(shuō)到這里,其實(shí)就很明白了,最高位顯示更亮的原因就是由掃描程序運(yùn)行間隔過(guò)長(zhǎng)造成的!這是由動(dòng)態(tài)掃描程序缺陷引起的,因?yàn)檫@種掃描程序沒(méi)有鎖存的功能,程序需要不停的掃描,才能保證顯示效果,看這段典型的程序: uchar shift ;
uchar count=0 ;
uchar k;
shift=0xfe;
P2=0xff ;
for(k=0; k<8; k++)
{
P0=dis_code[dis_buf[k]];
P2=shift;
shift=_crol_(shift,1); //左移一位,選中更高的數(shù)碼管
delayms(1);
} 可以看到,每次調(diào)用這段掃描程序后,數(shù)碼管的位選線就停在了最高位,如果兩次調(diào)用的間隔過(guò)長(zhǎng),就會(huì)造成最高位停留時(shí)間比其他位更多,而顯示亮度恰巧與位選停留的時(shí)間長(zhǎng)短有關(guān)! 解決方法非常簡(jiǎn)單,在位選循環(huán)結(jié)束后加了P2=0xff;關(guān)閉了所有數(shù)碼管的顯示,保證各位數(shù)碼管的顯示時(shí)間均等。經(jīng)實(shí)驗(yàn)證明,這個(gè)方法是對(duì)的! 之所以沒(méi)人提到這個(gè)問(wèn)題(也許真是我看的書太少,沒(méi)發(fā)現(xiàn)其實(shí)人家也是這么解決的??),我想現(xiàn)在大家做東西的時(shí)候大都是首選液晶顯示器(價(jià)格也不貴,20來(lái)塊錢,消費(fèi)的起),或者使用的專用的顯示芯片(程序無(wú)須時(shí)時(shí)掃描數(shù)碼管),即使是為了節(jié)約成本,也使用了數(shù)碼管動(dòng)態(tài)掃描,也是因?yàn)橹饕迷诹酥T如“鬧鐘”等沒(méi)有多少數(shù)學(xué)運(yùn)算的項(xiàng)目上了。
|