unsigned char a;
//a=0;
port_mode(); // 将单片机所有端口配置为准双向弱上拉方式
while(1)
{
P0 =~(1<<a++); // 第一次运行时 0000 0001<< 0 = 0000 0001
//a++;
//P0=~(1<<a);
//a++;
if (a==0x08) // 允许左移8次。
{
a=0;
}
}
这是一个流水灯的程序,其中P0 =~(1<<a++);这条语句我看了很久才弄明白。
1.困惑的是运算顺序 a应该先++,还是应该先位移?
通过语句分解和实验证明a是先进行左移运算,后进行自加运算的。
如果a先进行自加运算P0.0这个灯会一直不亮。被抛弃了。至于为什么会被抛弃,我在思考的这个阶段还没特别明白,能想到的就是那一位被抛弃了。
2.其次是1<<a,这条语句我一直理解为a左移了1位,其实是1左移了a位。弄明白这个语句就不难理解为什么P0.0会被抛弃了。a先自加1,a==1,1左移1位=0000 0010,再取反=1111 1101,P0.0位一直会是1(低电平导通),所以P0.0一直不亮。
3.为什么没有对a进行赋初值,那初值会是多少?是0吗?
经测试a的初值可以是0。但是a赋值大于8的时候灯就不会亮,因为if (a==0x08)时a=0,这里改成a> =0x08,a就可以是大于8的值。可是原程序a==0x08,a不赋初值也都可以运行,那a是怎么保证不大于8的?
|