while语句使用

当while循环条件为假,while退出循环体语句后,继续向下执行新程序,若此时,循环条件又变为真的话,那程序该如何运行,是否会重新退回到while循环程序运行。如果此时,循环条件又变为假,则重新跳出循环体,该从何处开始运行下面的程序,上次运行程序的寄存数值会保留下来么?
如——
while(P3_2==0)
{;}
fashe();
TR1=0;
value=n;
display();
其中,n是T1中断一次后,自动加1,fashe程序中有TR1=1,也就是打开T1定时功能,当发射完成后,TR1=0,关闭T1定时,则n的值为需要返回提取的值。但是while的循环条件P3_2的值是会改变的,因此不知道循环如何运行。请教大家支援,谢谢。

当P3_2口为0时,while一直循环;一旦P3_2口为1,while循环就会跳出啊,程序就顺序执行不再返回。你是用keil编写吗?可以用keil仿真调试出来的。。追问

我也这么想,可实际设计板子后,硬件调试时,总是出现反复的现象,弄的我晕头转向,随便写个例如
main()
{
while(p3_2==1)
{P1=0x69;}
P1=0x80;
}
这个程序当P3_2==1时,数码管显示0X69,一旦当P3_2==0时,数码管显示0X80,我在P3_2引脚外接的是一个按键开关。当按下时P3_2==1,弹起时为0.这样反复按,数码管轮流重复显示0X69和0X80。为什么?单片机运行具体过程怎样?不是应该跳出循环后,不再重新返回了么?

追答

这个是单片机的通病,在单片机程序中,只要你不让它停下来它就一直执行,你把你的程序改成如下的试试就知道了:
main()
{
while(p3_2==1)
{P1=0x69;}
P1=0x80;
while(1);
}

追问

恩,这个还是谢谢指教,还有个问题,如果你不让单片机停下来,那它重复执行,从哪里开始重复?是从INTICAL最初定义重复,还是从while处重复?如果从初定义,意味着端口和寄存器信息都重新定义,如果从while重复,那上次运行带来的寄存器数据,是否会累加?为了不让单片机在不断电的情况自动重复运行,只能如你所说,加入无限空循环语句么?还有别的方法么?
不过很谢谢你的指教,有您指点下,顿时会豁然开朗。

追答

在不断电情况下,如果程序跳出了while循环它就会从main函数开始处开始再次循环执行,这是所有单片机都有的一个问题。
其实在现实编程时,我们都是在主要执行部分加入一个while大循环,用以避免从main函数重复执行的问题,而且你用了按键,就要考虑去抖的问题,在后面的学习中你肯定会知道的。
建议你用以下的程序架构:
main()
{
//此处加你在程序前需要的初始化语句
whie(1)
{
//你的函数体语句
}
}

追问

while大循环的意思是什么?
while(1)这条语句不是只用于等待中断么?其余情况,例如:P3_0==1,也是可以用这个语句等待么?还是只能用while(P3_0==1)。
为了避免单片机循环执行,好像也可以加入无限循环语句,动态停机,SJMP $.
去抖应该就是加入DELAY,IF,语句判断吧。
不好意思啊,我的问题满初级的,见笑了啊。回头一定给您最佳答案。

追答

汇编语言对于我们是没有必要深究的,所谓的大循环,就是人为的加入一个控制语句,使程序只执行我所需要的程序语句。譬如你的程序,只是操作按键,所以没有初始化的必要,所以直接进入大循环。而且判断单一按键的时候,使用IF语句才是比较合理的选择。
见如下程序,(延时程序你自己写,程序是刚打的,不行就再改下吧):
main()
{
delay(10);//此处只是举例
whie(1)
{
if(p3_2==1)
{
delay(10);//延时10ms,就是实现按键去抖
if(p3_2==1)
P1=0x69;
}
while(!p3_2);//等待按键释放,在此期间P1一直为0x69。
delay(10);
P1=0x80;
}
}
由于有大循环存在,所以单片机会一直判断p3_2是否被按下,这样就不需要加入无限循环语句,动态停机,而且还可以无限的判断,在现实中更有使用价值。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-10
用两个while while中套while
第2个回答  2011-07-10
循环完成后给P3_2重新赋值,有点麻烦,相对比较容易。
相似回答