不改變其他位的值的狀況下,對某幾個位進行設值。
這個場景微控制器開發中經常使用,方法就是先對需要設定的位用&操作符進行清零操作,然
後用|操作符設值。比如我要改變 gpioa->odr 的狀態,可以先對暫存器的值進行&清零操作
gpioa->odr &=0xff0f; //將第 4-7 位清 0
然後再與需要設定的值進行|或運算
gpioa->odr |=0x0040; //設定相應位的值,不改變其他位的值
移位操作提高**的可讀性。
移位操作在微控制器開發中也非常重要, 我們來看看下面一行**
gpioa->odr| = 1 << 5;
這個操作就是將 odr 暫存器的第 5 位設定為 1,為什麼要通過左移而不是直接設定乙個固
定的值呢?其實,這是為了提高**的可讀性以及可重用性。這行**可以很直觀明了的知道,
是將第 5 位設定為 1,其他位的值不變。如果你寫成
gpioa->odr =0x0020;
這樣的**可讀性非常差同時也不好重用。
~取反操作使用技巧
例如 gpioa->odr 暫存器的每一位都用來設定乙個 io 口的輸出狀態,某個時刻我們希望
去設定某一位的值為 0,同時其他位都為 1,簡單的作法是直接給暫存器設定乙個值:
gpioa->odr =0xfff7;
這樣的作法設定第 3 位為 0,但是這樣的寫法可讀性很差。看看如果我們使用取反操作怎
麼實現:
gpioa->odr= (uint16_t)~(1<<3);
看這行**應該很容易明白, 我們設定的是 odr 暫存器的第 3 位為 0,其他位為 1,可讀性
非常強。
C語言基礎複習 結構體 1
c語言允許使用者根據具體問題利用已有的基本資料型別來構造自己所需的資料型別 陣列是由相同型別的資料構成的一種資料型別,適用於對具有相同屬性的資料進行批量處理 結構體是將不同的資料成員組織到統一的名字之下,適用於對關係緊密 邏輯相關 具有相同或者不同屬性的資料進行處理 結構體變數的定義 1.定義結構體...
C語言複習 1
程式是人機互動的媒介,有輸出必然也有輸入。在c語言中,有多個函式可以從鍵盤獲得使用者輸入 scanf 和 printf 類似,scanf 可以輸入多種型別的資料。getchar getche getch 這三個函式都用於輸入單個字元。gets 獲取一行資料,並作為字串處理。scanf 是最靈活 最複...
C語言複習(1)
1.邏輯運算子的短路效應 邏輯運算子的短路效應 對於邏輯與 來說,同為真時才為真,所以當條件1為假時不需要計算條件2 對於邏輯或 來說,同為假時才為假,所以當條件1為真時不需要計算條件2 下面的運算形式為,先計算 a b 的結果,a為真,故再計算 b,結果也為真,所以表示式 a b 為真 對於 a ...