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