/*此程序是实现的功能是8路流水灯以1Hz的频率闪动,数码管2Hz的频率静态显示1到F。我用了定时器实现2秒数码管精确延时,用delay函数(即用软件的方法,让CPU无聊的做着自减运算耗时间。呵呵)实现1秒延时。程序运行时,LED走俩个,数码管变化一个数,就是这么简单功能,但就是这么简单的功能耗了我两个小时呢,惭愧。之前没用到中断和定时器的功能。
#include<reg52.h>
#include<intrins.h>//这个函数很给力。
#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;//定时器置位
temp=0xfe;
P1=temp;
P2=0xfe;
while(1)
{
delay(1000);
temp=_crol_(temp,1);//只所以不用<<1左移运算符是因为左移运算符不是循环的,用左移的话后面还得写一串处理函数,来个intrins.h库函数,实现循环的左移运算,晕死,话说这个指令我下午才学会,如果要是流水灯方向变换的话很简单,只要把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写程序,方便灵活。汇编神马的最讨厌了。各种麻烦
|