目錄
1、數碼管函數顯示
2、數碼管的中斷顯示
3、兩種顯示方法比較
1、數碼管函數顯示
不用說,剛入門肯定是這種寫法:
void Display()
{
uchar i,temp;
temp=0x01;
for(i=0;i<8;i++)
{
P2=0xC0;
P0=temp;
temp<<=1;
P2=0xE0;
P0=smg[i];
Delay2ms();
P0=0xFF;
}
}
temp存儲數碼管位選值,並在一次循環中移動一位,淺顯易懂;
2、數碼管的中斷顯示
void Timer0()interrupt 1
{
smg_cnt++;
if(smg_cnt==2)
{
smg_cnt=0;
P2=0xc0;P0=0x01<<i;P2=0;
P2=0xe0;P0=smg[i];P2=0;
i++;
if(i==8)i=0;
}
}
3、兩種顯示方法比較
顯然,以上兩段代碼理解起來一點問題都莫得(前提至少是懂定時器和中斷),所以這篇文章重點分析兩段代碼的異同點。
1.相同點
都能動態掃描並顯示。
2.不同點
(1).在分析不同點之前,最好再溫習一遍這個常識:定時器和CPU是獨立的模塊;
(2).函數顯示延時靠CPU,相對於定時器來說,並不是那麼“自由”。
所謂自由,如果你一直在主函數裏卡着CPU(如按鍵鬆手檢測),那麼函數顯示就會異常(可以自己動手試試),而中斷則不會出現這種情況,這一局“定時器顯示”得一分;
(3).函定時器顯示靠中斷,相對於函數顯示來說來說,並不是那麼“生命力強”。
所謂生命力強,即當你使用其他通信協議的時候(如iic),不得不關中斷來確保數據傳輸的可靠性,因此這一局函數顯示得一分(但其實定時器這個問題可以完美解決);
(4).其他就不贅述,例如中斷顯示可拓展性強,如:
void Timer0()interrupt 1
{
smg_cnt++;
if(smg_cnt==2)
{
smg_cnt=0;
P2=0xc0;P0=0x01<<i;P2=0;
if(menu_index==1){P2=0xe0;P0=menu1[i];P2=0;}
if(menu_index==2){P2=0xe0;P0=menu2[i];P2=0;}
if(menu_index==3){P2=0xe0;P0=menu3[i];P2=0;}
if(menu_index==4){P2=0xe0;P0=menu4[i];P2=0;}
......
i++;
if(i==8)i=0;
}
}
因爲藍橋盃賽題中往往是多個顯示界面。
綜之:二者並沒有一定程度上的孰強孰弱,只是每個人的代碼風格不一樣,只能說更傾向於哪種寫法,當然我推薦你使用定時器顯示寫法,代碼精煉,這在比賽中是很能節省時間的。當然還有各種各樣的寫法,我這裏只是列舉其中兩個。
喜歡的話可以關注我,我會陸續把其他模塊及省賽、國賽歷年真題代碼完全免費開源,屆時會同步至github和CSDN博客上。
本文完整源代碼移步至[我的github]免費下載。