前面介紹了C語言編程的6種位操作,分別是按位與“&”、按位“或|”、按位取反“~”、異或“^”、左移“<<”以及右移“>>”。這6種位操作在操作單片機的寄存器時非常方便,尤其是對寄存器的某一位清零或者置位,而不影響其他位。
單片機端口方向配置寄存器
以8位單片機為例,如果要將第1位設置為輸出,而其他7位保持不變,根據寄存器說明只需要將第1位配置為1即可。這里就要用到“置1”的C語言語句。直接操作寄存器時,可以直接通過置1和清0來將某一個bit設置為1或者0,如下圖所示。
置1和清0位操作
1."置1"C語言語句
//Var |= ( A<
其中Var是變量,B是從第幾位開始,而A則是要修改的位數,操作結果是置1。讀法為:將Var從第B位開始的連續A位置1,其他保持不變。
2.“置1”C語言語句推導
假設將Var中從第1位開始的3位置1,那么C語句的寫法應該為:Var |= (0x7<<1);那么推導過程如下:
Var = Var | ( 0x07<<1 );//等效寫法 0x07: 0000 0111 0x07<<1: 0000 1110//可以看到第1、2、3位變為了1; //Var做按位或運算時,只要有1則結果為1
由上面的推導可以看到,(0x07<<1)從第1位開始的連續3位已經變為了1,再跟變量Var做或運算時,這三位就完成了置1操作,而其他位不受影響。
3."清0"C語言語句
//Var &= ~ ( A<
其中Var是變量,B是從第幾位開始,而A則是要修改的位數,操作結果是清0。讀法為:將Var從第B位開始的連續A位清0,其他保持不變。
按位或的真值表參考如下:
輸入A | 0 | 0 | 1 | 1 |
輸入B | 0 | 1 | 0 | 1 |
輸出 | 0 | 1 | 1 | 1 |
4.“清0”C語言語句推導
假設將Var中從第1位開始的3位清0,那么C語句的寫法應該為:Var &=~ (0x7<<1);那么推導過程如下:
Var = Var &(~( 0x07<<1 ));//等效寫法 0x07: 0000 0111 0x07<<1: 0000 1110//可以看到第1、2、3位變為了1; ~( 0x07<<1 ): 1111 0001//按位取反,可以看到第1、2、3位變為了0; //Var做按位與運算時,只要有0則結果為0
由上面的推導可以看到,~(0x07<<1)從第1位開始的連續3位已經變為了0,再跟變量Var做與運算時,這三位就完成了清零操作,而其他位不受影響。
按位與的真值表參考如下:
輸入A | 0 | 0 | 1 | 1 |
輸入B | 0 | 1 | 0 | 1 |
輸出 | 0 | 0 | 0 | 1 |
5.“清0”和“置1”總結
按位操作的這種用法在初次接觸時非常的難理解,需要反復練習才能熟悉,下面將置1和清0做了總結,以方便大家記憶。
按位操作的“置1”規律如下圖所示:
↑ 按位操作的“置1”規律
按位操作的“清0”規律如下圖所示:
↑ 按位操作的“清0”操作
審核編輯:劉清
-
單片機
+關注
關注
6035文章
44554瀏覽量
634690 -
寄存器
+關注
關注
31文章
5336瀏覽量
120235 -
C語言
+關注
關注
180文章
7604瀏覽量
136701
原文標題:單片機C語言,位操作的編程實現:置位和清零,GPIOx_CRL |= (0x01<<1)
文章出處:【微信號:玩轉嵌入式,微信公眾號:玩轉嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論