找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

157

主题

559

帖子

1216

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
如下面PIC16F1933为例。
, F. X; q( |- ~5 H: K8 C6 @5 x# z- ]4 l8 t
// Register: LCDPS
% j/ v% B& R1 k: q: ?" d8 s  d1 v7 m// LCD Phase Register
: I8 n+ r/ q4 F% O* @volatile unsigned char           LCDPS               @ 0x792;
& z* g1 O( `4 I& P// bit and bitfield definitions
8 U- {3 B8 t* R. ]1 S5 S// LCD Prescaler Selection bits8 e- W9 }2 e; e) G
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
' N+ F! N& M6 o* P5 j+ B. R// LCD Prescaler Selection bits& E; q' v' o+ P( z6 J
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;) s2 p% d& ?7 y: `' B2 I
// LCD Prescaler Selection bits
! V/ X- }9 h4 ]) i, ]% fvolatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;
& V' M& g. g1 K( x; t$ A! @( m// LCD Prescaler Selection bits8 M% h5 U; s* u9 y" T
volatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;" o* y5 T% l9 Q9 b. p
// Write Allow bit
1 \+ b" ?2 u% Gvolatile bit WA                  @ ((unsigned)&LCDPS*8)+4;
$ L! e" O* B: o7 O; }// LCD Active bit+ B+ H! {% N1 p# D8 z* {, ]
volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
. M' E8 \, z" m# B// Bias Mode Selection bit" \$ P! K" n! g) ?" P6 x& `' K
volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;0 y5 `. ~( X9 E" U2 s) n" \
// Waveform Type bit
# ~1 K- @, [4 Q9 Dvolatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;5 a; B7 g4 @! V( D' Z" V
#ifndef _LIB_BUILD2 X) @1 ?) s, T2 H# C. E8 k) c
volatile union {
$ M7 C+ s) ^, K2 Q4 Z7 q    struct {
- i: E0 c! }0 H' M        unsigned        LP0                 : 1;5 a5 ~. M" R1 @" v, x( I+ s+ y
        unsigned        LP1                 : 1;3 x. D3 q$ A/ X' h7 q* y: p4 q
        unsigned        LP2                 : 1;
! a4 Z( k  h( D        unsigned        LP3                 : 1;
5 Y: a# z# o6 `$ h        unsigned        WA                  : 1;
2 L$ {% g0 {  M3 ]        unsigned        LCDA                : 1;: M* D* h  K0 ?$ ^& x- v
        unsigned        BIASMD              : 1;, X; L4 ]! W# a
        unsigned        WFT                 : 1;4 d! T% d2 u  D. a% y
    };
4 {% E/ E8 E/ d    struct {( {6 j6 u6 x9 u* O" W$ v7 f
        unsigned        LP                  : 4;
$ g  D5 \+ p+ A8 y    };
- T; `( I5 \1 e$ f2 f} LCDPSbits @ 0x792;  ^) P3 P( s& f- B
#endif
$ h1 f% z) D- k6 Y* ]; ~7 h4 K, R+ K% ^) C

4 l0 l6 d: \/ r3 d
/ Z$ C( I, w, F  N疑问:  X" Q* M* T1 y/ }. M& u
1,
" g1 b8 p2 C2 Q1 T6 E/ T% \% Vvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;2 ^& |9 ]1 R# Y6 [; ^
这里的 @是什么用法 ?7 t+ [* o* U4 ^" m* c
2,. C9 L. x6 ]  F% g& J# t
volatile union {
$ y" T+ A9 f" D5 g" s/ _4 s4 J    struct {0 R- Q) `# S" m
        unsigned        LP0                 : 1;' H9 E7 T* @2 k( x

0 `% j9 s9 f2 W7 Q. ~0 T( E这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?  r' Q6 p7 Z7 o0 ^0 h
3,
" ]/ ~" `# R; j  h! R/ @% h还有LP0     :1 ; 是什么意思呢 ? . [( A  m7 I9 L8 H" C* Z7 P1 @

. J# S$ S4 u) {4 D求指教 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

169

主题

582

帖子

1242

积分

四级会员(40)

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

积分
1242
2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址0 S, f$ b1 m; x
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。  a5 T- E( h7 S4 P
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
9 v4 z- V5 ]) T' a$ T7 {
  H7 Y0 B1 t% B4 j% A2 yvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0
% |+ T# i! J; p$ y+ S
% N" \1 J. _. H: g9 W( xvolatile union {1 a/ l; y/ v2 `; R5 H! V
    struct {; a% r8 U: S: ~' L  j2 R
        unsigned        LP0                 : 1;
% T. b2 E; L7 k" y        unsigned        LP1                 : 1;
/ T/ l, m) w8 B7 f        unsigned        LP2                 : 1;7 `) w4 h( ]4 E" t
        unsigned        LP3                 : 1;8 f% J4 D% |) g. U- {: B* U
        unsigned        WA                  : 1;5 J& ^( ?( u' i/ r" t/ S
        unsigned        LCDA                : 1;
; L" t3 S3 _/ |+ h        unsigned        BIASMD              : 1;
5 B. z! Y+ x' \$ N- t1 z        unsigned        WFT                 : 1;
* ~+ ?8 V- I9 a5 }( F% X2 _, x+ W; S    };
6 L, b7 H% r6 L- |    struct {
1 ^$ v" h5 w( [5 |3 b8 _        unsigned        LP                  : 4;
6 D2 i# T. u( v5 z7 R+ f6 i    };
- T6 r* d+ D. o8 n} LCDPSbits @ 0x792;
, g. H0 x1 H7 g; G这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。# Z3 R/ z9 M$ C) C* D  p5 z  d. D
里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义
% V& V$ V% O) a& R6 e3 u2 L' t: U; `6 z/ Z3 [6 F
volatile union {$ E  G6 G3 w/ w5 s+ i( i
    struct {" p# _, U& e( ~* e% d9 e) I
        unsigned        LP0                 : 1;
# ?- G9 m& E2 L        unsigned        LP1                 : 1;* D6 H. M: K9 \
        unsigned        LP2                 : 1;
; _+ H6 N5 X0 d! {) ^        unsigned        LP3                 : 1;
  i+ o# j5 a4 M# h        unsigned        WA                  : 1;- e" k0 z! T8 o* C7 Z8 f- i8 a
        unsigned        LCDA                : 1;
" e& D( ]( b* e' g) l5 j& V" _        unsigned        BIASMD              : 1;. \# n! p7 B/ ?5 ?$ }. a6 {1 r
        unsigned        WFT                 : 1;5 f' w( w/ L- a' {3 W7 [' H% a8 K
    }a;2 \/ R/ M; @  _6 _
    struct {
, C' N8 g% ^' `/ p        unsigned        LP                  : 4;
3 ]' _5 l) Q, |" c3 x1 u    }b;
5 z! u; t( W5 n} LCDPSbits @ 0x792;
* `$ g/ ^% y6 f# f4 o那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。, }4 S  j# M0 T& a( x, f
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。# @8 G3 d" ?  A* f# j
! v! T/ r6 ^" G0 H
(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* a$ E9 n: l( J: n3 C) Y1 [
(1)@定义变量的地址3 [% }0 D6 B: C
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...
. t! D. F1 ]0 J  }
非常感谢哈!!!: I9 P, d( U, |( O( k! h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-15 23:29 , Processed in 0.058404 second(s), 33 queries , Gzip On.

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

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

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