|
(1)@定义变量的地址4 k2 M4 g R4 V! ]5 }+ Q# S9 O
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。: x/ l/ a' T! a& ~0 f r, J3 ~/ F
volatile unsigned char LCDPS @ 0x792; //LCDPS变量的地址是0x792
0 A. Y" c, e6 H7 [8 W8 g* r# | {7 l/ Q, z$ x* y( b# R
volatile bit LP0 @ ((unsigned)&LCDPS*8)+0; // LP0即为变量LCDPS的 bit0
6 D- u" _& u% N% p' v" M$ d7 w9 ~# K4 Q9 R
volatile union {
& f9 l' v$ K% ^9 Q+ x$ H struct {
5 L- B2 {) A6 q4 r3 ^$ Q7 h unsigned LP0 : 1;
1 M' n% Q+ ~" F* [ unsigned LP1 : 1;
4 |1 F( B* J4 ]4 v' s" m$ u! j1 | unsigned LP2 : 1;. ?3 L1 l% c: d7 q
unsigned LP3 : 1;0 h" \; K/ n& I# D
unsigned WA : 1;
/ k, W$ n1 M5 W unsigned LCDA : 1;1 B6 k* Q A) a9 q% U# d, M: m
unsigned BIASMD : 1;
# B1 K) C: n, \$ D unsigned WFT : 1;
4 w R) o) ^, j7 S9 S' f0 S' F. [ };
( ?4 c# f: F" B5 K5 z, ^2 W' {" n% f' e struct {
: @) |5 M$ ?0 w+ i; S$ p, o* R4 ] unsigned LP : 4;
$ G+ p- a7 y9 T! B/ i7 z0 b };
) L5 `3 H# |* a& v- n! ~- E} LCDPSbits @ 0x792;' j+ ^ b9 r/ [* s0 r
这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
8 A, A( i2 }! m% ]4 [里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义. p* k! H0 c. s b' n8 y% N
- _8 ?5 {0 X# S: Kvolatile union {" T: }: ~# n/ j3 M s
struct {
6 C+ ?4 W/ a. x& K9 } unsigned LP0 : 1;
! k* t- F' ?: d unsigned LP1 : 1;9 E. S5 a" a2 `" B* [
unsigned LP2 : 1;
{$ S' N0 E4 p, j/ q( Z unsigned LP3 : 1;1 m6 R; P: }! {
unsigned WA : 1;
8 R& w8 S: `$ |% }( ?) w unsigned LCDA : 1;
$ ^, ]; ?$ d( S: c unsigned BIASMD : 1;+ T5 q: c" Z3 {9 L8 }" e; t" R
unsigned WFT : 1;( D5 O" T3 M4 R5 Z! L* ?
}a;
' z$ R5 O$ O. w struct {% M6 p. Z% J* \& d" R5 q- b h
unsigned LP : 4;' O, U; O' b4 L$ Q4 c8 u0 k
}b;
9 }' n9 c8 u- e3 l} LCDPSbits @ 0x792;
* x3 z1 x1 k. W; B4 x1 t3 P1 |那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。
! o) c% ~& T+ { i- S+ T4 [LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
Y+ }% K/ O, n& L
$ |$ j4 |3 ~+ i6 L4 S(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。 |
|