【藍橋杯單片機的備賽旅行日記系列】之動態數碼管

目錄


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]免費下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章