51单片机程序求解

while(1)
{
P3|=0x3c;
do
{
P1=OutData;
OutData=_crol_(OutData,1);
mDelay(1000);
}
while((P3|0xfb)!=0xff);
P1=0xff;
}
上面程序运行时按下P3.2开关(P3.2=0)没能起到灭跑马灯 全灯的效果 我知道此程序不合理 但我想知道能不能改成以下
while(1)
{
P3|=0x3c;
do
{
P1=OutData;
OutData=_crol_(OutData,1);
mDelay(1000);
}
while((P3|0xfb)!=0xff)
{
P1=0xff;
}
}
开关一直按下不抬起等全灭 , 抬起继续向灯左移动? 我想知道这样编程可以么?
do while() 语句 while 后面如果加{} 我的问题是()里面成立后 是运行DO 还是运行 {}里面的?

估计LZ刚刚开始学单片机,我来解释下这个程序:前面不说了 定义头文件 一个延时子程序从这句开始
unsigned char OutData=0xfe;
声明OutData为有符号字符型变量 0xfe是什么意思呢?你只需要看fe是十六进制 你用计算机转换成二进制就是11111110 结合下面的那句
P1=0xfe 就知道了 点亮P1口的第一个灯,注意这是一种总线型的方法。
类似于outdata=P1^0;//定义P1口第一位
接下来P3|=0x3c;你得知道|=这个符号是进行赋值运算 把P3口的值和0X3C(也就是00111100)进行逻辑或赋值。
接下来P1口第一个灯亮 循环左移 做流水灯
延时1000MS 这不多说
下面 (P3|0xfb)!=0xff P1=0xff;
P3口的输入值与0XFB(11111011) 按位相或的结果不等于0XFF(11111111)那么怎么才能让它不等于(11111111) 呢?看这个位逻辑运算(0|0=0 ,0|1=1 ,1|0=1 ,1|1=1)那么就只有当P3口的第三位为0的时候0|0=0才会成立,P3口的第三口那么就是P3.2为0时表达式成立。 如果你说0XFC 那么就是11111100,那么就只有当P3口的P3.0,P3.1同时为0才会成立这个结果。
注意单独的|表示按位相或按二进制运算 如果你不知道位这基本概念的话,那你先把基础的东西学好吧。
那么P1=0XFF(11111111) 就是灯全部熄灭 同上面 总线型的方法 你把十六进制转换成二进制就很好理解了
请参考
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-09
你的程序有仿真过么 ? 用下面这个试一下
while(1)
{
P3|=0x3c;
while((P3|0xfb)!=0xff)
{
P1=OutData;
OutData=_crol_(OutData,1);
mDelay(1000);
}

P1=0xff;

}
这个程序实现你这个功能应该是没问题了,但实际的应用中,按键还要加去抖动的功能.
第2个回答  2010-11-09
没怎么明白
do
{
语句1 ;
语句2 ;
....

语句n ;
}
while (条件语句) ;
while后面加{}是什么情况啊?

我也是菜鸟
相似回答
大家正在搜