实现k1控制LED左移,k2控制LED右移,k3启动向右流水越来越快(嗯一次块一次),k4控制向右流水越来越慢(嗯一次慢一次),为什么我这个代码会变成流水快慢快
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define led P2
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
extern m=1;g=50; //定义全局变量m,g
void delay(u16 i) //延迟函数
{
while(i--);
}
void LEDone() //实现按一下k1左移功能
{
if(led==0xff) //假如led全部不亮,就亮第一个灯,并实现左移第二灯亮
{
led=0x7f;
}
led=_cror_(led,1);
}
void LEDtwo() //实现按一下k2右移功能
{
if(led==0xff) //假如led全部不亮,就亮第一个灯,并实现右移第二灯亮
{
led=0x7f;
}
led=_crol_(led,1);
}
void speed() //变速函数
{
if(g>1)
{
if(k3==0) //检查k3是否按下
{
delay(1000); //消抖
if(k3==0) //再次检查k3是否按下
{ g=g-5; //每按一次k3,g减小,从而实现按一次左移流水变快
}
while(!k3); //判断k3是否松开
}
}
if(k4==0) //检查k4是否按下
{
delay(1000); //消抖
if(k4==0) //再次确认k4是否按下
{ m=m+5; //每按一次k4,m增大,从而实现按一次右移流水变慢
}
while(!k4); //判断k4是否松开
}
}
void LED_right() //实现向右流水
{
u8 i,a=0;
while(1)
{
for(i=0;i<7;i++) //流水
{
led=_crol_(led,1);
delay(5000*m); //实现变速(按一次k4,m值变大一次从而实现流水延迟时间越来越长,流水速度变慢)
speed(); //调用变速函数,由k4控制越来越慢
if(k1==0||k2==0) //判断k1/k2是否按下
{
delay(1000); //消抖
if(k1==0||k2==0) //再次确认k1/k2是否按下
{ a=1;while(!k1||!k2);break; } //如果按下k1/k2,跳出for循环
}
}
if(a==1)break; //跳出while循环,停止流水
}
}
void LED_left() //实现向左流水
{
u8 i,a=0;
while(1)
{
if(g>1)
{
for(i=0;i<7;i++)
{
led=_cror_(led,1);
delay(5000*g); //实现变速(由于下面speed函数调用改变g)(按一次k3,g值变小从而实现流水延迟时间越来越短,流水速度变快)
if(k1==0||k2==0) //判断k1/k2是否按下
{delay(1000);
if(k1==0||k2==0)
{a=1;while(!k1||!k2);break;} //如果按下k1/k2,跳出for循环,
}
if(k4==0) //判断k4是否按下,实现从k3向左流水切换到k4向右流水
{
delay(1000);
if(k4==0)
{LED_right();}
while(!k4);
}
speed(); //调用变速函数,改变g大小,从而改变延迟时间
}
if(a==1)break; //跳出while循环,停止流水
}
}
}
void keypros() //按键控制功能
{
if(k1==0||k2==0||k3==0||k4==0) //检查k1或者k2或者k3或者k4是否按下
{
delay(1000);
if(k1==0)
{ LEDone();} //调用左移一位函数
if(k2==0)
{ LEDtwo();} //调用右移一位函数
if(k3==0)
{ LED_left();} //调用向左流水函数
if(k4==0)
{ LED_right();} //调用向右流水函数
while(!k1||!k2||!k3||!k4);
}
}
void main()
{ while(1)
{
keypros();
}
}
|