我是老温,一名热爱学习的嵌入式工程师( K" |1 }3 Z4 E; O* {
关注我,一起变得更加优秀!' I, Y$ l! n1 p1 E& C0 q
我们在编写嵌入式 C 语言应用程序的时候,通常都需要对寄存器某些位进行赋值操作,一般会用到 C 语言的位操作方法,以下是几个比较常见的例子,分享给大家。
9 {$ B, Q ^$ S" L P/ \1 X2 k+ z! \# D% n* O
寄存器某位清零& d5 l( e: S" } Z
8 T O' A: Y7 i4 x d( Z0 p
假设a代表寄存器,且其中本来已有值。如果要把其中某一位清零且其它位不变,代码如下。
" k) H; Z" n$ W7 R3 \. g//定义一个变量 a = 1001 1111 b (二进制数)unsigned char a = 0x9f;//对 bit2 清零a &= ~(12);//括号中的 1 左移两位,(1//假如 a 中原来的值为二进制数:a = 1001 1111 b//所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b),//经过运算后,a 的值 a=1001 1011 b// a 的 bit2 位被被零,而其它位不变。; j2 R- R0 [% o
, G# [* B9 K3 n" D+ N9 X寄存器某几个连续位清零: M4 e: k6 V4 g5 }* M8 R L* U
( \$ d! m- h* C6 z9 F由于寄存器中有时会有连续几个寄存器位用于控制某个功能,现假设我们需要把寄存器的某几个连续位清零,且其它位不变,代码如下。5 d2 {+ A9 ]0 D* M Y% i# s
//若把 a 中的二进制位分成 2 个一组//即 bit0、bit1 为第 0 组,bit2、bit3 为第 1 组,// bit4、bit5 为第 2 组,bit6、bit7 为第 3 组//要对第 1 组的 bit2、bit3 清零a &= ~(32*1);//括号中的 3 左移两位,(3//按位取反,~(3//假如 a 中原来的值为二进制数:a = 1001 1111 b//所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 0011 b),//经过运算后,a 的值 a=1001 0011 b// a 的第 1 组的 bit2、bit3 被清零,而其它位不变。//上述 (~(3//括号中的 (2) 为每组的位数,每组有 2 个二进制位; 若分成 4 个一组,此处即为 4//括号中的 (3) 是组内所有位都为 1 时的值; 若分成 4 个一组,此处即为二进制数“1111 b”//例如对第 2 组 bit4、bit5 清零a &= ~(32*2);
: m" I2 ]8 N+ [) }( C5 f( y+ W8 N$ q; X& y! ]5 b" i9 h |+ ~
寄存器某几位赋值4 D, C9 Y/ G5 Y. b8 W: s5 {
6 ]3 M7 p2 h$ D- Q
寄存器位经过清零操作后就可以方便地对某几位写入所需要的数值了,具体代码如下。3 D6 T) K2 m9 j7 s3 S
//a = 1000 0011 b//此时对清零后的第 2 组 bit4、bit5 设置成二进制数“01 b ” a |= (12*2);//a = 1001 0011 b,成功设置了第 2 组的值,其它组不变8 V0 W w. q" z! Q5 k! p3 S: |
2 t u2 d& Y0 V7 N w. X寄存器某位取反
7 X6 D* E- A: H0 M
: [ L; z8 V. L$ n5 t要对寄存器的某个位进行取反操作,即 1 变 0 ,0 变 1,这可以直接用如下操作。
1 {3 L/ B. M0 O7 [//a = 1001 0011 b//把 bit6 取反,其它位不变 a ^= (16);//a = 1101 0011 b J: M7 j! w/ x6 P
+ L- ]" T$ \) v: {# X) f( G0 n' w
mistltz14a264018989847.jpg
1 D0 @! r8 ?6 v7 a
2 `; u* O% Q6 d/ {-END-# G, n" u7 l7 h/ T# a
往期推荐:点击图片即可跳转阅读6 q) z, |$ H! v
) w5 e1 {2 T' U* c
" Q* v! j7 `% H$ i
+ [# x1 m5 Z; t/ G8 ?% T, `6 x & g+ U- A9 N: v6 t
# }' F) p, F( {9 b0 ?/ U
c3gdabmrhx564018989947.jpg
0 @1 f+ y; q8 h ) [9 h7 X# l# o2 f4 _4 {" P; w
如何设计有缺陷的嵌入式软件?
, s8 s3 G$ B" K9 F
9 l! v* @$ D$ J
& I/ C+ A/ O! F7 d7 r& r
. v9 E1 p4 L2 s# a
" I! n' ]# T+ P$ R& K( V2 o 0 c7 x4 E. @8 T0 r& b
- D" O7 }$ j8 S% d" ~) I
7 Y$ H- F3 F" I
6 [! Y" t# f3 k8 L
; J w5 X5 G7 c2 u1 F5 b
# O+ s" X; B" N9 Q. v
c1f0mxad3bz64018990047.jpg
* n3 Y; Z( |% B1 j! D8 @/ B
+ p4 l& N, u8 V/ P2 F 在内卷中突围,开始学习嵌入式 AI 和多媒体应用技术!
& V! d6 m6 J8 E& }5 P
. m* P- v. ?4 m- {. A ! @! }( e6 D0 ?, b4 d3 ~
; _/ U; T6 v P& D
: w4 G5 j( z4 ^! m( e* w
; Q: ?3 ~8 f- e# _0 L9 N8 W. w1 g* S# ]" n0 J; ^6 A
, W' k/ H) u" N+ q. Z. k
2 a0 V. e$ g& W7 M7 D6 h X1 N
: X" N6 i; W$ G6 U 9 e% k/ F/ `7 {5 b; q$ _% f5 |
yo3aglrfxcu64018990147.jpg
% g+ `# Y8 V% |: M" a9 k ) [7 O& h' e5 `, g8 ^
年龄不小了,如果不干嵌入式工程师,还可以干啥?1 K% _4 J# g; g% u
6 N( Y( x7 g+ M# w9 P" m : n5 r0 v; g# {* Z) t5 h
% ^- o9 ? f1 V # v- S- W ~! ?3 ^' n1 c, ^7 I
0 f3 Z5 X- |8 O! Z我是老温,一名热爱学习的嵌入式工程师
8 r7 U7 b" h# k) o关注我,一起变得更加优秀! |