EDA365电子工程师网

标题: PIC 单片机在特殊寄存器定义 C语言 语法问题 [打印本页]

作者: 85486952    时间: 2016-7-2 14:17
标题: PIC 单片机在特殊寄存器定义 C语言 语法问题
如下面PIC16F1933为例。
& C1 ~0 K3 U. L# o7 j/ x8 u
- \6 `) F  X0 Q0 L9 j! a9 p, j5 U// Register: LCDPS' v  U! F6 g6 J$ m: l! r
// LCD Phase Register# M; Q/ A9 w( p/ ^
volatile unsigned char           LCDPS               @ 0x792;$ e1 D7 ^9 l1 K
// bit and bitfield definitions
3 b, D7 Y8 t+ Y+ O( w) h// LCD Prescaler Selection bits
; ~  D' [8 O7 b! Avolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
* Q2 V9 \: Z/ n# d$ A8 l7 `5 T9 S// LCD Prescaler Selection bits% X+ n) N- k8 J' t
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;
  _! r) N& V2 G7 d- J( l// LCD Prescaler Selection bits
  F1 I9 U; M% c: S2 @volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;
# S9 @# t+ e. v% a. K// LCD Prescaler Selection bits; h( j7 C0 K% M0 @
volatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;% M- e5 o/ h# r( c# F! V
// Write Allow bit
, g6 ?4 p: _# U' P; A- vvolatile bit WA                  @ ((unsigned)&LCDPS*8)+4;2 Z* E+ z4 N; I5 j  x
// LCD Active bit
# r9 k# o7 H" C7 Y1 n2 a+ L- Cvolatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;& ~1 v4 K$ N) D3 c# H0 R7 X
// Bias Mode Selection bit
! f# T, z8 W8 K( ~. o! ?4 Z  Yvolatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;) X9 w0 s, R6 {& g6 N7 L: n, J0 p
// Waveform Type bit: U% y+ c* M5 p3 I% r% _+ H! ~
volatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;
% e) B* I; F% X; X, f#ifndef _LIB_BUILD
, k4 Q+ y2 E+ a  Y3 }. C, O5 N4 {volatile union {
4 P4 E/ `" |% P+ V7 d    struct {
5 U7 ]+ q2 T. G4 s, b: \0 `6 f# k! s        unsigned        LP0                 : 1;! c+ q! k6 m# v
        unsigned        LP1                 : 1;' r6 \: d' Q: X: y! b! Y" z
        unsigned        LP2                 : 1;
7 V2 I5 Z) |( @, `4 ^        unsigned        LP3                 : 1;8 f! k- L* w7 h' ]# v
        unsigned        WA                  : 1;
, l5 d  R, i$ y" X        unsigned        LCDA                : 1;( C+ @( G7 [7 R! O# z
        unsigned        BIASMD              : 1;
. U5 ]9 k$ z, X4 l        unsigned        WFT                 : 1;
! c" Q: G7 h# A/ w4 y    };: |6 s. `* a/ R5 U
    struct {
* U. p; T. V* Q3 \' b! B        unsigned        LP                  : 4;
( Q  c  k6 C0 _    };% Q7 i( B5 f) C* ?8 N- ^9 o
} LCDPSbits @ 0x792;
% l- O" V  I6 S" q$ z( s& \& a, V#endif
, T4 m: i! [2 R. s' v2 j0 A) q. h) O. n+ K) b. {3 t
, f; K) z: q8 S3 [: ^/ b$ u/ h, _

/ D0 [. s) i8 e9 G; i/ I疑问:- m$ z" O) z: L6 N
1,8 e& l* u+ W, C0 Y& [
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
% P& ?+ S# x8 K2 h# H% \这里的 @是什么用法 ?
: R! ~* J: q$ J3 O2 C! D- X  ^5 N6 S2,
: B2 v$ G9 R; @1 j$ G9 qvolatile union {
3 Y: ^0 b8 h2 ?8 q& p* N    struct {
7 J) C  \- w# L: \  A0 |        unsigned        LP0                 : 1;  c, a8 T9 n: f, O
9 ~' G# ?; O8 S- @4 F
这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?% y7 w$ _, R6 {4 M; T9 I. n( S
3,
$ y( t& |% H6 r. _* o还有LP0     :1 ; 是什么意思呢 ?   x9 ~7 t$ E. A5 Z, G# P
, c9 P2 g# f+ \' P
求指教 ?
作者: liao821    时间: 2016-7-2 14:24
(1)@定义变量的地址1 F4 T% V2 @! s2 A* ^$ S( A! w+ D# f
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。
4 A( T1 w& e  D, i' {volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792& k# L7 a/ T: A: D
: P; p1 V5 G/ n4 y: m, c( q) Y  d0 @
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0" X. M: W! V/ r2 o

1 V, _0 ]% }! B! mvolatile union {
0 m  F- Z- v3 Y  Y* x    struct {
0 e, T2 h7 N2 m, d; D7 ?; g: s        unsigned        LP0                 : 1;8 t6 p; b' Q, ?* X) e2 C& \
        unsigned        LP1                 : 1;' k" z' W4 U8 H5 ?
        unsigned        LP2                 : 1;- p9 @/ v8 F8 e1 s) d# }
        unsigned        LP3                 : 1;+ |4 e8 T) Q5 K5 d( q- j1 X
        unsigned        WA                  : 1;
$ }7 a/ I; f/ c' y7 S. }" v$ w        unsigned        LCDA                : 1;
! ?3 u  M! u8 w$ V" L/ h# A* _        unsigned        BIASMD              : 1;
* C, ]: C. z& e' }) c- T        unsigned        WFT                 : 1;6 w( @( t+ K) E- ?* X
    };
$ H- W4 m6 g/ t    struct {: ?: G8 D1 F( k* t
        unsigned        LP                  : 4;
( u: g: m; G; Q5 n* u4 J/ f    };$ a& F0 r4 a- m7 P2 ~
} LCDPSbits @ 0x792;
& k# B$ t. j$ c% M: C这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
1 D& P3 g, {& s  F1 }" [里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义
' Z$ a( D9 Y' H; n: x- \( w
1 e+ y4 a7 ?- Y1 ^volatile union {6 J0 b! J4 g- f! Y% \  W
    struct {
9 l8 l! @* m1 `  ]: P        unsigned        LP0                 : 1;* Y+ \7 _& i5 W" k+ n/ i& E
        unsigned        LP1                 : 1;
' b3 a4 `( i0 `5 G6 g        unsigned        LP2                 : 1;
- Z9 U0 _# S6 b5 i% G        unsigned        LP3                 : 1;
$ `$ [; F% p7 @7 d5 f& k6 }0 n        unsigned        WA                  : 1;
! ?' K- Y& Z3 p0 J& d  I5 X        unsigned        LCDA                : 1;
# A+ N) r; m0 J: l' B+ @+ x8 c" ^        unsigned        BIASMD              : 1;
6 F. x4 G, g6 |        unsigned        WFT                 : 1;
6 e0 C$ r: u& p$ @. o( A    }a;
7 g/ `, {. Z9 W# K    struct {
; K  F1 X5 C, Z0 K  h* K3 \) c        unsigned        LP                  : 4;
8 @1 [9 \- t$ x2 G    }b;
* Z3 ]5 k5 j! F; a} LCDPSbits @ 0x792;, P6 U! V& A3 T. `$ D4 d& S
那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。& Y& Z# _4 o1 W& E  q; f
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
$ O- p" {( [6 T  ]# x6 n2 I" ~& r; L) }* [5 _6 k; ?5 h" S
(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。
作者: 10929390    时间: 2016-7-2 14:26
非常详细!!!!
作者: 85486952    时间: 2016-7-2 14:31
liao821 发表于 2016-7-2 14:24
: Z7 H+ `! E$ J  I/ ](1)@定义变量的地址: Y8 D) u( R) G" e/ n
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

6 ~" t1 |# V/ J% L; @  L! K4 U非常感谢哈!!!# {: f: s/ o# g0 s





欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) Powered by Discuz! X3.2