单片机C语言编程:控制流水灯
发布网友
发布时间:2022-04-26 07:21
我来回答
共1个回答
热心网友
时间:2023-08-13 18:10
T0 工作模式2 计时器中断,一次200us,1s流水灯左移或右移一次。
k3触发外部中断0,级别高于计时器中断,故暂停。
#include <reg52.h>
#include <intrins.h>
#defineuint unsigned int
#defineuchar unsigned char
sbit k1=P1^0; //左循环按钮
sbit k2=P1^1; //右循环按钮
sbit k4=P1^2; //恢复暂停
sbit k3=P3^2;//暂停
void init();
void showLED();
void delay(uint xms);
uint delayTime;
uint goLeft=1;
uint goRight=0;
uint sFlag=0;
void main()
{
init();
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(k1==0);
goLeft=1;
goRight=0;
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(k2==0);
goLeft=0;
goRight=1;
}
}
}
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void init()
{
P0=0xfe;
TMOD=0x02; //T0 工作模式2 自动装填8位 200us
TH0=0x38;
TL0=0x38;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
}
void showLED()
{
if(goLeft==1)
P0=_crol_(P0,1);
if(goRight==1)
P0=_cror_(P0,1);
}
void moveDelay() interrupt 1//一次中断200us
{
if(delayTime==5000)
{
showLED();
delayTime=0;
}
else
delayTime++;
}
void stopLED() interrupt 0
{
while(1)
{
if(k4==0)
{
delay(10);
if(k4==0)
{
while(k4==0);
break;
}
}
}
}