找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

157

主题

559

帖子

1216

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
如下面PIC16F1933为例。
$ _# C$ D/ I$ R' @$ S
: @% O: m) w, D) j9 \8 P// Register: LCDPS
- \0 ?+ s0 W3 i  f// LCD Phase Register
! \2 X& o  }9 n) svolatile unsigned char           LCDPS               @ 0x792;
' q* \4 G: e/ ^6 L! N  R$ n// bit and bitfield definitions9 m3 b% c3 s. [) I0 a
// LCD Prescaler Selection bits
) z. H0 q2 C( v; P' lvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;' l- `9 h7 N4 Q2 Y7 n
// LCD Prescaler Selection bits
  V$ s# y' d# Y# i/ Qvolatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;
$ {2 t# S! P3 I. X5 e// LCD Prescaler Selection bits8 V  t. A2 \. J: A" B; D
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;# H/ p9 y' i. D5 A2 D4 B
// LCD Prescaler Selection bits
' ]( Y+ h$ p* ovolatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;
! {7 i. F# I+ K3 L// Write Allow bit
; O7 }  h2 H, `; S/ svolatile bit WA                  @ ((unsigned)&LCDPS*8)+4;. H" Q% B* E& O
// LCD Active bit
. y" Y6 u  s" _volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;$ n3 P0 F+ l5 ^' [
// Bias Mode Selection bit7 T! g% o/ l& h8 Q- g
volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;
5 H$ r5 s/ o) k! T  x/ y! V// Waveform Type bit
1 B8 }" q: `" hvolatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;- T1 ~' g/ I; t, e( Y
#ifndef _LIB_BUILD0 ^# g5 x3 Z9 R; Y: ^+ }
volatile union {
' O% z' C. w2 i0 ~/ }4 _1 L    struct {  g: S, g: j8 }: U0 H7 j  T
        unsigned        LP0                 : 1;! x$ f# }4 ^. J# \8 \5 M" d
        unsigned        LP1                 : 1;! E% O: e( e0 [) ~9 f6 s
        unsigned        LP2                 : 1;
8 @# P! O0 Q) P% f        unsigned        LP3                 : 1;5 t6 o! g1 c8 c
        unsigned        WA                  : 1;
1 q4 [) y; K0 C- K2 m( W5 s        unsigned        LCDA                : 1;
( p1 ?) e# s1 _9 O  C        unsigned        BIASMD              : 1;- V/ A9 C1 E4 U' C3 m0 y
        unsigned        WFT                 : 1;
& J" s# n* @0 @7 Z$ p) \' o    };1 v! Q. O5 T, v9 o2 ~2 P# ^
    struct {
8 \0 z* P) E: t, t/ n3 E  Y; J        unsigned        LP                  : 4;
$ ^) i0 l  ?. R. G    };
' M* Q: c$ m, j} LCDPSbits @ 0x792;: l8 d' l4 m; C
#endif
9 w6 w& N0 U2 P( w8 ?( [! W5 B! c7 a" J

  v: Q6 x: ^& a- r9 e7 h, m( S# A8 ?+ f  W* K4 r" h
疑问:( p3 F, X5 m0 I; _- Z# t( S
1,
0 ^; Z& `4 ?: Yvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;# `* v. H# W$ {# U/ L$ P9 C/ D# T
这里的 @是什么用法 ?
6 I5 N1 R, a% {/ |" }4 |* Q4 G2,
. y: v8 u; g2 i0 ~8 I% evolatile union {# y3 g3 |0 C$ `" O7 Z& H# ?3 {
    struct {
3 M- z8 R3 S. i7 M# I! p        unsigned        LP0                 : 1;) k8 m: Z$ [/ a2 b. z

+ [2 c' ~  A2 e' Z0 m' b( y" f$ h% Y这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?0 l, ]) O8 q/ F3 A
3,. _: G9 q. M* r* B
还有LP0     :1 ; 是什么意思呢 ? 9 p1 B1 {& V! b0 |: a$ `$ `7 x. J: a

  A6 f% h' T2 p" q/ j& t求指教 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

169

主题

582

帖子

1242

积分

四级会员(40)

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

积分
1242
2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址( q9 L- g  ~$ N- Q# p( n
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。; h7 r( |4 L+ c$ z" r/ Z' ?
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
1 }) f. H* n& u
* A6 u9 y) W- o, Y7 C# q9 Kvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0; g- ^, C9 I) E6 S7 w6 g: i

+ h( W! n2 n" u  gvolatile union {
' H* q' e& d" ~; @" v3 L    struct {
% o0 k% E* {! d* K) A6 v        unsigned        LP0                 : 1;2 a+ J5 |- `; q- @' }( J
        unsigned        LP1                 : 1;
7 V: |0 `" D7 F7 q        unsigned        LP2                 : 1;
0 }8 i. C5 m% d2 D1 W3 V* A        unsigned        LP3                 : 1;) W8 j* @6 r) J4 W; y/ U" C
        unsigned        WA                  : 1;" I' z. \& k! t. _
        unsigned        LCDA                : 1;# }4 r: G) R" w! C2 k/ ?
        unsigned        BIASMD              : 1;! J2 d: r6 L4 t9 }, {
        unsigned        WFT                 : 1;/ s5 ]: Y* O' n! a4 t
    };
* u1 V. b9 B# G' G0 d    struct {% w6 m& m. }& c4 m% B' k
        unsigned        LP                  : 4;
* `3 p! l6 R# [+ W! p* T' }    };$ q% o9 F5 }# A" S9 l  r
} LCDPSbits @ 0x792;1 U8 T/ s9 d5 P9 Z1 D2 N" v2 Y; ~
这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。$ t! h' p6 z5 m$ v# X' i0 g
里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义0 ?4 l- t6 ~% ?' C5 o: }! x

; l# L7 K% P& V$ d; D" ivolatile union {
* [  a$ a0 e& e$ b' C    struct {8 Y+ B( n0 n6 Y" s. g! }7 I
        unsigned        LP0                 : 1;
4 t% t( b, z; }& O) g        unsigned        LP1                 : 1;
) w7 A( I+ h; H9 ?        unsigned        LP2                 : 1;$ o( X! I4 F5 ^$ @9 i! p+ `
        unsigned        LP3                 : 1;4 u2 A5 V6 l  n( \
        unsigned        WA                  : 1;% I) g; f4 O8 w+ v/ j5 k# h
        unsigned        LCDA                : 1;
, c7 i6 Q- T5 h2 x8 d        unsigned        BIASMD              : 1;
5 R6 }% A3 ^$ ?! y, Q        unsigned        WFT                 : 1;
; i7 f: x! {5 I5 Y+ n. t' p1 l    }a;
# ]% H7 ~9 J: F' t+ {0 C0 r    struct {
; _9 B) }' c! S        unsigned        LP                  : 4;
1 h; ]1 d* S, i    }b;* l& w' D& [& Q, Y
} LCDPSbits @ 0x792;
. D8 j/ W1 y9 |( M& L' N那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。
5 b9 ~, v3 t0 Y0 kLCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
' \3 D8 X0 G% v& f8 K) q& V7 Z( s4 q3 j! X6 f- `, M
(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
1 n" z5 ^7 o' E. S" S8 K(1)@定义变量的地址
# I8 m7 u9 {& v2 J2 _2 b(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

9 B& m0 a4 Y. }( X# W! `非常感谢哈!!!4 u' D3 A7 ?- y: h' |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-15 21:57 , Processed in 0.072507 second(s), 33 queries , Gzip On.

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

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

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