找回密码
 注册
关于网站域名变更的通知
查看: 455|回复: 3
打印 上一主题 下一主题

PIC 单片机在特殊寄存器定义 C语言 语法问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-7-2 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
如下面PIC16F1933为例。  G. N( j" v' R5 T

7 w+ C) I3 k9 X// Register: LCDPS
, n( d! f  B6 z// LCD Phase Register
! z% C7 c7 Z0 Y/ i! o* Svolatile unsigned char           LCDPS               @ 0x792;
/ [0 g- O. t& R' z  T% b8 I- z// bit and bitfield definitions0 r; e& g8 ^3 F  H" u/ {
// LCD Prescaler Selection bits; a1 l) U% @! u. e1 i
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;) F9 X" Z1 v0 d0 G8 f4 d
// LCD Prescaler Selection bits
) n% X1 _1 T/ z( @; Ovolatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;
+ C. `0 D6 f5 G7 _8 ~" [// LCD Prescaler Selection bits0 d# l0 u4 x: s: |7 l0 D5 v  H
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;* K, `0 Q1 n, z1 T
// LCD Prescaler Selection bits
0 _/ m6 C1 H9 S* q5 i! r$ Avolatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;
" W6 S0 L; [$ V0 L; \: c3 q6 |// Write Allow bit4 N5 i8 H9 O" F. C
volatile bit WA                  @ ((unsigned)&LCDPS*8)+4;, B; L; S4 k& q! w, x9 a- L. }
// LCD Active bit, R- D* Q& v  g  ~- e9 w3 z$ @
volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
% I% ?1 Q2 e* h! ^$ |// Bias Mode Selection bit
' e$ T  C3 J3 L; o1 l8 N7 Tvolatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;
7 w8 A4 V" E4 {  F( H1 y- K! M// Waveform Type bit/ o! y  E" I/ K) M& V# M8 w% f$ b
volatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;/ X2 ~9 O8 c- B; V$ k
#ifndef _LIB_BUILD- t4 k5 t( e! Q1 I/ E; R9 i
volatile union {
; D1 Q7 V, Y$ B: V% C    struct {) j1 }* o: l( j9 C! n3 v
        unsigned        LP0                 : 1;8 b  ?0 r$ ]2 e4 s) u
        unsigned        LP1                 : 1;6 V9 f( A. I6 S7 j$ `! n
        unsigned        LP2                 : 1;7 S- V  F2 c9 }! I0 ]3 Z5 P
        unsigned        LP3                 : 1;
& m& a9 x" p, v# w- P( r5 V        unsigned        WA                  : 1;
# D8 C+ J4 l/ q  F) |* M        unsigned        LCDA                : 1;
# G7 h2 H1 `  e+ R* i        unsigned        BIASMD              : 1;
: q& T5 X/ H5 Y8 y% j        unsigned        WFT                 : 1;2 F  X1 w/ W/ ^" d
    };7 @1 Y3 e$ h6 h; {
    struct {6 B! a5 P1 X) x3 M1 N
        unsigned        LP                  : 4;
$ O% A  ]  K  X' |    };
; N) l8 k& _* c- ^% v} LCDPSbits @ 0x792;! Z$ I5 B9 y' A# M
#endif
6 U$ k: f4 l1 M; n! V- J2 L  P. n7 ^( t! v$ l0 S* h! ~0 Z
2 `/ ?$ d3 ^- T9 P' [* E! q5 C# N
5 \% r4 \8 s+ h$ @
疑问:) o7 X) R$ V; f) D. q, ~, w
1,) j8 b3 U0 e" q5 l/ [: g
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;/ ~) C2 t2 ~6 b0 s( a$ Y5 d# T
这里的 @是什么用法 ?
; R' |% z/ O# W) V) M% y- J$ ?2,
' Z$ t3 f& y6 f* R$ F7 `$ ^8 yvolatile union {  C8 d' e* a3 q' D7 v
    struct {) O2 x3 S1 d5 H4 w' v4 n
        unsigned        LP0                 : 1;! p1 q- w4 |3 ~& ^6 @  R0 g( m

& \- N  b* M# l, a% A, H9 [) c这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?: e) [/ s0 }7 L9 h
3,, w: ]7 p* q& e% l1 s
还有LP0     :1 ; 是什么意思呢 ?
: F2 L. `. T- b! D% E/ @: o; p
0 x+ Y9 N- b: u$ B求指教 ?

该用户从未签到

2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址
2 ~, S- _& y% y5 ?' ^7 z% u6 P(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。& A" J7 F1 a- a) Z2 y" a
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
0 g7 k7 s4 x# h
( V6 {) I( I) s. j0 Y. Yvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0# b( y% E( T1 ~+ Z
% K8 ~( l/ |# d+ l% e# p
volatile union {
2 O1 ~) H# \5 c6 x: P6 ~    struct {
9 Z- v0 o) B1 s+ a) z& ~        unsigned        LP0                 : 1;
, u$ z; }) j( d, W; D  i        unsigned        LP1                 : 1;
* X2 C  u' G$ y2 W  S' M% p        unsigned        LP2                 : 1;
8 N) |* b9 o. d3 ^        unsigned        LP3                 : 1;. w4 L+ b$ k4 }) ?* U2 U# T3 m
        unsigned        WA                  : 1;: R/ d) P  ?: z5 z5 W2 N$ w- h( z
        unsigned        LCDA                : 1;* [( J5 k& f9 K
        unsigned        BIASMD              : 1;; f, i" b$ E% O' b/ t) B! i0 g+ X1 ~
        unsigned        WFT                 : 1;) Z/ a8 l8 x0 J; }$ {
    };/ M  k+ J7 w& z" I' A4 Z5 J& j
    struct {/ e( H; z+ f7 N! L
        unsigned        LP                  : 4;
) A, c4 C9 X6 s    };
3 r3 E/ l! `- d, P" F; C$ @} LCDPSbits @ 0x792;
( Z: U1 D( U9 \8 f这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。$ I; ~7 W" \  i5 w. Q) L# o
里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义3 J# \/ i2 x' i  f

0 ~( }- ?; i) Q0 D8 G+ X, evolatile union {
; C. O2 I. h2 l. p) |9 m    struct {
/ e9 m" r) L' {- ~: Q        unsigned        LP0                 : 1;; P( b/ d4 F4 r1 X& w
        unsigned        LP1                 : 1;2 ]: v" [, o$ }# B" H6 b+ j% o' v
        unsigned        LP2                 : 1;2 R  ]; L5 @& X3 o
        unsigned        LP3                 : 1;
* p3 R2 U' k. b8 K0 }: g        unsigned        WA                  : 1;
2 S& t! W# b8 I) a        unsigned        LCDA                : 1;
: u: e) `1 Z$ J5 f5 o# n        unsigned        BIASMD              : 1;0 e" _) N' {) h5 k8 t2 N$ M
        unsigned        WFT                 : 1;. Z# M% `1 o" M! d$ X* K4 a7 P* F- a4 Y
    }a;4 x5 a' H3 r9 ]1 V
    struct {
0 T  |) n) Q/ m; R        unsigned        LP                  : 4;9 ]' g5 f7 b4 t3 G' q( X, a! v% l2 G
    }b;
# B* H0 ^) u) e( u" D4 m} LCDPSbits @ 0x792;
7 F0 Q: i+ x) c6 o5 d那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。' C  d0 k3 j2 S" ~. e- {# K7 d4 ]  Y
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
8 c% K% L; v4 W& `6 S6 V* f. X3 o, }  v% ]6 J) K
(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。

点评

非常感谢哈!!!  详情 回复 发表于 2016-7-2 14:31

该用户从未签到

4#
 楼主| 发表于 2016-7-2 14:31 | 只看该作者
liao821 发表于 2016-7-2 14:24
0 Q! K/ [, ?  `' x! h3 ^% ~(1)@定义变量的地址, z' r; u; O, @, e9 \, c+ L7 ~( p
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

: V: _0 d. Y- c) L' w# Y, Z/ w非常感谢哈!!!5 n9 k" k  h! y+ U5 e8 c$ O( Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-6 18:59 , Processed in 0.156250 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表