while(1)
{ P1=aa;
delayms(1000);
aa=_crol_(aa,1);
}
这前面的while(1)根本不会退出,也就是不会执行下面的if(key1 == 0)的语句了,所以按键按下去当然没有反应了
if(key1==0)
{
P1=0x7e;
while(1)
{
a = 0xfe;
for(j=0;j<8;j++) //外循环8次
{
//--------------------------------------------
for(i=0;i<8-j;i++) //内循环8、7、60次
{
P1=a; //第一次,只有右边1个发光
delay(200);
a=_crol_(a,1); //左移一位
}
//以上单个LED发光,移位8、7、6次
//----------------------------------------
a = _crol_(a, j); //左移,第一次,移动0位,以后渐多
//前面的内循环,移位次数逐减,这里逐增,合到一起,仍然是移动8位
P1 = 0xff; //关闭显示
a = a << 1; //左移一位,右边添0,这样,就会有两个发光
} //到前边去循环,显示两个发光;
//再循环,有三个发光;
//……
}
你有几个错误:
1 你的定时器没有重装,导致第一次中断和后面的中断时间不一样,第一次时间短,后面的时间一直是以65536个周期中断的
2 你在中断函数里用了 for 循环,for循环是一下子就执行完了的,而不是你想象的每中断一次才执行一次
for(a=0;a<8;a++)
{
P1=(P1<<1)+1; //----这一句,使得你的第二个灯亮,其实第三,四,五个都亮了,但是因为你的
//----For循环太快了,你看不出来
};
if(a==8) //---执行完for之后,a肯定等于8,所以执行下面的,结果就是第一个灯亮
P1=0xfe;
3 我给你改正的,程序:功能是先是第一个灯亮,再是第一个灯灭,亮2,然后2灭,亮3
void time1() interrupt 3
{
tt++;
if(tt==10)
{
tt = 0; //---这句表示中断10次换一个灯,不可少
//----如果没有这句tt = 0,则成了中断256次才换一个灯
P1 =~(1<<aa); //---下面这三句,你好好想想是为什么,如果不明白再问我
//---最好要自己思考,想明白
aa++;
aa &= 0x07;
}
//----别忘记装入初值,你这个应该是10ms中断,然后是100ms换一次灯
//-----如果你不装初值,就成了 65536ms中断一次,再加上你前面不加上 tt = 0;
//------就成了16秒才换一次灯
TH1=0xd8;
TL1=0xf0;
}
//C51点亮8位LED流水灯:1234,2345,3456,7012;
//P1口接LED灯。假设高电平为点亮。
#include<reg51h>
#define LED P1char code light[]={0x1e,0x3c,0x78,0x87};
void delay(unsigned int i)
{
unsigned char j;
while(--i){j=100;while(--j);}
}
void main()
{
unsigned char i;
while(1)
{
for(i=0;i<4;i++)LED=light[i];
delay(1000);
}
}
//已编译通过。
//我在的:
以上就是关于c51单片机独立按键控制,流水灯程序全部的内容,包括:c51单片机独立按键控制,流水灯程序、51单片机流水灯 单片机 流水灯的问题 C51程序、我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了,最后停在第一个灯处不动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)