一,按位操作的講解
今天的這一講我們從一句程式碼講起,就是這一句:
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位的。
相關文章
- Java中的按位操作——Java程式設計思想筆記Java程式設計筆記
- Java中的按位取反運算子,哪位能詳解一下?Java
- Qt控制元件精講一:按鈕QT控制元件
- SAP CRM calculated欄位的實現原理講解
- c#按位操作符&^|與邏輯條件操作符運算子&&_||_?:C#
- Prometheus PromQL 講解與實戰操作PrometheusMQ
- 二進位制運算子按位與 & 巧妙解決核取方塊的
- 位操作學習的一些困惑
- android位運算講解與實戰Android
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位
- SpringMVC註解講解(一)SpringMVC
- 取反!和按位取反~的區別
- 位操作
- 多重揹包二進位制分解思想講解
- Mbps 及其相關單位詳細講解
- VBA命令按鈕操作
- 從windows到linux,圖形化操作到命令列操作講解WindowsLinux命令列
- JavaScript | 按位或運算子JavaScript
- JavaScript & 按位與運算子JavaScript
- JavaScript ~ 按位非運算子JavaScript
- ~ 按位取反運算解析
- PHP 二維陣列, 按某一個欄位排序PHP陣列排序
- 第一講:自定義服務整合原理講解
- 位操作(取反)
- 常用位操作
- lua不同版本的位操作
- 常用的JavaScript位操作(Bitwise)JavaScript
- 位與操作,bitand的使用
- 對十進位制數字的按位輸出,取反,並求其位數
- 位操作基礎篇之位操作全面總結
- [JS]bootstrapTable新增操作按鈕JSbootAPT
- 全網最全,講解最細的ps日常操作小技巧,Photoshop教程
- 一個小例子,給你講透典型的 Go 併發操作Go
- hadoop streaming 按欄位排序與輸出分割詳解Hadoop排序
- 按位運算子在java中的應用?Java
- Java中按位取反運算子Java
- JavaScript ^ 按位異或運算子JavaScript
- 按位“或”賦值運算子 (|=)賦值