|
|
(1)@定义变量的地址
) N6 }: |; y: O3 H% r5 U, V(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。
* u1 h+ D4 }9 D4 D0 U- Hvolatile unsigned char LCDPS @ 0x792; //LCDPS变量的地址是0x792
7 `8 Y& M( |6 R* @) ?" U: G: W; _+ x8 |2 m l+ g1 q
volatile bit LP0 @ ((unsigned)&LCDPS*8)+0; // LP0即为变量LCDPS的 bit0
( g$ C. Q' \$ q: E: _: I/ a8 m
# J7 B- N/ a* N% ] Q: _volatile union {
4 F6 I* o7 r |; S struct {
9 [' u/ _6 a/ H unsigned LP0 : 1;) c6 S" m( J' ^( a' o
unsigned LP1 : 1;
* k4 N6 I; o: }2 t9 ^: O unsigned LP2 : 1;
( e* k4 d3 c1 f; F" y: H! } unsigned LP3 : 1;
" g G. K" ^- E$ S: a$ @( ] unsigned WA : 1;6 z/ p i8 ^/ `7 {8 d. {, \4 }
unsigned LCDA : 1;% a7 q# D7 L& H
unsigned BIASMD : 1;0 Z, B& D8 w! b
unsigned WFT : 1;* \4 L3 t5 ]& c/ m
};
! c, f! q$ W- J) B! o9 V struct {
4 v6 A* K2 k9 g! \, W( |" h unsigned LP : 4;
( J# W. Y4 h! z: i };
0 W" n0 }- @( [} LCDPSbits @ 0x792;
0 C$ h6 u, z0 g这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。9 X- Q, E2 O( o* a! Z; T
里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义, X8 |2 N6 _, I) A- z2 i) {
# k7 O( J6 P# ?+ k5 |" R
volatile union {
$ e4 p6 _( r: |7 Q struct {6 X8 S1 g* w. x4 t$ r* C3 c
unsigned LP0 : 1;& S" i( `+ f) F. ?7 K
unsigned LP1 : 1;
) L1 @( N4 ^4 n, ]$ E9 l* L unsigned LP2 : 1;3 P% s$ q; A h6 v9 Y9 B/ D
unsigned LP3 : 1;. I1 O5 {" d1 Z2 s5 {8 U1 f% Z
unsigned WA : 1;
4 H' P+ R3 k1 L1 G1 p% g unsigned LCDA : 1;
! L" G4 E8 l, J/ q, t w unsigned BIASMD : 1;# n: T. D. z& `
unsigned WFT : 1;
) ^) l3 j* m8 }6 H }a;
( m- C$ v5 T( S" N' `, W/ v struct {- B# n: P. Y4 d% N/ O6 ?
unsigned LP : 4;5 j& j1 H& y6 d2 ]+ _& c
}b;
. {- G3 F8 V1 i} LCDPSbits @ 0x792;; Y8 n5 W& \$ M0 F' X! [
那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。. z5 g$ a6 z# I- p
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
0 E, [( j$ k( t2 W0 k' ]0 {0 z/ q, v. P, }
(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。 |
|