找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

157

主题

559

帖子

1216

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
如下面PIC16F1933为例。4 D$ E/ j6 b' e

. I' Q# c' s: f: R+ l% k7 `// Register: LCDPS
2 ^# J% \# Q2 o8 F8 l// LCD Phase Register
$ v* ~" j1 I! L$ |9 w( x8 x8 gvolatile unsigned char           LCDPS               @ 0x792;0 {: u& e3 Q+ e% s
// bit and bitfield definitions
0 K. r6 d& \  N: Y' h: ~// LCD Prescaler Selection bits
. J4 ?, K, ~% Gvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;2 i' s) ~) c& n. A  m. j
// LCD Prescaler Selection bits
' Y1 p- S9 f- K3 q' }" _volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;7 _6 F5 F8 e& }1 [0 O
// LCD Prescaler Selection bits
+ h$ D% G# z" Q" O( F$ f/ Zvolatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;
8 Y; c. j+ k8 y  f. a2 V* X" A# c! l// LCD Prescaler Selection bits
4 x: M. ?* s) j1 T- Lvolatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;& r! q3 v& a7 ^5 ^
// Write Allow bit
1 t/ A/ p: c1 ~. M: D0 Z! Wvolatile bit WA                  @ ((unsigned)&LCDPS*8)+4;' V1 [1 k' _! S, q
// LCD Active bit
( h0 }: h' i- m, ~4 a* {volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
6 i2 ]/ Q2 [9 v/ O// Bias Mode Selection bit1 ^* y2 b! q5 t- y) k: c
volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;
3 B( l2 z9 o6 t4 u$ G" w// Waveform Type bit
+ z9 |3 |/ C; C8 cvolatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;
9 {! K; Z% v% I8 |. |" O9 ^9 P  ^#ifndef _LIB_BUILD
6 L2 I4 u  E6 Wvolatile union {
4 c# U4 x& h* Z. u/ p, |    struct {
: u3 G- q5 S, v/ q        unsigned        LP0                 : 1;5 m; F% ]" c, ?( U/ O1 h
        unsigned        LP1                 : 1;& S' i5 H& v, d% s' W
        unsigned        LP2                 : 1;% G# Z" d, p; }% h+ x( p
        unsigned        LP3                 : 1;
" m( t; k  c9 }4 }5 E        unsigned        WA                  : 1;1 I/ V, {0 y) _9 s; t! T/ t
        unsigned        LCDA                : 1;
* D1 n  Y% C- F* P% Y        unsigned        BIASMD              : 1;
3 q8 A+ U. y, r9 ?1 k7 E        unsigned        WFT                 : 1;
+ \/ m, K7 w) h6 {' r) l! R    };+ C4 _$ Y4 K0 ?
    struct {( J' q) O0 }  @' B. p) v
        unsigned        LP                  : 4;
) E9 p) P& O3 D' G) Z7 q% t: g    };: v4 B+ w2 E* N" K) i! G' V/ A
} LCDPSbits @ 0x792;& l2 {& I8 }. k- F
#endif  @$ l- N6 Y1 y. A2 `1 Y0 ^
: K+ S/ |0 A5 }1 i0 P: q4 h

; v' m6 o2 {4 O4 k, T9 G( Q6 ^9 `& k% b+ F
疑问:
: H8 b. h. f, {+ r" F6 N1,
  r( g$ }/ z3 k  a6 Q8 Q8 avolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;/ d$ t% l0 b& j& u) A1 w! J
这里的 @是什么用法 ?
$ G' J+ ]4 M3 X' _0 K2,! u( R& W. u& }2 n, V
volatile union {- \  P( u  N7 U; w) l4 B4 f: g
    struct {+ r9 R* d7 t( V6 j7 D+ w/ ]" `! r
        unsigned        LP0                 : 1;
! o/ C% c* ^- r1 L8 q" |9 t& }. G& s7 r1 Z5 q) J& m9 J: d
这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?7 \! l% A* J9 q5 L
3,  ?; X! R5 r6 ?9 e2 v* u
还有LP0     :1 ; 是什么意思呢 ?
' F+ n$ Z; U: Y0 _% q# A5 O- M& t! k: v4 ]$ N- l. L' T
求指教 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

169

主题

582

帖子

1242

积分

四级会员(40)

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

积分
1242
2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址
5 m$ X. y2 L) ?! v8 o& Q1 Q(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。: v! h/ g& S$ s: |$ \/ E% I3 d5 R0 U! x
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
8 y$ @4 P) N) c& _$ B+ u" G2 j( o  H. k* r
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0
0 r/ g  h- J- A
8 U+ G. b. H: b7 [' }1 l% k) I) ~volatile union {9 R: U! s0 c+ F- o# u8 y
    struct {
, B# Z. p* J% x/ n+ Q        unsigned        LP0                 : 1;0 K3 s# e+ j5 q. k
        unsigned        LP1                 : 1;
1 ?. c: U( x+ i) o8 f" `' E* x        unsigned        LP2                 : 1;
" [2 T8 X" l7 F6 m6 L8 V* K' n2 m        unsigned        LP3                 : 1;
* j! W7 V- |( ?7 s/ P        unsigned        WA                  : 1;) |  U8 G! j: s' _) B( F
        unsigned        LCDA                : 1;! Z  m; r# x' E6 p& J" h3 a
        unsigned        BIASMD              : 1;
5 \# J. N5 G: }        unsigned        WFT                 : 1;
! l4 V1 |5 ]8 i( B6 _9 F) }    };( |/ K% J$ t- U/ J
    struct {
. s( O) x/ c3 J) M* L) i        unsigned        LP                  : 4;1 G8 H2 o" Z9 p+ Q/ E& @
    };
  B0 c' ?5 M8 S  {3 M} LCDPSbits @ 0x792;5 N6 u: w7 V) t8 h# a1 H/ N
这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
; x& w( H* x/ P& U! Y) }8 U& k& d里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义
6 P% @8 [( P- w( p* f0 ~+ O; b2 G  z; a" V6 h: G* Q
volatile union {
% N# ]# Y- W4 r+ l    struct {
' M( O( |  @8 ]/ _# U, W, S) v6 I        unsigned        LP0                 : 1;
% L1 w! _  E# @! U        unsigned        LP1                 : 1;4 R, m7 p  ~  b7 B
        unsigned        LP2                 : 1;2 h. w# m0 d) K8 u, i
        unsigned        LP3                 : 1;
) `8 F+ {$ @# `2 h" \) p        unsigned        WA                  : 1;
$ C8 G% n5 a/ q5 d( q        unsigned        LCDA                : 1;
0 n6 G2 k7 L9 [) I7 i        unsigned        BIASMD              : 1;) [- n) p- g  G, @+ l
        unsigned        WFT                 : 1;: y& C9 E- Q$ p( J" @# `, d
    }a;
1 w2 I% ?6 q+ ]    struct {6 M  ]0 {1 q9 M9 M' U
        unsigned        LP                  : 4;7 N3 z; k! h* P& c. @/ H  b" g
    }b;
; _0 Q% ^/ }' v& ^} LCDPSbits @ 0x792;# \: L$ |% @% A  Q3 A. r
那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。5 O+ ^8 @5 P; E' d2 p
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
4 l8 r/ \! x9 M) s7 k4 r; n0 j& L# g) V0 K: c+ ~" G  f
(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
# R8 I& N8 V3 S( P+ w& ]- g(1)@定义变量的地址
. ?1 E8 x' k4 q1 l! S2 D$ ?) ^(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...
+ X" o6 R6 `8 `7 D7 \
非常感谢哈!!!
7 U! y4 @  S$ M! `9 X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-16 00:05 , Processed in 0.082294 second(s), 32 queries , Gzip On.

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

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

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