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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
如下面PIC16F1933为例。# w! g4 Q7 ?( z$ P1 [- d$ q
& X" Z! _( v- ]5 X; V1 I1 ^' T
// Register: LCDPS1 V; |. `% e  ]; M3 Q
// LCD Phase Register) T2 e. A5 A/ T5 y
volatile unsigned char           LCDPS               @ 0x792;
+ o" |- q% x. [- H4 j  R7 Q// bit and bitfield definitions6 Y9 c/ S. Q5 z; W- ~' |
// LCD Prescaler Selection bits" X( n# h# S! V8 s: t- J
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
9 o. d+ V; w( u. h9 ]: d/ b4 D// LCD Prescaler Selection bits# T& J$ W  V/ M0 V+ K. H+ P9 Z7 l
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;
$ @% x+ H1 H) v0 ^// LCD Prescaler Selection bits2 Q7 b$ j; O* \7 v
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;
. a0 ^! c% w8 G$ A  J+ P// LCD Prescaler Selection bits
0 P: [! ?& P& j; Fvolatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;2 q/ a# m$ ]& f9 u, K# v
// Write Allow bit' N1 m0 }6 U* K5 G7 g- G* P# t) p
volatile bit WA                  @ ((unsigned)&LCDPS*8)+4;+ t. r/ \4 O! M" E' a4 |
// LCD Active bit4 P8 c" m- I3 V; z
volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;* X) W# @8 P. p  _% A
// Bias Mode Selection bit' W. X4 z- O# ?, d) |
volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;
! s' s) E. A$ o* ?// Waveform Type bit5 J) c2 l" v: |! a
volatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;
6 w, ~9 _8 x3 u' I#ifndef _LIB_BUILD1 i* t5 p8 \  K; M
volatile union {! e; L- _- n' x
    struct {
' |' n4 R/ h2 C1 H        unsigned        LP0                 : 1;8 ~: n, n( Y* U1 F
        unsigned        LP1                 : 1;. |7 f: p; _  P- T& K- w# p
        unsigned        LP2                 : 1;
* j7 Y0 F1 B0 e& B; S% d; M- |        unsigned        LP3                 : 1;0 Y) [, @6 U' }) b
        unsigned        WA                  : 1;
; q# x2 ?2 [$ D: {' z, I        unsigned        LCDA                : 1;
$ w1 H$ _4 w# J3 j% M$ x        unsigned        BIASMD              : 1;# |1 b2 g! c4 s- d: P! v# D
        unsigned        WFT                 : 1;. R2 p: _+ ~. U( q. n( g3 q
    };
  q7 x3 p: |3 X1 [! I* N! F    struct {4 u7 U" j& O0 f7 I$ f' [
        unsigned        LP                  : 4;
1 C9 `, R% v8 g0 a4 ~; R' T    };: l& `& s5 X1 O$ k% c
} LCDPSbits @ 0x792;
! e3 k9 e- n' A! }#endif
' ~; g  o7 t# h$ n$ E4 R5 _' A9 {1 V: Z% J5 Y7 J9 B5 |  i

! U1 t6 }! j4 u+ ]) m! i' j9 n, p& _, u+ ~
疑问:7 l) ~* d5 ~' i$ O6 K$ `& T
1,+ l" @1 u/ S0 e9 M4 p4 F
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
$ }% f" J2 U7 ^) c# |这里的 @是什么用法 ?* g8 b, v+ r- X$ @
2,
7 n: l8 [5 l2 ~% Uvolatile union {
% j& A( Q* L6 d7 A) @" A    struct {- v, u  n. X# r0 o& e
        unsigned        LP0                 : 1;' t. V8 Z1 L2 @4 f- G' z/ D- ~

! V2 a0 Q$ E2 \, `7 I+ w3 p这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?4 f3 Q; z+ t& g+ A& L8 O' V
3,
* |* l! J9 I3 @2 ]还有LP0     :1 ; 是什么意思呢 ?
7 o3 D! }& b/ ?5 R- m0 ^+ P+ S! t2 X# q  Z
求指教 ?

该用户从未签到

2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址
0 w/ D+ e# w/ N& m, p(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。. S8 n" z' d0 z, ?" @  s
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792, q4 B' m, _5 X- b3 }3 j; }# z

1 x8 p: u  |4 c5 Z! N. g9 @. evolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0: L: \9 x+ j3 m) L" f) p. h
4 m) X, d% T9 V5 ?* D
volatile union {4 G- ]9 }$ r& K  J! q5 X
    struct {
' G  O0 s4 e1 y! }5 P        unsigned        LP0                 : 1;* R) T* I4 B6 G' r1 {. d0 W
        unsigned        LP1                 : 1;" m' c/ u! D: l/ h% w
        unsigned        LP2                 : 1;
% n, }, y6 O3 O; ^" z        unsigned        LP3                 : 1;( \2 L3 n5 }: `  F
        unsigned        WA                  : 1;
- h3 G) o: `! F! Q& d        unsigned        LCDA                : 1;( {+ a7 F  E. q! k6 J8 ?
        unsigned        BIASMD              : 1;
( J4 R% R* V, t4 L4 `. ]        unsigned        WFT                 : 1;$ y2 \0 f, N/ ~, l7 J2 v! X
    };
6 z. }1 o! P5 X# f6 S) z. j    struct {. m& S7 f8 \6 [- Y$ n
        unsigned        LP                  : 4;
/ o  k3 m4 a: X! T! Y$ u: i    };
  Z: s3 ~8 v8 [  |3 k' b} LCDPSbits @ 0x792;
" z; |3 P! z! Q3 j这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
: E+ `/ j! k, R1 L7 ?4 y, P里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义
* z0 Y2 C+ q2 S4 G4 w1 T" o
! o, ~' Z4 h! q  [1 p3 t( Uvolatile union {2 L( I! @2 l/ {- f
    struct {9 z8 j% F5 b( E5 B* c
        unsigned        LP0                 : 1;6 _" C8 V! y8 _7 y  `8 d6 j! M
        unsigned        LP1                 : 1;
* r8 a) V  e- D! I" g        unsigned        LP2                 : 1;) y; b1 A7 S0 Y6 q8 \
        unsigned        LP3                 : 1;: \" V% ~. ^. ?0 w
        unsigned        WA                  : 1;
( _7 l7 B4 l. G6 B8 B% H7 o        unsigned        LCDA                : 1;
6 ?# A) u& X' X3 ^* Q4 F- P        unsigned        BIASMD              : 1;0 u% M3 I' s+ @
        unsigned        WFT                 : 1;7 A' r3 f, q0 f3 o0 C
    }a;
4 B1 y7 t4 K2 f2 H; k    struct {; M5 S0 m; N, \  n% W+ n" `
        unsigned        LP                  : 4;7 X4 F; A! a/ _* V
    }b;: |" V3 h5 ]5 C% P% F
} LCDPSbits @ 0x792;
/ Y1 R2 G- Z$ X" s+ h: i& I) ^0 _那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。
; ~, P- ~" V0 t( H- f5 [LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
$ w6 M, h% |2 `, u- P1 M8 |+ V2 f1 Y+ q% H* p
(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。

点评

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

该用户从未签到

4#
 楼主| 发表于 2016-7-2 14:31 | 只看该作者
liao821 发表于 2016-7-2 14:24$ `+ Q5 F* k2 A! k. ]) n0 {  [3 ]
(1)@定义变量的地址* a6 ^" }9 [: f5 q9 q2 b
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

/ Y8 m+ R7 ^+ }% ^$ E. @5 r非常感谢哈!!!
# f) {9 c  [8 @2 L/ k
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 17:27 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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