51单片机用一个按钮控制流水灯的启停

#include
#include
#define uchar unsigned char
#define unit unsigned int
sbit key=P3^1;
uchar a,d;
delay( uchar);
void main()
{

if(key==0)
{
    while(1)
    {   d=0xfe;
        for(a=8;a>0;a--)
        {   P0=d;
            delay(50);
            d=_crol_(d,1);
        }
    d=0x7f; 
    for(a=8;a>0;a--)
        {   P0=d;
            delay(50);
            d=_cror_(d,1);
        }
    }
}
else 
    P0=0xff;        

}
delay( uchar x)
{
uchar b,c;
for (b=500;b>0;b--)
for (c=x;c>0;c--);
}
以上是本人写的程序,它只能启动流水灯,不能停止流水灯。求各位大神指点一下!!!

void main()
{
int a=0;

while(1)
{  
if(key==0)
{
   if(a==2)
     a=0;
   delay(10);
if(key==0)
   a++;

}
 if(a==1)
{
   d=0xfe;
    for(a=8;a>0;a--)
    {  
     P0=d;
        delay(50);
        d=_crol_(d,1);
    }
      d=0x7f; 
    for(a=8;a>0;a--)
    {   
    P0=d;
        delay(50);
        d=_cror_(d,1);
    }
else if(a==2)
     P0=d;
}

}

代码里没有清零的部分,可以设置一个计数器,循环N次之后给P0口清零即可停止,或者设置一个外部输入清零按钮

你要停流水灯的话,肯定也是跟单片机上你接的那个接口有关,你可以执行一个delay把那个接口置零,然后它就会循环的执行,执行一下流水,然后执行一次全灭了;你如果不想循环,那就不用delay了,直接置零

你这个程序检测到key按下的时候就会执行if语句跳到while语句里面死循环。。不会再跳出来。。。你可以加句if(key==0) break;在你的while语句最后面