找回密码
 注册
关于网站域名变更的通知
查看: 457|回复: 3
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
如下面PIC16F1933为例。% ^2 q, a" q6 h' J* C& F. b
+ U: d  R% X: t( ?
// Register: LCDPS7 t# ~9 ~' i' v9 D- U6 r. k: W# t6 d
// LCD Phase Register. C  X' l2 e/ T
volatile unsigned char           LCDPS               @ 0x792;
* I1 r3 _6 K/ F// bit and bitfield definitions
, S8 m  E1 c  a. S, A// LCD Prescaler Selection bits  L+ r" F! @0 s3 w4 X0 \& @
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;, V5 f: `  {% T) [$ p
// LCD Prescaler Selection bits9 w7 f& `+ f2 H( O/ x+ z  S
volatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;: @' D4 {3 [- D  u7 L( J
// LCD Prescaler Selection bits8 s( T# k0 T9 [, V% y0 ^
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;/ O8 S+ N: d/ ~  r& t; v
// LCD Prescaler Selection bits) N* u2 v* F; e# `0 V2 J5 h+ h) E
volatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;
3 E& U5 P- \8 H# |// Write Allow bit
4 W- U* C: Y# C3 q+ nvolatile bit WA                  @ ((unsigned)&LCDPS*8)+4;
: J& m; W9 B: U1 q6 ^2 O+ }/ z// LCD Active bit
5 t- _& n4 P& }' a* E# [. I' [' {volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;6 {1 ], K. t/ g5 x  l  M
// Bias Mode Selection bit$ \- `  s. z. X  H; N4 \
volatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;4 _/ n6 {. S! T
// Waveform Type bit2 e1 c# ]8 Z$ X+ m
volatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;4 b  K+ a' l  `2 B) w
#ifndef _LIB_BUILD$ U8 W5 J1 F( A% Y: h5 |
volatile union {
' @& D3 n* c' O/ T* d3 r    struct {
3 t( n2 ^& \9 o! L7 I. N        unsigned        LP0                 : 1;
  j" W" c/ e1 l8 s, n, O        unsigned        LP1                 : 1;' c  ]+ Q! p) D5 y
        unsigned        LP2                 : 1;# X3 K; S) ]5 D- K9 B
        unsigned        LP3                 : 1;
- i& W2 p6 [9 Z% v" r$ x' ]0 O        unsigned        WA                  : 1;3 F8 e2 Y" m9 s" W3 X
        unsigned        LCDA                : 1;
0 i" m4 N! n: `9 L, X        unsigned        BIASMD              : 1;/ E# M: i7 a& m; F
        unsigned        WFT                 : 1;: {& L- U$ D6 F( v
    };
  D5 g, _& V8 J% m    struct {
+ M, a, f2 I- O. `1 Y0 A) L        unsigned        LP                  : 4;7 y) R! a- X7 b6 v4 N7 H8 y) }
    };+ a+ T0 C& O2 J1 l1 u
} LCDPSbits @ 0x792;. }5 C8 o/ b3 L9 m. d8 a: ^
#endif
6 J2 G2 ?5 P* K5 c/ W" E* e0 C' ?; \
% f2 C6 I0 l1 a( C
# C& K% V; v/ W) c) p& a
疑问:4 Q. y9 `5 a; a8 \. X' W
1,4 G$ |3 S5 A) \4 a! y6 E, b& v9 }( E
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;9 e, J! X. v  S' l
这里的 @是什么用法 ?1 c6 b+ @% b( z- x3 b" V/ Q/ @; V
2,
* u+ A9 e2 |7 c+ f# ^volatile union {
( V  p6 g) g+ a' }6 k8 t    struct {( r* g0 r7 A9 J; U+ ~
        unsigned        LP0                 : 1;
0 P$ T0 Y, x, \' j+ p: M0 C* C8 ~( S$ H" L8 z
这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?8 X: l! r& e" h+ u! h
3,2 ~* e) I3 L, V- q5 z9 E
还有LP0     :1 ; 是什么意思呢 ? * u+ Q! j; k$ n, l& c/ o

: @# D9 G/ N  C求指教 ?

该用户从未签到

2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址# R0 r8 N! J$ }' c$ K
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。! I& B/ S. `- y5 E8 j/ g; Y4 _
volatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
1 |/ }" M& f1 ]  h) ^) U" t. C. t6 E) I: u0 [6 u3 b
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0& a" u. J0 V7 W- F: B

0 l2 v& ]/ u) P( u+ j: W  mvolatile union {8 ^, l# k# e( J4 c
    struct {! ~1 C! r, N8 D$ }, B
        unsigned        LP0                 : 1;
3 `/ |" L: z  |  v) n. B$ F7 v        unsigned        LP1                 : 1;5 ^! {* N. m& s2 M
        unsigned        LP2                 : 1;
$ m( y- \$ g+ S! c- s        unsigned        LP3                 : 1;6 c$ |3 r* O% ^9 h! O% p
        unsigned        WA                  : 1;
% `8 ], B/ N* ?        unsigned        LCDA                : 1;# _$ J) H8 J( z4 E- k' ]
        unsigned        BIASMD              : 1;7 t* h) E: i. |: [1 S7 B
        unsigned        WFT                 : 1;
4 c  q& w8 ], Y6 \7 Y    };2 E/ T" z9 G' B; z( o; N
    struct {
/ A  R& }9 g6 ], G1 R        unsigned        LP                  : 4;6 B! v2 Q3 P& M; Y% c
    };2 d( F, J5 D1 {8 x; y
} LCDPSbits @ 0x792;. c2 q" |$ b) g2 {
这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。: j8 G( J0 e, a' h* L0 v% [
里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义0 I7 N7 r* n& q5 c$ n8 D- ]# R; T

+ {& g2 X6 R, K; ?( R# D3 ~' f7 ?volatile union {
4 w9 r$ A* [! N2 E( m& L' A  V    struct {$ l% y  K7 O1 Z- S1 U$ j4 t
        unsigned        LP0                 : 1;
- o. m6 B0 Z+ G& G  D7 i+ @+ s6 l        unsigned        LP1                 : 1;8 f( j1 V4 w3 v. ^; o, W# a& A
        unsigned        LP2                 : 1;
9 y: ^, ?# E& H+ _/ T. ]9 m; |        unsigned        LP3                 : 1;5 N0 {) V2 T/ m- @! h
        unsigned        WA                  : 1;! v9 o/ }6 v/ ]1 @
        unsigned        LCDA                : 1;
: |. Z8 z; D; C" s! j( d6 i7 p        unsigned        BIASMD              : 1;$ ]8 f7 F2 M9 H, a) P8 W
        unsigned        WFT                 : 1;& z! J' K& s# \+ G9 L
    }a;
6 H! S8 E+ G! J' F8 [  A. u    struct {
  r% U2 K" s( Q0 L3 y, p        unsigned        LP                  : 4;* Y4 ]& S% O% P; U
    }b;
: F" y) O- Q) S7 v} LCDPSbits @ 0x792;
$ C6 f2 [# w2 I3 t. B那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。+ B; q9 S' E. Q/ D, O0 U
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
% d5 k6 M% a% V2 c7 `* _" a% e1 }1 d2 m+ f5 e% w
(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。

点评

非常感谢哈!!!  详情 回复 发表于 2016-7-2 14:31

该用户从未签到

4#
 楼主| 发表于 2016-7-2 14:31 | 只看该作者
liao821 发表于 2016-7-2 14:24' S9 j9 R. r3 w8 l2 l
(1)@定义变量的地址
! g* f8 z; v' l(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...
+ z5 B. e6 h4 j7 m& m5 i: ^8 O
非常感谢哈!!!
# F1 R- p, p- \
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-12 10:40 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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