单片机灯的移位问题?

来源:百度知道 编辑:UC知道 时间:2024/09/23 13:57:10
void main()
{
uchar temp, a, b,i;
while(1)
{
temp=0xfe;
P0=temp;
delay(200);
for(i=1;i<8;i++)
{
a=temp<<i;
b=temp>>(8-i);
P0=a|b;
delay(200);

}
for (i=1;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P0=a|b;
delay(200);

}

}
我看不懂a=temp>>i;
b=temp<<(8-i);
P0=a|b;
这3行的意思,麻烦瞌睡帮我注意一下, a=temp>>i是不是每次都左移移位啊,移位后a的值, 特别是b=temp《《(8-i) 怎么移动啊。就移动到哪里去了? 谢谢。

a=temp>>i;
b=temp<<(8-i);
P0=a|b;
是将temp中的值右移i位后送给a;是将temp中的值左移8-i位后送给b,然后a、b相或后输出到P0口。楼主需要明白,这里移位靠的是temp的初值在计数器i的控制下移位,而a、b仅仅是中间变量,这段程序甚至可以直接写成:
P0 = (temp>>i) | (temp<<(8-i));
根本不需要a、b这两个中间变量。

这种问题最好独立解决!
这个很简单的程序,你要是想不出来
可以用KEIL仿真看看他们的数值变化,在想
不出来,咱们可以自己画啊,自己仔细写出每一步值的变话!
初值temp=0xfe;也就是二进制的1111 1110
a=temp>>i;然后 temp右移1位也就是 0111 1111
b=temp<<(8-i);第一次i=0哦,temp左移动7为,temp还是0xfe哦,
所以b为0000 0000
P0=a|b;0111 1111 或上0000 0000 你不要告诉不知道是多少?
是0111 1111 第一次循环就是P0.7亮。
这道算法的思想是要让P0亮的灯从P0.7向P0.0移动,一次只亮一个,
但是temp每右移一位最高位就要多出现一个0。
就是第一次 temp 移动后为 0111 1111 第二次为0011 1111 以此类推。
但是我每次只要亮另一个啊,所以b=temp<<(8-i); 第一次移动为0000 0000
第二次为1000 0000 以此类推。那P0=a|b第一次是不是=0111 1111|0000 000
=0111 1111,P0.7亮。第二次=1000 0000|0011 1111 =1011 1111 P0.6亮。
这样讲你懂了么?

for(i=1;i<8;i++)
循环,每次移动8次

b=temp《《(8-i)
把TEMP 向左移动(8-I)个位,移动完了