找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

157

主题

559

帖子

1216

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
如下面PIC16F1933为例。9 i, Q2 _. q; u
( P; K; I+ g- e" x
// Register: LCDPS
+ Q7 B. t& A+ Q* A+ A, V// LCD Phase Register
5 t* c6 ]( j1 f! @3 Wvolatile unsigned char           LCDPS               @ 0x792;: {3 |) J& D' o$ [$ n1 ~+ Y
// bit and bitfield definitions# L1 X! R! r. z
// LCD Prescaler Selection bits. p% A9 J, b/ d9 l
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
8 e2 k4 W/ d/ u& J5 U( B// LCD Prescaler Selection bits( y+ c: V. y4 p9 u3 @
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;: z0 i% m8 t  v
// LCD Prescaler Selection bits
; ^3 y  c& B. ]8 L6 lvolatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;& g/ `/ Q# N2 u6 i' E7 `" t5 C
// LCD Prescaler Selection bits: w8 R: t8 E. s% r& v
volatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;
7 Z5 j  j* D& D, x// Write Allow bit
1 t! ~. F: S' P% lvolatile bit WA                  @ ((unsigned)&LCDPS*8)+4;
8 A) \0 j) D/ j$ r! Q$ D// LCD Active bit
4 q' ?* ], d% i- `! i6 zvolatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
2 H( e* L* B' v( l1 d- N// Bias Mode Selection bit
! C& y5 [5 Z3 C2 S, Bvolatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;/ d( f' L9 R8 ?
// Waveform Type bit
! h( H+ u0 h& J! R6 Q9 R2 Pvolatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;
5 ^. w# d7 X) V% T( K  g5 N9 u# M% ^#ifndef _LIB_BUILD2 t- r. Q* v( Z# }* F( s
volatile union {% \4 b3 y7 }; {( J  P
    struct {
: K* O* i, _8 L  a, x        unsigned        LP0                 : 1;
3 l3 e2 x# Y/ k0 Q* n8 y        unsigned        LP1                 : 1;
% h  ?) u# T5 l) Y) S( `        unsigned        LP2                 : 1;+ {3 Q# _. z+ n2 N8 ?" x# f
        unsigned        LP3                 : 1;
* u& g7 m1 ?" a$ m; j, M: K        unsigned        WA                  : 1;
; x- J. Y; a8 R* u- J; X        unsigned        LCDA                : 1;6 S$ y) Q! b8 d9 f
        unsigned        BIASMD              : 1;/ Q1 w5 F6 A, a" v7 u* k1 {
        unsigned        WFT                 : 1;
  t' b1 o- L" Y1 ]; g    };) g  \5 t% C6 ~( A& E( w% H
    struct {) X& A, W5 j- ]( Y: p
        unsigned        LP                  : 4;
( D1 v' q. E9 X    };1 L) _0 L9 v7 _. p6 N( A- d
} LCDPSbits @ 0x792;
* D' A' H! J! t  Z#endif5 Z/ F; W1 ?6 c: q$ ]7 I7 [" j- O
* N: \" M- p# v1 C4 Z: \- r

, Q! i2 y  V& v" ]5 j* M3 P3 ^( y5 F: m: z
疑问:" b) w7 @- W, r$ c& R
1,
, X% \1 }2 C6 |' h4 Uvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
9 l$ a% Y' W( p! g9 U4 z1 f这里的 @是什么用法 ?7 H; ~" P% X+ |( w: K
2,
* P" m4 t( D  y  z9 avolatile union {0 Q' e! j! J$ ~- r3 ?! N  f) q
    struct {- v. a" l# |9 B3 s2 m1 }' X
        unsigned        LP0                 : 1;
( a) R# u; a6 n0 x8 X$ c: ~) I) @1 O( r" g; u+ d7 S
这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?
- Q3 P3 G: P6 H  ^3,
1 \# i/ Y! N6 t. M/ z# r; I* _! U还有LP0     :1 ; 是什么意思呢 ?   I9 f, |4 [3 Z
  \- o- D- k. G! d7 ~# J- ^4 Y( m4 U
求指教 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

169

主题

582

帖子

1242

积分

四级会员(40)

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

积分
1242
2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址4 k2 M4 g  R4 V! ]5 }+ Q# S9 O
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。: x/ l/ a' T! a& ~0 f  r, J3 ~/ F
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
0 A. Y" c, e6 H7 [8 W8 g* r# |  {7 l/ Q, z$ x* y( b# R
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0
6 D- u" _& u% N% p' v" M$ d7 w9 ~# K4 Q9 R
volatile union {
& f9 l' v$ K% ^9 Q+ x$ H    struct {
5 L- B2 {) A6 q4 r3 ^$ Q7 h        unsigned        LP0                 : 1;
1 M' n% Q+ ~" F* [        unsigned        LP1                 : 1;
4 |1 F( B* J4 ]4 v' s" m$ u! j1 |        unsigned        LP2                 : 1;. ?3 L1 l% c: d7 q
        unsigned        LP3                 : 1;0 h" \; K/ n& I# D
        unsigned        WA                  : 1;
/ k, W$ n1 M5 W        unsigned        LCDA                : 1;1 B6 k* Q  A) a9 q% U# d, M: m
        unsigned        BIASMD              : 1;
# B1 K) C: n, \$ D        unsigned        WFT                 : 1;
4 w  R) o) ^, j7 S9 S' f0 S' F. [    };
( ?4 c# f: F" B5 K5 z, ^2 W' {" n% f' e    struct {
: @) |5 M$ ?0 w+ i; S$ p, o* R4 ]        unsigned        LP                  : 4;
$ G+ p- a7 y9 T! B/ i7 z0 b    };
) L5 `3 H# |* a& v- n! ~- E} LCDPSbits @ 0x792;' j+ ^  b9 r/ [* s0 r
这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。
8 A, A( i2 }! m% ]4 [里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义. p* k! H0 c. s  b' n8 y% N

- _8 ?5 {0 X# S: Kvolatile union {" T: }: ~# n/ j3 M  s
    struct {
6 C+ ?4 W/ a. x& K9 }        unsigned        LP0                 : 1;
! k* t- F' ?: d        unsigned        LP1                 : 1;9 E. S5 a" a2 `" B* [
        unsigned        LP2                 : 1;
  {$ S' N0 E4 p, j/ q( Z        unsigned        LP3                 : 1;1 m6 R; P: }! {
        unsigned        WA                  : 1;
8 R& w8 S: `$ |% }( ?) w        unsigned        LCDA                : 1;
$ ^, ]; ?$ d( S: c        unsigned        BIASMD              : 1;+ T5 q: c" Z3 {9 L8 }" e; t" R
        unsigned        WFT                 : 1;( D5 O" T3 M4 R5 Z! L* ?
    }a;
' z$ R5 O$ O. w    struct {% M6 p. Z% J* \& d" R5 q- b  h
        unsigned        LP                  : 4;' O, U; O' b4 L$ Q4 c8 u0 k
    }b;
9 }' n9 c8 u- e3 l} LCDPSbits @ 0x792;
* x3 z1 x1 k. W; B4 x1 t3 P1 |那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。
! o) c% ~& T+ {  i- S+ T4 [LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
  Y+ }% K/ O, n& L
$ |$ j4 |3 ~+ i6 L4 S(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:245 c6 L1 B% C& ^& z9 d4 o( G0 k# A, A
(1)@定义变量的地址1 x/ Y/ G+ E8 h4 a8 S( P
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

3 \# K7 B$ `8 h5 B: I非常感谢哈!!!$ p1 D: ~' {" {$ _1 i" ^( |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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