今天利用前兩天學到的流水燈(其實就是個函數的用法哈哈哈)和中斷的概念編了一小段代碼~
可以實現的效果:
八個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單片機/算法~繼續加油哦!