找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

157

主题

559

帖子

1216

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
如下面PIC16F1933为例。
8 C- q3 x+ w/ y. s2 t* B1 w
" |9 H- y, R7 g3 ]// Register: LCDPS
# P" W, ^/ m( D7 A" W0 ~// LCD Phase Register
2 U0 p% B0 h6 z/ `volatile unsigned char           LCDPS               @ 0x792;2 V7 P* K" p+ L' B
// bit and bitfield definitions! B, g' U6 T4 C
// LCD Prescaler Selection bits
9 R9 s9 y. ?! }4 L9 [volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
  G: C9 H+ Z; z9 o3 p// LCD Prescaler Selection bits9 n+ s$ G% a% M8 H. o+ @
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;* e( C2 q& ^) |1 L+ _
// LCD Prescaler Selection bits; ~, g5 b9 B6 t! x0 {5 }
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;  u$ X, Z$ s5 |1 J
// LCD Prescaler Selection bits& K! ~  ^1 V  _9 E2 \7 ]9 `
volatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;( w8 b- B' b1 k
// Write Allow bit7 s  [* \$ j2 m8 ^& z$ [; L
volatile bit WA                  @ ((unsigned)&LCDPS*8)+4;: t' Y  `: x: e& R
// LCD Active bit
8 d8 k2 G1 K8 Q/ }- [4 y! rvolatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
' s$ g" d9 n6 Z8 g// Bias Mode Selection bit
# |; d- s) M+ J( [volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;
- S2 G, |# a4 q: ]; x6 L5 s// Waveform Type bit0 ]6 ?) y" `* e$ x5 [, A4 _1 v
volatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;3 h7 ^4 X# J( `  K' q+ F
#ifndef _LIB_BUILD& u1 `$ ^) e  X! L6 W3 R: w
volatile union {
3 i, Z2 }( z+ w9 E  u+ \    struct {
$ f% V4 b1 w2 d" K        unsigned        LP0                 : 1;1 B9 E+ U! @" |, a7 t
        unsigned        LP1                 : 1;
/ n, G3 I- K" M6 F5 m$ s        unsigned        LP2                 : 1;
8 G( \1 L1 _& q' I  Z1 j8 |        unsigned        LP3                 : 1;
. a# A3 I- V5 g/ I+ @: a        unsigned        WA                  : 1;, p: [' Z+ V2 _2 X9 L  o$ {
        unsigned        LCDA                : 1;: O: u% B/ W; O
        unsigned        BIASMD              : 1;
  r: m% w+ s. p6 m3 y        unsigned        WFT                 : 1;
' S( u' S! E% x, k1 i# ?5 j    };# H% Y" X7 p0 J
    struct {
7 T9 E( `0 N* z5 s4 `        unsigned        LP                  : 4;2 q( s& F0 |4 z( ]. i& f
    };
) u" \, d9 l2 P5 v. E} LCDPSbits @ 0x792;; f# n5 M' ]( c3 |" S# V
#endif
  n" c# d( `6 q: e- q/ d- i" B" F% ]% X) d3 T( D
! {6 Q9 k% t3 A! J  n+ x# s. z+ L6 c: n
4 r8 N& w9 }; r: d+ s
疑问:
- J) @% }5 ]  p, g. V  t( m1,3 ^' E5 |4 H; @0 D8 _' g
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;, q/ f0 r/ K2 L' ^3 K7 Q  `* C* v7 E
这里的 @是什么用法 ?7 m) T$ @1 \  Y: d  v
2,
0 ~# C: s* E* c: w' s# Fvolatile union {
  P$ T% }6 ]6 @/ v8 G    struct {% D4 N  O) A1 _9 i
        unsigned        LP0                 : 1;
/ m: Q9 q; w- X0 m7 {0 ~8 L9 Q8 d8 t5 t% a, S! ]
这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?# d- y, p$ N7 |6 P& p0 @4 T
3,5 ?( T% t1 |+ e" R1 h# V
还有LP0     :1 ; 是什么意思呢 ?
( S) r6 X& w7 G! g0 d" p, D- q& k2 W2 [7 V; |
求指教 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

169

主题

582

帖子

1242

积分

四级会员(40)

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

积分
1242
2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址/ v# F( P9 V- ?% B4 Z
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。
) j7 Z- y- |, ~volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x7924 Y4 s5 X$ Y- ?1 x3 |( z

0 a4 n: E  Q9 n3 |$ h& H1 Tvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit07 @- E7 @* b. w% U9 N5 W( Y

& {. ]- V/ r: u9 |7 `+ j% {/ `volatile union {
; C2 }1 u$ n5 h1 v, e0 n    struct {
3 p" P/ c4 R4 ]5 H: R        unsigned        LP0                 : 1;6 V3 Z, s6 _, ~; P  X# s6 J$ X
        unsigned        LP1                 : 1;
9 O) e! m( S1 F        unsigned        LP2                 : 1;
9 H- W5 h/ z1 O" ~        unsigned        LP3                 : 1;
7 X, r) V% x- n4 I. x        unsigned        WA                  : 1;" c" R( X8 R2 o/ u% F
        unsigned        LCDA                : 1;
5 a6 X6 K( ?- X1 Z        unsigned        BIASMD              : 1;
- z8 E7 x8 }* n8 @1 g: r$ s, A        unsigned        WFT                 : 1;& M" m/ g# {8 s, _* U7 j0 O2 A
    };
# _) }3 h8 k' V& A) U3 U    struct {
1 t2 d  E( i6 `) [1 |        unsigned        LP                  : 4;
2 K( z7 V' {1 m- C4 l2 j    };
4 D$ N8 |1 k( \, V0 p% a+ |/ G} LCDPSbits @ 0x792;$ T+ E' t+ X" ^
这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
  J" |3 u$ L& a  z$ B里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义9 e# F* e% X3 t4 a
* a/ E  s( }# e& K7 |
volatile union {5 u$ a% Q5 n8 t9 ^
    struct {5 ~; }% y3 b- o2 e
        unsigned        LP0                 : 1;
( ^' t5 _4 m" n        unsigned        LP1                 : 1;
' Y8 D2 X" Y  |; g: k" L        unsigned        LP2                 : 1;' `3 \% s( H" ]7 Q0 f" M
        unsigned        LP3                 : 1;
- |$ C( L% F: d8 \% A        unsigned        WA                  : 1;
+ r" u, A+ t) P4 R3 Z1 q9 K" Y! \        unsigned        LCDA                : 1;. x4 y/ u# @2 G3 L
        unsigned        BIASMD              : 1;
6 ?, U5 t1 H5 w0 H        unsigned        WFT                 : 1;
% @* y! S9 g& Z  x    }a;
( }) l4 K! l( X$ Z* a    struct {1 t2 @3 [; l3 Z! Q3 ^
        unsigned        LP                  : 4;8 J  g5 I- I; a0 w' E
    }b;$ x2 u3 g" K) ?+ r. G0 r' i
} LCDPSbits @ 0x792;
5 m! Z, @# J- z: }, U那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。
. v4 Q& |: N0 G7 [: u2 SLCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
& F" Q' d1 n* t8 \7 u* g/ v( L. L- 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" Q* e- E: O) L; Z+ }& q" K6 Y
(1)@定义变量的地址
6 p3 z1 ?" T! }# P% z# f; w(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

6 ~, H" @2 Y- j! U& i+ j  T非常感谢哈!!!, J, W# f9 N+ s( v9 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-16 02:39 , Processed in 0.056888 second(s), 32 queries , Gzip On.

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

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

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