|
/*此程序是實(shí)現(xiàn)的功能是8路流水燈以1Hz的頻率閃動(dòng),數(shù)碼管2Hz的頻率靜態(tài)顯示1到F。我用了定時(shí)器實(shí)現(xiàn)2秒數(shù)碼管精確延時(shí),用delay函數(shù)(即用軟件的方法,讓CPU無聊的做著自減運(yùn)算耗時(shí)間。呵呵)實(shí)現(xiàn)1秒延時(shí)。程序運(yùn)行時(shí),LED走倆個(gè),數(shù)碼管變化一個(gè)數(shù),就是這么簡單功能,但就是這么簡單的功能耗了我兩個(gè)小時(shí)呢,慚愧。之前沒用到中斷和定時(shí)器的功能。
#include<reg52.h>
#include<intrins.h>//這個(gè)函數(shù)很給力。
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(uint z);
void main()
{
num=0;
aa=0;
TMOD=0x01;/
TH0=(65536-50000)/256;//裝初值
TL0=(65536-50000)%256;
EA=1;//總中斷開
ET0=1;
TR0=1;//定時(shí)器置位
temp=0xfe;
P1=temp;
P2=0xfe;
while(1)
{
delay(1000);
temp=_crol_(temp,1);//只所以不用<<1左移運(yùn)算符是因?yàn)樽笠七\(yùn)算符不是循環(huán)的,用左移的話后面還得寫一串處理函數(shù),來個(gè)intrins.h庫函數(shù),實(shí)現(xiàn)循環(huán)的左移運(yùn)算,暈死,話說這個(gè)指令我下午才學(xué)會(huì),如果要是流水燈方向變換的話很簡單,只要把temp=_crol_(temp,1)換成temp=_cror_(temp,1);就成了,真心便利
P1=temp;
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==40)
{
aa=0;
num++;
if(num==16)
num=0;
P0=table[num];
}
}
真心喜歡用C寫程序,方便靈活。匯編神馬的最討厭了。各種麻煩
|
|