找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 87|回复: 3
打印 上一主题 下一主题

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

[复制链接]

157

主题

559

帖子

1216

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
如下面PIC16F1933为例。- @9 o( X) K' F5 U9 J

5 l0 M+ u7 l" e* C5 k" X/ }. k// Register: LCDPS
( c* v2 M& K+ q& E8 I: t) N8 v// LCD Phase Register: z, P$ u+ @, [  U( d) j* K% v$ _; c- u6 h
volatile unsigned char           LCDPS               @ 0x792;
. T, h5 T1 ^  e2 M' o, G// bit and bitfield definitions+ a) ?) U5 y! x- v. r0 `1 y' z
// LCD Prescaler Selection bits
7 |# R% r8 f6 r! e1 |volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
7 L9 F7 x3 i5 {// LCD Prescaler Selection bits. I" T) p; R- n9 l; ?# D
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;6 h6 {$ n" j+ A3 A! s( P1 s4 P( x
// LCD Prescaler Selection bits$ N6 c5 m$ J" X8 h; P
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;
; A) e5 T( c" C: P" I$ [// LCD Prescaler Selection bits) u% L7 ^1 X# P" V
volatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;
& N6 C8 g) [* h' ]$ @& z3 Y// Write Allow bit! p3 y# ]/ e3 u8 `0 D
volatile bit WA                  @ ((unsigned)&LCDPS*8)+4;# ~0 O6 `$ C2 F. e
// LCD Active bit5 Q  M7 j- V' X0 v0 G# n4 J
volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
/ g( B2 t7 s. u6 ^// Bias Mode Selection bit& Y, l: U( {; g* |
volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;
7 |, J7 b7 E5 y0 |6 p  t/ h* V" d2 n// Waveform Type bit
- I6 b$ M" Y; m7 ?; O, T/ jvolatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;
! e" ~6 k  j# z9 F6 r8 K#ifndef _LIB_BUILD: m# L* k  S4 O! `
volatile union {" o! \& e' l) J! V2 ~! k
    struct {
' M' H% ]& J2 V* n  R( B        unsigned        LP0                 : 1;! h9 M, J2 U/ a
        unsigned        LP1                 : 1;
" Q# G* E) C& w  a6 [. ~! K& u/ X        unsigned        LP2                 : 1;! p; P8 D% f0 n9 b
        unsigned        LP3                 : 1;
5 g7 A" Q, J% A+ x5 ?& Q6 C        unsigned        WA                  : 1;8 l5 F  z4 N0 f3 }. \7 ]( }3 ^9 l
        unsigned        LCDA                : 1;# y+ \8 a& \$ k: _$ j; X- N% g
        unsigned        BIASMD              : 1;
9 e6 R7 }8 x5 l9 m7 \  @! U4 c) W        unsigned        WFT                 : 1;5 g+ T+ D* {& R
    };2 s& E. m7 A( [; K1 ]& v
    struct {  p/ l3 @8 {, V
        unsigned        LP                  : 4;- N- B9 N4 r* j2 r8 s, b* z
    };1 M% I: r% S- N" M8 \7 ]$ u1 t& g
} LCDPSbits @ 0x792;  p- H$ {( p0 @7 W, [3 J3 c
#endif! t0 l$ j0 _, c
) a( L% _6 {7 P/ }& ~. n% S) }3 r

$ p2 K% l. }$ A7 C; O- O1 Z2 F! ^0 Y+ y# X3 @( p
疑问:' M; c) J7 T! r* z- P3 W0 s
1,
8 m1 n. s: X  L% p7 qvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
4 u1 y- z( o2 d2 G这里的 @是什么用法 ?; l3 D7 l8 m8 E: F9 T
2,
4 L8 X) M/ t6 {7 U( p9 a6 l/ dvolatile union {
- s- P# V  r: d- {) |    struct {
5 k3 X. [* r: i! X. w7 S        unsigned        LP0                 : 1;
) J  A9 r  m& }0 O8 h: I/ r& h
' k" Q7 d. @4 I. k! m这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?9 E  [$ G7 Q* k7 |: n
3,; a3 p$ a6 F6 }  `
还有LP0     :1 ; 是什么意思呢 ?
. e, n: `$ g2 x5 b- `$ P! L' R4 G. v/ z; }' n
求指教 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

169

主题

582

帖子

1242

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1242
2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址
2 b1 b% g, y3 L) u4 s0 i; q(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。
! J. D5 r. c0 J1 W! [# mvolatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792# P3 k4 ]+ A) e* \4 }3 O  c" }' R
: m0 u3 b  r* ]3 g- l: g
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0
* y  \3 Q$ h: k6 o1 L8 d$ A( S( E# Q& m* w
volatile union {1 \0 j. h/ r7 @% Y
    struct {1 `- V; I% G- Y* r3 B
        unsigned        LP0                 : 1;- w: o* u5 u- {& \& _5 s
        unsigned        LP1                 : 1;  m* o2 D" t3 i6 U. ~: E0 v) ]  B
        unsigned        LP2                 : 1;+ M. e8 J& F# N7 S( n
        unsigned        LP3                 : 1;" I. S" t; |4 h/ C% x
        unsigned        WA                  : 1;" e' V  ?' C: x8 u) ^" U
        unsigned        LCDA                : 1;( H# a* T% K$ S8 Z
        unsigned        BIASMD              : 1;% X" i" Z4 p' W; I" i1 \3 D  I8 o
        unsigned        WFT                 : 1;  t5 o% A2 y' i* s: ]
    };* b" i" ^+ W  p/ O9 x  r" F
    struct {
' ]. b2 P2 u* ?+ V) f3 |+ E) X        unsigned        LP                  : 4;
& s& I( k6 }4 t7 g    };
9 [: }8 F8 W7 L* a- w+ x8 K} LCDPSbits @ 0x792;
" k( d# r( X, X0 b. y; u6 Q* G这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
0 i+ K3 K% `, l5 p! f" ~4 L  j里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义
- F$ K9 |8 }  {, ~" w! X6 J  ]& W
. ^2 Q- U$ U3 b+ z! mvolatile union {. W3 {3 P; F- s% ~& o# {- w) y
    struct {% n+ e2 l( V: a6 R/ C' \: Z5 U
        unsigned        LP0                 : 1;
8 P- S! }/ _& C  A( w+ ?4 I        unsigned        LP1                 : 1;
; k" I! ^, s6 A9 w        unsigned        LP2                 : 1;
" b2 m8 P) h+ z+ U, Q4 X; I        unsigned        LP3                 : 1;
3 T; o4 c5 }3 p/ ]2 @3 s5 R3 D        unsigned        WA                  : 1;5 p/ v7 V' C1 @* e6 t& C
        unsigned        LCDA                : 1;1 q+ z8 U* ~3 L& J4 Q
        unsigned        BIASMD              : 1;/ P2 h2 O  k0 [/ d; r, L6 C
        unsigned        WFT                 : 1;& _0 }; q; |6 t: y( p
    }a;
0 }8 Q# c5 p. W! `    struct {* m, @+ j& {8 y/ v
        unsigned        LP                  : 4;
" x5 F: _8 k# g+ \) }# Q    }b;
- E# i* ^) E5 G) p, R} LCDPSbits @ 0x792;! f1 r3 ~5 b2 q7 s" K
那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。' |( L# P, ~  b5 E* G1 j6 z: y" e
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
. c6 c3 S9 p5 `4 I7 ]7 s# A  I. y: q: ?
2 ?( _1 K6 z% ~3 W& s8 Q(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。

点评

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

214

主题

642

帖子

1658

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1658
3#
发表于 2016-7-2 14:26 | 只看该作者
非常详细!!!!

157

主题

559

帖子

1216

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1216
4#
 楼主| 发表于 2016-7-2 14:31 | 只看该作者
liao821 发表于 2016-7-2 14:24; M( v* d! T; s) X6 v- c
(1)@定义变量的地址7 c  Z. k9 |7 m. ~! T& R
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

1 g, d$ d- D# ?( F3 S非常感谢哈!!!1 }' \) a, P7 V. Q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-15 21:26 , Processed in 0.057532 second(s), 35 queries , Gzip On.

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

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

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