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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
如下面PIC16F1933为例。
/ a! @! K5 k, j! k+ D$ r8 o9 [: m1 L( q  h/ e4 A
// Register: LCDPS
( u) n# o7 @) A// LCD Phase Register
$ c& J  Y4 _9 @- `! v4 i! ivolatile unsigned char           LCDPS               @ 0x792;
3 H* [1 @! q) l- E// bit and bitfield definitions% k0 O. C# \0 Q8 K
// LCD Prescaler Selection bits
) F$ f& P7 V: J$ Z& h  f! |volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
" s- h1 c, ~! Z8 a& s3 ~) V3 w9 H// LCD Prescaler Selection bits& h8 ^* H1 O: |( Z
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;" ~( O( L  l% T7 Y
// LCD Prescaler Selection bits2 Y9 y( N( Q6 R( P9 V
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;, l0 Y! Q1 P/ a9 Y1 C
// LCD Prescaler Selection bits
- N: f# H: r8 ^3 }* lvolatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;, m. q5 E  U* n% K% u+ @
// Write Allow bit! x( j( ]+ G. E
volatile bit WA                  @ ((unsigned)&LCDPS*8)+4;5 w; S: B+ D- j1 D5 ?
// LCD Active bit
4 T* k0 M# h2 W2 Pvolatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
3 ~6 h2 q$ k* H7 B4 G$ r/ j// Bias Mode Selection bit! C% P" O3 s8 X. g- s$ l
volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;% C% o9 \! J/ D
// Waveform Type bit
, T) j* ~8 A1 Z' u9 N- A! h& \volatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;& L; i, |5 O0 }6 A* h
#ifndef _LIB_BUILD
4 s2 L& s# E3 C4 E# ~volatile union {/ F7 D. }6 D) Q2 W  h1 K  D
    struct {; `. R9 j4 p. r4 n9 C' I
        unsigned        LP0                 : 1;) Z9 g& J' f$ a  j
        unsigned        LP1                 : 1;: g  \1 [1 E: a; @
        unsigned        LP2                 : 1;' E" O* K8 y/ ?8 w
        unsigned        LP3                 : 1;
. A" e4 _' o1 @' a! t+ ~        unsigned        WA                  : 1;
+ D" C  M9 v# v& q: m, I        unsigned        LCDA                : 1;
* C6 M6 e6 v2 k5 A, n" u* q3 J        unsigned        BIASMD              : 1;
3 L/ y' a! M1 N+ Z0 H, u+ {        unsigned        WFT                 : 1;
1 S1 A6 [* Z- _% H) g" p    };
( F$ R& F  A4 P" X  E- _4 R    struct {0 E5 t: k, m. p2 g# H- H& u; o$ B$ M: u3 T
        unsigned        LP                  : 4;/ H2 k; G% C- Z5 ]
    };, s# f; r4 ~  T! N
} LCDPSbits @ 0x792;* j4 X! }/ u: i6 L# u
#endif
5 i' f  |, \% B7 H
8 o( t* k( b6 Z3 f3 F
$ K5 a: v0 W2 |, G* g1 @& k0 a3 T% d' G) F- u: r5 N
疑问:
# B5 S: j* b0 L1 ~& d3 Y8 k5 G1,  a) q. n* d* P3 T/ i
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;9 G# Z) L9 Y0 q( t2 O$ H
这里的 @是什么用法 ?
" C$ v4 {! m- R2 f- [0 r2,: Z4 P' K4 v; x0 S# a- A) h
volatile union {
1 ?/ m" Z: _; n$ P% u# U1 E5 P    struct {/ G! e7 t& {: n+ q
        unsigned        LP0                 : 1;
1 c6 J( [0 ]  t: K, y, D3 @5 Z; O! P0 f* z" f- ?/ i3 B7 L- P/ c
这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?
& P4 c7 D7 m# b8 p3,8 d$ }* H$ T3 E$ Q+ l3 x- D
还有LP0     :1 ; 是什么意思呢 ? ( O8 ?6 M% e1 ]* g2 Y3 c& i, a$ ~4 l7 p
1 Q3 L: \0 l+ W- q" C$ f( m
求指教 ?

该用户从未签到

2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址
) I# Q: C% L" w8 a/ i4 z(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。& o  S- x: H  P- |" b& Z
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
4 T5 r3 _% w# G! t! w
5 I0 O* Z& n9 r2 e' B. W+ e1 ~volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0. _+ J) I# A6 r/ |6 f8 ]& y
2 ^5 s% J# R" _
volatile union {
/ W% f$ c% V( ~- E8 u- P% ~. Y+ ]    struct {
! t0 K( l$ B4 L  g" g' C        unsigned        LP0                 : 1;% R3 Z0 _$ `6 P% l5 c* F
        unsigned        LP1                 : 1;
2 E) k" L( K; U' W1 Q        unsigned        LP2                 : 1;
7 Y; @# }1 `5 q4 Y( O" ^        unsigned        LP3                 : 1;; @. c$ T# ^* i1 e
        unsigned        WA                  : 1;* G8 u. {4 x6 j3 Y
        unsigned        LCDA                : 1;# A0 i1 p7 ^7 x
        unsigned        BIASMD              : 1;
; C' L4 l( b) B2 a6 R        unsigned        WFT                 : 1;6 Z. J1 A6 [5 ?
    };
$ o/ u6 G4 y# k2 g0 o    struct {/ L0 U  Y( I! m8 a
        unsigned        LP                  : 4;3 h4 o! h; c' r) [/ @$ B
    };) e9 w. [6 _0 {: C. ^1 }: T* j
} LCDPSbits @ 0x792;
2 h& m7 M9 z  \* [; a0 r这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
: c+ \  X- o& ~! J里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义
- O" |5 v; A. C8 H0 e
) o' C7 j8 y4 J3 x$ u$ T4 `volatile union {7 r; N5 G9 I5 x! M1 K+ C8 H6 j
    struct {% G2 r$ N; y7 }1 ~: q0 A* U# ^- }' ?
        unsigned        LP0                 : 1;
2 j$ J( A6 [) s- c+ i        unsigned        LP1                 : 1;& N2 h/ h4 h# J+ O9 F0 U9 x# k
        unsigned        LP2                 : 1;
, \+ C; L2 H3 ], y" G7 P        unsigned        LP3                 : 1;
4 }7 g% C! o: b: w$ i0 ^, U" y2 |        unsigned        WA                  : 1;/ ]. X2 O, p1 l  x
        unsigned        LCDA                : 1;
, @1 L9 e5 w$ P& `/ J5 q9 V( z        unsigned        BIASMD              : 1;
" }' @) S( Z+ d5 U        unsigned        WFT                 : 1;
6 c$ s, \5 P( V    }a;
% E$ i2 ^, q- B    struct {1 ^& b) W- A5 T5 [
        unsigned        LP                  : 4;/ f8 M/ X* c! a. V' `
    }b;
- f. P9 Y" v; e} LCDPSbits @ 0x792;$ d( F2 m/ k) v$ P6 _
那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。5 ?* z% F% c: I* p4 Z1 A4 U
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。7 J/ x/ R6 G% T$ [) P  P

8 f3 z' r) n' s4 t1 j+ B(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。

点评

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

该用户从未签到

4#
 楼主| 发表于 2016-7-2 14:31 | 只看该作者
liao821 发表于 2016-7-2 14:24( {+ L/ a, O; _6 u0 c
(1)@定义变量的地址
% ~- C6 Q7 G) o0 A- C(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...
4 u" S- k( m" s/ o' `
非常感谢哈!!!
: I' u* `* `$ r  v8 }' p3 w. ^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-11 17:30 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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