中断定时器与流水灯
扫描二维码
随时随地手机看文章
此程序为设置Led流水灯与数码管第0一位的0-16数字循环亮。不能将数码管程序放进主函数里,因为延迟函数delay,可能会在add自加到40时刚好在dalay里面,这时不会有数码管的闪烁。
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7; //位选
sbit dula=P2^6; //段选
int num,add,temp=0xfe;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar n);
void main()
{
TMOD=0x01; //工作方式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器打开
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[0];
dula=0; //数码管初始化
P1=temp; //Led灯初始化
while(1)
{
delay(100);
delay(500);
temp=_crol_(temp,1);
P1=temp;
}
}
void add_1() interrupt 1 //计时器中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
add++;
if(add==40)
{
num++;
add=0;
dula=1;
P0=table[num];
if(num==16)
num=-1;
}
}
//流水灯延迟函数
void delay(uchar n)
{
int i=0, j=0;
for(i=0; i for(j=0; j<125; j++) ; }