單片機實現定時流水燈+六位數碼管輪流顯示的效果

今天利用前兩天學到的流水燈(其實就是個函數的用法哈哈哈)和中斷的概念編了一小段代碼~

可以實現的效果:

八個LED燈間隔1s輪流點亮,六位數碼管間隔2s輪流依次顯示數字1-9.


代碼如下:

include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
	
sbit dula=P2^6;
sbit wela=P2^7;
sbit DIOLA=P2^5;
uchar temp;
uint a,i,we_order;
uchar code table[]={ 0x3f ,0x06 ,0x5b ,0x4f,0x66 ,0x6d, 0x7d ,0x07 ,0x7f, 0x6f};
void delay(uint z);
void main()
{
	a=0;
	i=0;
	DIOLA=1;
	temp=0xfe;//用來控制LED燈點亮順序
	P1=temp;
	TMOD=0x01;//中斷模式,定時器
	TH0=(65535-50000)/256;	//50ms定時器初值設定
	TL0=(65535-50000)%256;
	
	EA=1;	//開啓總中斷
        ET0=1;  //定時器0
	
        TR0=1;	//定時器0
	
	wela=0;
	dula=0;
  
	 wela=1;
	 we_order=0xfe;//控制顯示數字的數碼管的順序
	 P0=we_order;
	 wela=0	 ;
	

	 dula=1;
	 P0=table[i];//顯示數字0
	 dula=0;
	 
	 while(1);//注意:要防止主函數循環執行(許多只需要執行一次的賦值語句)
	
	 
}



void timer0() interrupt 1//定時器0
{
	a++;
	if(a%20==0)//間隔1s
	{		
	  temp=_cror_(temp,1);//_cror_&_crol_LED燈輪流點亮
	  P1=temp;			
	}
	if(a==40)//間隔2s
	{
	  we_order=_crol_(we_order,1);
	  if(we_order==0xbf) we_order=0xfe;//***注意we_order令第6個數碼管顯示時不應改變
          wela=1;
	  P0=we_order;
	  wela=0;
	  dula=1;
	  i++;
	  if(i>9) i=0;
	  dula=1;
	  P0=table[i];
	  dula=0;
	  a=0;		
         }
//判斷語句可以放在主函數中,也可放在中斷函數中(有時會受到主函數中程序運行時間的影響),注意區別
}

實現效果:

每天學到新的東西真的很開心啊~無論是課本上的知識or舞蹈or廚藝or寫作or單片機/算法~繼續加油哦!

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