一,按位操作的講解

白夜行zz發表於2014-12-04

今天的這一講我們從一句程式碼講起,就是這一句:

P1SEL |=  (1<<0);

它究竟是什麼意思呢?我們把各個部分分解來看一下~~

首先P1SEL 是一個暫存器的名字,這個暫存器可能是八位,十六位甚至是三十二位,具體是多少位要查閱晶片手冊才能知道,尤其是每一位的功能是什麼更是需要查閱晶片手冊。

那麼然後的 |= 是什麼意思呢,其實它跟 += 的道理是一樣的,就是讓左面的表示式和右面的表示式做或運算,運算的結果存進左面的變數裡。

可是右面的東西是什麼呢? (1<<0) 這裡的 << 是左移符號,指的是把1向左移動0位,我們假定這個暫存器的八位的(這樣我可以少寫幾個0哈哈哈哈),那麼

1<<0 = 0000 0001
1<<1 = 0000 0010
1<<2 = 0000 0100  。。。。。。

同理... >> 的意思就是右移運算,指的是把某一個數值或者變數向右移動幾位,,

所以現在各個部分都明確了我們再來看看我們最初的表示式:

P1SEL |=  (1<<0);

我們來分析一下,這一句的功能: 它將 P1SEL 和 0000 0001 進行了或運算,運算後的結果存在P1Sel 裡面。 這裡需要提醒我親親的老婆的是,每一位,與0或運算的結果為原值,與1或的結果為1...所以這一句的效果就是,在不影響 P1SEL前七位的情況下,將P1SEL的第八位置為1.

那麼我們為什麼要這麼做呢。。。我們知道微控制器資源有限,整合度也很高,對於一個暫存器,可能每一位是0還是1就決定了不同的工作模式或者功能。所以很多時候我們需要在不改變一個暫存器其他位的值的情況下改變暫存器的某一位。這樣這種運算的功能就得到了充分的體現,它可以在不改變其他位的情況下改變自己希望改變的固定的位,

如果將P1SEL |= (1<<0); 改成了 P1SEL = 0000 0001; 那就有禮天壤之別。前一句暫存器的前7位並沒有被改變。而後一句暫存器的前7位將都被強行改為0;

下面佈置今天的家庭作業:

請說出下列程式碼的含義:

P0SEL |= (1<<2);
P1SEL &= ~(1<<4);
LPC_SCT0->CTRL_L  |=  (1 << 5)|(1 << 6)|(1 << 7)|(1 << 11);

提示: ~ 是取反符號。將 LPC_SCT0->CTRL_L 看作一個暫存器它是16位的。

相關文章