使用C語(yǔ)言對(duì)寄存器賦值時(shí),常常需要用到C語(yǔ)言的位操作方法。把寄存器某位清零假設(shè)a代表寄存器,且其中本來(lái)已有值。如果要把其中某一位清零且其它位不變,代碼如下。
//定義一個(gè)變量 a = 1001 1111 b (二進(jìn)制數(shù))unsigned char a = 0x9f;//對(duì) bit2 清零a &= ~(1<<2);//括號(hào)中的 1 左移兩位,(1<<2) 得二進(jìn)制數(shù):0000 0100 b//按位取反,~(1<<2) 得 1111 1011 b//假如 a 中原來(lái)的值為二進(jìn)制數(shù):a = 1001 1111 b//所得的數(shù)與 a 作”位與&”運(yùn)算,a = (1001 1111 b)&(1111 1011 b),//經(jīng)過(guò)運(yùn)算后,a 的值 a=1001 1011 b// a 的 bit2 位被被零,而其它位不變。把寄存器某幾個(gè)連續(xù)位清零????由于寄存器中有時(shí)會(huì)有連續(xù)幾個(gè)寄存器位用于控制某個(gè)功能,現(xiàn)假設(shè)我們需要把寄存器的某幾個(gè)連續(xù)位清零,且其它位不變,代碼如下。
//若把 a 中的二進(jìn)制位分成 2 個(gè)一組//即 bit0、bit1 為第 0 組,bit2、bit3 為第 1 組,// bit4、bit5 為第 2 組,bit6、bit7 為第 3 組//要對(duì)第 1 組的 bit2、bit3 清零a &= ~(3<<2*1);//括號(hào)中的 3 左移兩位,(3<<2*1) 得二進(jìn)制數(shù):0000 1100 b//按位取反,~(3<<2*1) 得 1111 0011 b//假如 a 中原來(lái)的值為二進(jìn)制數(shù):a = 1001 1111 b//所得的數(shù)與 a 作”位與&”運(yùn)算,a = (1001 1111 b)&(1111 0011 b),//經(jīng)過(guò)運(yùn)算后,a 的值 a=1001 0011 b// a 的第 1 組的 bit2、bit3 被清零,而其它位不變。//上述 (~(3<<2*1)) 中的 (1) 即為組編號(hào); 如清零第 3 組 bit6、bit7 此處應(yīng)為 3//括號(hào)中的 (2) 為每組的位數(shù),每組有 2 個(gè)二進(jìn)制位; 若分成 4 個(gè)一組,此處即為 4//括號(hào)中的 (3) 是組內(nèi)所有位都為 1 時(shí)的值; 若分成 4 個(gè)一組,此處即為二進(jìn)制數(shù)“1111 b”//例如對(duì)第 2 組 bit4、bit5 清零a &= ~(3<<2*2);對(duì)寄存器某幾位賦值????寄存器位經(jīng)過(guò)清零操作后就可以方便地對(duì)某幾位寫(xiě)入所需要的數(shù)值了,具體代碼如下。
//a = 1000 0011 b//此時(shí)對(duì)清零后的第2組bit4、bit5設(shè)置成二進(jìn)制數(shù)“01b”a|=(1<<2*2);//a = 1001 0011 b,成功設(shè)置了第 2 組的值,其它組不變寄存器某位取反????要對(duì)寄存器的某個(gè)位進(jìn)行取反操作,即 1 變 0 ,0 變 1,這可以直接用如下操作。
//a = 1001 0011 b//把 bit6 取反,其它位不變 a ^=(1<<6);//a = 1101 0011 b
-
寄存器
+關(guān)注
關(guān)注
31文章
5250瀏覽量
119193 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7575瀏覽量
134020
原文標(biāo)題:C語(yǔ)言操作寄存器的常見(jiàn)手法
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論