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