流水灯从中间依次向两边亮起,按键停止,再次按键继续运行
利用TR0的取反,巧妙使用中断,使流水灯停止流动
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define led P2
sbit k3=P3^2;
u8 code light[5] = {0xff,0xe7,0xc3,0x81,0x00};//
void delay(u16 i)
{
while(i--);
}
void Timer0Init()
{
TMOD|=0X01;
TH0=0XFC;
TL0=0X18;
ET0=1;
EA=1;
TR0=1;
}
void Int0Init()
{
IT0=1;
EX0=1;
EA=1;
}
void main()
{
Timer0Init();
Int0Init();
while(1);
}
void time0(void) interrupt 1 using 0
{
static u16 i=0;
TH0=0xfc; //重新装入初值
TL0=0x18;
i++;
if(1000==i)
{
led=light[0];
}
if(2000==i)
{
led=light[1];
}
if(3000==i)
{
led=light[2];
}
if(4000==i)
{
led=light[3];
}
if(5000==i)
{
led=light[4];
i=0;
}
}
void Int0() interrupt 0 //外部中断0的中断函数
{
delay(1000); //延时消抖
if(k3==0)
{
TR0=~TR0;
}
}