T0 工作模式2 计时器中断,一次桐袜200us,1s流水灯左移或右移一次。
k3触发外部中断0,级别高于计时器局御激中断,故拆敬暂停。
#include <reg52.h>#include <intrins.h>
#define uint unsigned int
#define uchar 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=xmsi>0i--)
for(j=112j>0j--)
}
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
}
}
}
}
1灭)。编译器keilc代码如下:
#include<reg51.h>
#include<intrins.h>
//包含循环左移函数
_cro_l头文件
unsigned
char
tmp
//中间变量
//////////////////////////////////////////////////////////////////////////////////////////////////
//
延时子程序
//////////////////////烂判/////////////////////////////////////////////////////////////饥胡改/////////////
void
delay(unsigned
int
cnt)
{
while(--cnt)
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//
主函数做粗
////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
while(1)
//外层循环
{
tmp
=
0xfe
p1
=
tmp
while(1)
//内层循环,执行1、3、5、7亮灯循环
{
delay(30000)
//延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定
tmp
=
_crol_(tmp,2)
p1
=
tmp
if(tmp
==
0xbf)
//判断是否已经点亮到第7灯。是,则退出进入2、4、6、8循环
{
break
}
}
tmp
=
0xfd
p1
=
tmp
while(1)
//内层循环,执行2、4、6、8亮灯循环
{
delay(30000)
//延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定
tmp
=
_crol_(tmp,2)
p1
=
tmp
if(tmp
==
0x7f)
//判断是否已经点亮到第8灯。是,则退出进入1、3、5、7循环
{
break
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)