找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

157

主题

559

帖子

1216

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
如下面PIC16F1933为例。
, N4 ?0 L; n: o, z
- J/ ?; {) n/ ^. `1 z- F( [// Register: LCDPS/ m7 L) ?& j7 k# T% N
// LCD Phase Register0 Q4 F1 w, Y) S& T* ]- {8 H
volatile unsigned char           LCDPS               @ 0x792;
& l7 i' J8 ^9 W* I// bit and bitfield definitions
! W& N2 J, T4 j  Z9 d// LCD Prescaler Selection bits7 \, F' c8 v: Y7 B0 ^. `2 j- v" b
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
6 T! J7 N7 D+ p" D' X, f// LCD Prescaler Selection bits
6 d! }( X, ?& J7 @! }9 h: ?" \volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;
. h8 s4 \- T; g' h0 G; r// LCD Prescaler Selection bits+ V$ ?$ o) P7 Y
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;
9 w$ [" L) ~2 {9 G// LCD Prescaler Selection bits
# ?! b3 Z% D4 ~/ I: rvolatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;+ H% N7 T, X$ q9 R& W
// Write Allow bit
5 }5 t1 G+ K0 u' Dvolatile bit WA                  @ ((unsigned)&LCDPS*8)+4;
$ G# ^# |- d! m9 V9 Q; L// LCD Active bit
- s0 f8 |( I; u( _volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;* B/ v5 U/ Z" d9 }/ ]! K
// Bias Mode Selection bit
: E- w" F) j2 }volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;' U$ I8 _( L* {
// Waveform Type bit
0 _0 C( r7 i( bvolatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;
2 u- h9 r) v; Z+ D) b$ a#ifndef _LIB_BUILD
! P( k/ f& \- m1 Lvolatile union {3 n* Y$ U+ T5 j2 i( @; G2 ^
    struct {  o- D, c7 O; e' }. O
        unsigned        LP0                 : 1;
  Z, r7 g. k' [6 b3 e6 g3 [7 T        unsigned        LP1                 : 1;
: k; X; J1 t# Y! B1 F        unsigned        LP2                 : 1;
4 [2 r* k7 {$ x5 n        unsigned        LP3                 : 1;
  G9 ~. V  L( n$ Q5 X3 |        unsigned        WA                  : 1;
! n% i# p3 q! F: q2 D, {8 h        unsigned        LCDA                : 1;
& W; [. r  K! l        unsigned        BIASMD              : 1;
9 n  O) W1 S! P! T8 _0 d        unsigned        WFT                 : 1;
& ~; s" E3 X6 ^! Q9 n    };& @# S+ c/ y; j
    struct {  N! ?1 v+ n8 Y* c( x
        unsigned        LP                  : 4;5 [9 U* Q( X  h1 Z" o
    };4 V$ [! L( e% ~5 X2 f
} LCDPSbits @ 0x792;
% V, M; i1 L3 t# k  a; B! t#endif
5 L9 u4 N: H" z! t. f
7 W6 ^& e# n3 U$ w3 r' u7 @0 J* O6 |9 x7 T7 _/ m! |! j
+ w+ ^' N. x; }6 P8 a7 T
疑问:3 A8 R1 Y6 @" S$ R
1,
7 V- q3 P/ D. z1 Z# Wvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;: Y1 s4 R# k$ p+ w9 x
这里的 @是什么用法 ?
8 n- V/ R% _# C2 |# v: `2,
3 j4 [( d% F8 w5 v, bvolatile union {4 ~& e5 t9 }3 Z3 n8 f  [
    struct {# E* L( u7 I3 }0 ^' G( O
        unsigned        LP0                 : 1;
2 j- U# n2 u/ ~1 J' k( b
- H% f" `0 J( h9 H  P+ A这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?6 w' }2 C& K5 q: M" ?% Z
3,: A8 L' o5 \4 R" K
还有LP0     :1 ; 是什么意思呢 ?
( k0 K% {" u) m: J& @8 R+ j9 P2 p
求指教 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

157

主题

559

帖子

1216

积分

四级会员(40)

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

积分
1216
4#
 楼主| 发表于 2016-7-2 14:31 | 只看该作者
liao821 发表于 2016-7-2 14:24
) U4 z  ?1 J" |; m(1)@定义变量的地址4 y; X6 ]  M/ x& Z6 C* ], h) d
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...
; H4 l4 g- q0 l* m5 I( \6 u
非常感谢哈!!!% e; B7 _' ~+ Z" y

214

主题

642

帖子

1658

积分

四级会员(40)

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

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

169

主题

582

帖子

1242

积分

四级会员(40)

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

积分
1242
2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址
" \2 z8 m. F- _: G( U: l7 t! z(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。# d  Z  T+ T* g' B5 j8 a1 ?
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
5 f8 D! [9 T, k) h% o$ m" x1 d9 x' L9 p1 g
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit06 Z* g/ j: K2 ]

- @9 M" `4 N2 R7 o% yvolatile union {/ h1 A& r! Y! O2 @
    struct {
- T% y$ h0 U, m6 [  f; S        unsigned        LP0                 : 1;
/ g$ j" L; y% r6 B! I, B        unsigned        LP1                 : 1;4 Y/ j( i5 _% I. ]9 X" W( t7 U4 ^
        unsigned        LP2                 : 1;
$ B8 |$ S' {1 N0 Q& A        unsigned        LP3                 : 1;
% H2 v) n; _: p' W        unsigned        WA                  : 1;8 y. D9 a6 K6 w# l! E! ~1 t9 x
        unsigned        LCDA                : 1;
( y) {9 U7 a$ ~% z        unsigned        BIASMD              : 1;
8 q% ], _* ]  ~' }: P' z        unsigned        WFT                 : 1;: \0 j: Y6 \; D/ E: c# F6 d
    };
: }7 e& c9 s! T( ?8 W    struct {( q0 b/ v7 e" C  r9 a4 X
        unsigned        LP                  : 4;
  B& i2 a! i/ x5 L! I    };) `2 ^& X% V/ \3 q1 R. G
} LCDPSbits @ 0x792;
5 N4 b6 h3 ~% t2 \" c+ B这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。" A* G( }( F; |1 @9 N9 a8 v; |& @
里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义
  X1 @0 B8 R; }  Z3 Q, F' H
& e( b( d; R2 W, w, v# L% v4 @" ~. q  cvolatile union {
& u/ F' X) Q- ^# E' W) E) V    struct {* a' l* Z& X) ~# H3 d* ?0 k5 t
        unsigned        LP0                 : 1;
- D' ^6 a5 P. @9 l+ B        unsigned        LP1                 : 1;+ e6 B; l$ F1 Z9 o, U
        unsigned        LP2                 : 1;. y' B/ V+ y0 S+ o6 ]0 v
        unsigned        LP3                 : 1;: d. b8 B  B5 t4 R- n
        unsigned        WA                  : 1;8 g2 O1 U1 Y- T( ~
        unsigned        LCDA                : 1;+ D: A+ c9 h2 G* }/ a& V
        unsigned        BIASMD              : 1;
4 A7 T; ~2 f3 T2 A; t3 i        unsigned        WFT                 : 1;
% D) g( p. b0 I4 ]    }a;: l' h; r8 D" E2 g5 P3 J  l
    struct {2 q% \# Z$ I: y: Q/ n  N  N, j* H
        unsigned        LP                  : 4;
) Q6 P- a0 R- E- D    }b;
7 b; O9 l! \/ z4 G# [, @! `& c, W} LCDPSbits @ 0x792;" T! b1 A7 m' ]2 a* O: M8 w
那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。
' H( s2 t; ^2 ^: Z; ~% w/ x( H. ALCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
* f3 g+ ]6 p( _" h! n2 Y# }3 x: _" k* I: |  s" u/ s
(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。

点评

非常感谢哈!!!  详情 回复 发表于 2016-7-2 14:31
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-16 00:21 , Processed in 0.058887 second(s), 33 queries , Gzip On.

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

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

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