用51单片机写了一个流水灯程序,有一点问题,请高手解惑

按键开的时候正常.但是关闭的时候有点问题,一定要等灯亮到起始位置时候按下按键才可以关闭.#include<reg52.h>#include<intrins.h>typed... 按键开的时候正常.但是关闭的时候有点问题,一定要等灯亮到起始位置时候按下按键才可以关闭.
#include<reg52.h>
#include<intrins.h>
typedef unsigned int u8;
sbit key = P3^1;
#define l1 P2

void delay(u8 i)
{
while(i--);
}

void keyer()
{

while(key)
{
delay(1000);
l1=0xff;
}
while(!key)
{
delay(1000);
l1=0xfe;
}
while(key)
{
u8 i=0;
l1=0xfe;
for(i=0;i<7;i++)
{
l1=_crol_(l1,1);
delay(20000);
}
for(i=0;i<7;i++)
{
l1=_cror_(l1,1);
delay(20000);
}

}
while(!key)
{

l1=0xff;

}

}
void main()
{
while(1)
{
keyer();
}
}
展开
 我来答
lycdl
高粉答主

2019-09-24 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2万
采纳率:94%
帮助的人:4882万
展开全部

单片机的流水灯程序,因为程序就这么写的,决定了流水灯左移7次,再右移7次,结束两个循环后,才能执行下面的while(!key),按键才有效,而在循环过程中,不执行while(!key),所以按键无效。下图画红框内的两个循环。


要想按键随时有效,应该把两个移位函数_cror_,_crol_ 放在主程中,检测key也放在主程中,而不能这样放一个子程序中。

XNF阿萨斯
2019-09-24 · TA获得超过115个赞
知道答主
回答量:115
采纳率:35%
帮助的人:15.1万
展开全部
因为你的开关控制和你的亮灯循环耦合了啊。
while(key)
{
u8 i=0;
l1=0xfe;
for(i=0;i<7;i++)
{
l1=_crol_(l1,1);
delay(20000);
}
for(i=0;i<7;i++)
{
l1=_cror_(l1,1);
delay(20000);
}
你这段代码 按键除非一直松开,如果for循环不结束除非你有按键中断要等它流水灯跑完..
例如添加个int light_sign = 0; switch(key) 每次扫到了light_sign就 ++
当 key = 0 || light_sign 越过你闪烁灯范围(这里是7)就清零
然后你的灯根据获得的light_sign 进行当前变化而非for循环就行了.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
花艳花自娱951
2019-09-24 · TA获得超过1877个赞
知道大有可为答主
回答量:3168
采纳率:0%
帮助的人:387万
展开全部
#include<reg52.h>
#include <intrins.h>
#define LED P2
void delay(char i);
void main()
{ unsigned char LedVablue=0xFE;
while(1)
{
LedVablue= _crol_(LedVablue,1); //_crol_(x,Y)是<intrins.h>
//里面的一个库函数,相当于汇编的带进位循环
LED=LedVablue;
delay(100);

}
}
void delay(char i)
{
char j;
for(;i>0;i--)
for(j=0;j<250;j++);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式