|
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應(yīng)該先++,還是應(yīng)該先位移?
通過語句分解和實驗證明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(低電平導(dǎo)通),所以P0.0一直不亮。
3.為什么沒有對a進行賦初值,那初值會是多少?是0嗎?
經(jīng)測試a的初值可以是0。但是a賦值大于8的時候燈就不會亮,因為if (a==0x08)時a=0,這里改成a> =0x08,a就可以是大于8的值。可是原程序a==0x08,a不賦初值也都可以運行,那a是怎么保證不大于8的?
|
評分
-
查看全部評分
|