C51单片机流水灯处理问题

#include <reg52.h>

sbit K1 = P1^4;
sbit K2 = P1^5;

void DelayMs(unsigned char count)
{
unsigned char i,j;
for(i=0;i<count;i++)
for(j=0;j<240;j++);
}

void main(void)
{
unsigned char i;
while(K1==1 && K2==1)
{
for(i=0;i<8;i++)
{
P0 = ~(0x01<<i);
DelayMs(250);
}
}
}
为什么当K1或K2按下时,流水灯要等到走完一个循环才会停止呢?
怎样才能让它按下K1或K2马上就能停止呢?

第1个回答  2013-03-24
因为你把判断K1和K2的语句放在for语句前面,所以当程序在运行for语句时,按下K1和K2的值相当于是无效的。程序要在运行完for语句后再能去判断K1和K2值,而且你这样写,如果按下K1或者K2的时间把握不对的话,就算有按下,但运行完一个循环后灯也会继续亮的,如果你想能随时停止,可以把K1和K2语句话在for语句里面检测,一检测到K1或者K2有按下,就进行相应的操作,又或者用外部中断来执行。
第2个回答  2013-03-24
一般我们不这样写,一般写成
while(1)
{
}

这样的形式。
void main(void)
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
if(K1==1 && K2==1) //放到里面来就行了
{
P0 = ~(0x01<<i);
}
DelayMs(250);

}
}
}本回答被提问者采纳
第3个回答  2013-03-24
#include <reg52.h> // 这样试试
sbit K1 = P1^4;
sbit K2 = P1^5;
void DelayMs(unsigned char count)
{
unsigned char i,j;
for(i=0;i<count;i++)
for(j=0;j<240;j++);
}
void main(void)
{
unsigned char i;
while(1)
{
if(K1==1 && K2==1)
{
i++;
if(i==8)i=0;
P0 = ~(0x01<<i);
DelayMs(250);
}
}
}
第4个回答  2013-03-24
用他的wdc_0501方法也行。你也可以用中断。
相似回答