<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機C語(yǔ)言位操作實(shí)例

單片機C語(yǔ)言位操作實(shí)例

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò ) 收藏
C語(yǔ)言本身有較強的位處理功能,但在控制領(lǐng)域有時(shí)候經(jīng)常需要控制某一個(gè)二進(jìn)制中的某一位,為此在MCS_51的KEIL C51中擴充了兩個(gè)數據類(lèi)型bit和sbit。前者可以在MCS_51的位尋址區進(jìn)行分配,而后者只能定義為可位尋址的特殊功能寄存器SFR中的某一位。這兩個(gè)擴充為MCS_51應用C語(yǔ)言編程帶來(lái)很大的方便。AVR的C語(yǔ)言中除了CodeVisionAVR定義了bit數據類(lèi)型外,其余都沒(méi)有類(lèi)似的定義,而sbit類(lèi)型所有C語(yǔ)言都沒(méi)有定義。相比較,進(jìn)行位操作運算CodeVisionAVR的功能最強,它一方面有bit類(lèi)型的數據,可用于位運算;另外在訪(fǎng)問(wèn)寄存器時(shí)可以直接訪(fǎng)問(wèn)寄存器的某一位,例如訪(fǎng)問(wèn)DDRB的B2位可以這樣訪(fǎng)問(wèn):
DDRB.3 = 1;
而在IAR、ICCAVR和GCCAVR中沒(méi)有bit類(lèi)型的運算,當它們需要訪(fǎng)問(wèn)寄存器的某一位時(shí),只能使用ANSI C語(yǔ)言的位運算功能。
C語(yǔ)言是為描述系統而設計,因此它具有匯編語(yǔ)言所能完成的一些功能,有較好的位操作指令:“&”,“|”,“~”、“<<”、“>>”。在控制領(lǐng)域,經(jīng)常需要控制某一個(gè)二進(jìn)制位,標準C有兩種方法實(shí)現單個(gè)位的操作。
1. 用“讀-修改-寫(xiě)”實(shí)現對單個(gè)位的操作
在沒(méi)有單個(gè)位的位操作指令的情況下,一般是采用“讀-修改-寫(xiě)”的方法實(shí)現單個(gè)位的位操作,即:
Ø 通過(guò)與0“與”操作,將某一位清0。例如,使i變量的第0位為0,實(shí)現方法為:i = i&0xfe;
Ø 通過(guò)與1相 “或”操作,將某一位置1。例如,使i變量的第0位為1,實(shí)現方法為 i = i|0x01;
Ø 通過(guò)與1進(jìn)行“異或”操作,將某一位取反。例如,使i變量的第0位取反,實(shí)現方法為 i = i^0x01。
注意:采用“讀-修改-寫(xiě)”的方法時(shí)不要影響其他位。即某位清0時(shí),其他位與1相 “與”;某位置1時(shí),其他位與0“或”;取反時(shí),其他位與0“異或”。
很多程序員喜歡采用下面的移位方式,語(yǔ)句簡(jiǎn)練:
#define bit(x) (1<<(x))
#define LED 2
PORTB|= bit(LED); //將PORTB第二位置1,點(diǎn)亮連接在I/O口的LED
該方式下,程序運行時(shí)會(huì )增加移位操作,生成的代碼較大。若按如下方式直接定義生成的代碼就不會(huì )有移位操作:
#define LED 0X04
PORTB |= LED;
也有程序員采取如下宏定義的方法實(shí)現單個(gè)位的操作,使用十分方便:
#define SET_BIT(x,y) ((x)|=(0x0001<<(y)))//置x的第y位
#define CLR_BIT(x,y) ((x)&=~( 0x0001<<(y)))//清x的第y位為0 #define CPL_BIT(x,y) ((x)^= (0x0001<<(y)))//取反x的第y位
#define GET_BIT(x,y) (((x)&(1<讀取x的第y位
#define LET_BIT(x,y,z) ((x)=(x)&(~(1<<(y)))|((z)<<(y)))//
將x的第y位寫(xiě)上z(0/1)
2. 通過(guò)位域的(Bit Field )的方法實(shí)現位操作
在系統寄存器設置時(shí),很多時(shí)候并不需要修改完整的字節,而是只修改一個(gè)或幾個(gè)位,標準C提供了一種基于結構體的數據結構——位域。位域就是把一個(gè)存儲單元中的二進(jìn)制劃分為幾個(gè)不同的區域,并說(shuō)明每個(gè)區域的位數,每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。位域的定義格式如下:
Struct 位域結構名
{
位域列表;
};
位域列表格式為:類(lèi)型說(shuō)明符 位域名:位域長(cháng)度
Struct k
{
unsigned int a:1;
unsigned int :2;
unsigned int b:3;
unsigned int :0;//空域
}k1;
說(shuō)明:
Ø 各位依次從低位到高位排列,排滿(mǎn)一個(gè)存儲單元,按地址接著(zhù)排下一個(gè)單元。
Ø 位域可以無(wú)域名,但不能被引用。例如,第2域,這時(shí)它只用來(lái)填充和調整位置。
Ø 第四行稱(chēng)為空域,目的是將目前存儲單元的剩余部分分為一個(gè)域,且填充0。
位域的引用,例如;
k1.a = 1;//置k1的BO位為1
k1.b = 7;//置k1的B3-B5位為111
用位域定義位變量,操作I/O口,產(chǎn)生的代碼緊湊、高效。定義的方法如下;
typedef struct INT8_bit_struct
{
unsigned bit0:1; unsigned bit1:1; unsigned bit2:1;
unsigned bit3:1; unsigned bit4:1; unsigned bit5:1;
unsigned bit6:1;unsigned bit7:1;
}bit_field;
再次宏定義每一個(gè)位,使用方法如下:
#define _PINB 0x23
#define _PORTB 0X25
…………
#define IOB2i (*(volatile bit_field *)(_PINB)).bit2
#define IOB2o (*(volatile bit_field *)(_PORTB)).bit2
例如:
void main(void)
{
unsigned char I;
IOB2o = 0;//B口B2位輸出低電平
i = IOB2i;//讀B口B2位,將B口B2位上的電平值送給i
//
}
對于沒(méi)有擴展位變量的C語(yǔ)言環(huán)境,在匯編下沒(méi)有單個(gè)位的位操作的MCU,通過(guò)位域的方法操作I/O口是最佳的方法;匯編下有單個(gè)位的位操作指令的MCU,可以嵌入式匯編,但是程序的移植性可能會(huì )下降,建議使用位域的方法進(jìn)行操作比較合適。


關(guān)鍵詞: 單片機C語(yǔ)言位操

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>