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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
如下面PIC16F1933为例。
- w; \- E, O' V' ?/ \" W1 g  O
, V" _+ }. r$ z0 `3 W- A// Register: LCDPS
* |9 a* l) q) Z9 d/ W/ W8 w) G// LCD Phase Register
$ l2 R2 a% C8 u& K6 s; xvolatile unsigned char           LCDPS               @ 0x792;
! [6 y/ P, ^1 O, Q. z* s* ~8 U// bit and bitfield definitions& v& C* y' s- C" b
// LCD Prescaler Selection bits
* t  v- u" l/ {1 `- @volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
/ y3 a  i" J" |% O: B3 m/ `// LCD Prescaler Selection bits
( ]5 j: a' f+ tvolatile bit LP1                 @ ((unsigned)&LCDPS*8)+1;
; @) s9 X+ O- y3 D/ n8 G  A// LCD Prescaler Selection bits9 ]5 J/ I3 U! G) H) q0 I
volatile bit LP2                 @ ((unsigned)&LCDPS*8)+2;
/ W. W* e/ V$ d// LCD Prescaler Selection bits
3 l  O) m4 O1 ^: v" A0 [2 f( a' cvolatile bit LP3                 @ ((unsigned)&LCDPS*8)+3;! Y4 V/ J7 Y7 ?+ c
// Write Allow bit& V  T$ E; C1 [$ b
volatile bit WA                  @ ((unsigned)&LCDPS*8)+4;! N* }; J7 r8 w: ?, ?* X
// LCD Active bit: U* O% ^. r* d8 _: I) b
volatile bit LCDA                @ ((unsigned)&LCDPS*8)+5;
% J$ d, m  V8 u. Z// Bias Mode Selection bit
! S( ?2 \- m. y4 t. t& g& O) U) Hvolatile bit BIASMD              @ ((unsigned)&LCDPS*8)+6;
: F7 j* R8 i0 c0 W  g) n9 U// Waveform Type bit4 U9 n7 G: A: y
volatile bit WFT                 @ ((unsigned)&LCDPS*8)+7;6 S0 S4 B+ B4 ]0 s! A( N% z
#ifndef _LIB_BUILD
1 q% N! b4 F* @6 m, j: {) Cvolatile union {
2 O* U( u: Q3 I2 P) `% ~    struct {3 B: w* ^, R6 C0 V
        unsigned        LP0                 : 1;
* E/ O, I# H! U        unsigned        LP1                 : 1;) c* [8 ^0 \4 t  g' z' ]
        unsigned        LP2                 : 1;
& U, q  }1 j8 r$ v        unsigned        LP3                 : 1;
7 ~' `+ ^4 l! R7 q' C& V        unsigned        WA                  : 1;
0 y* N! w( Y) l1 E9 e$ M0 K        unsigned        LCDA                : 1;
) f+ F% V5 U  P( J/ |$ b% D        unsigned        BIASMD              : 1;
- [2 @/ Q/ K# [0 n0 T1 T6 b: F$ I1 @        unsigned        WFT                 : 1;
+ j; l- w8 o7 c4 F2 h$ R6 c6 k    };% h( a- i/ a' a( R! |) d! k5 l; n
    struct {/ S: ]2 t& Q6 A% a. b
        unsigned        LP                  : 4;! w+ M5 [! B3 F
    };7 X, |, `4 M+ |
} LCDPSbits @ 0x792;
3 ?/ t1 ^) p4 q$ A1 Y#endif9 V" _* f7 h+ I+ U

& q8 q. L. I* C0 V8 Z7 d! z! o9 b; J; B) i* t* a
8 e# Q! G4 T$ w# P% J. c. d! _6 {
疑问:
% x  |1 q, `  ~2 l1,
' l8 J3 j, L+ P6 g4 d3 j# d3 _& Rvolatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;
: ?6 o2 o) h$ r0 q- y这里的 @是什么用法 ?
: I( i8 T4 X, E( n" j2 M2,
2 g( ?' k6 |+ E3 Nvolatile union {
8 A5 F3 y: d0 B5 B' e    struct {+ |; a: @+ s0 R$ z! _
        unsigned        LP0                 : 1;/ e; N% _, W3 p
3 I6 R6 D& o6 p0 f. o7 T# W& ?
这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ?
5 N: }1 B$ g0 N4 N5 Y, _7 n4 R3,$ Q4 ~2 w: n5 F6 o" K! l0 F) i" A
还有LP0     :1 ; 是什么意思呢 ?
  q  {- n( t7 ]
* E2 A9 H5 a5 D2 j求指教 ?

该用户从未签到

2#
发表于 2016-7-2 14:24 | 只看该作者
(1)@定义变量的地址
) N6 }: |; y: O3 H% r5 U, V(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。
* u1 h+ D4 }9 D4 D0 U- Hvolatile unsigned char           LCDPS               @ 0x792;    //LCDPS变量的地址是0x792
7 `8 Y& M( |6 R* @) ?" U: G: W; _+ x8 |2 m  l+ g1 q
volatile bit LP0                 @ ((unsigned)&LCDPS*8)+0;  // LP0即为变量LCDPS的 bit0
( g$ C. Q' \$ q: E: _: I/ a8 m
# J7 B- N/ a* N% ]  Q: _volatile union {
4 F6 I* o7 r  |; S    struct {
9 [' u/ _6 a/ H        unsigned        LP0                 : 1;) c6 S" m( J' ^( a' o
        unsigned        LP1                 : 1;
* k4 N6 I; o: }2 t9 ^: O        unsigned        LP2                 : 1;
( e* k4 d3 c1 f; F" y: H! }        unsigned        LP3                 : 1;
" g  G. K" ^- E$ S: a$ @( ]        unsigned        WA                  : 1;6 z/ p  i8 ^/ `7 {8 d. {, \4 }
        unsigned        LCDA                : 1;% a7 q# D7 L& H
        unsigned        BIASMD              : 1;0 Z, B& D8 w! b
        unsigned        WFT                 : 1;* \4 L3 t5 ]& c/ m
    };
! c, f! q$ W- J) B! o9 V    struct {
4 v6 A* K2 k9 g! \, W( |" h        unsigned        LP                  : 4;
( J# W. Y4 h! z: i    };
0 W" n0 }- @( [} LCDPSbits @ 0x792;
0 C$ h6 u, z0 g这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。9 X- Q, E2 O( o* a! Z; T
里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义, X8 |2 N6 _, I) A- z2 i) {
# k7 O( J6 P# ?+ k5 |" R
volatile union {
$ e4 p6 _( r: |7 Q    struct {6 X8 S1 g* w. x4 t$ r* C3 c
        unsigned        LP0                 : 1;& S" i( `+ f) F. ?7 K
        unsigned        LP1                 : 1;
) L1 @( N4 ^4 n, ]$ E9 l* L        unsigned        LP2                 : 1;3 P% s$ q; A  h6 v9 Y9 B/ D
        unsigned        LP3                 : 1;. I1 O5 {" d1 Z2 s5 {8 U1 f% Z
        unsigned        WA                  : 1;
4 H' P+ R3 k1 L1 G1 p% g        unsigned        LCDA                : 1;
! L" G4 E8 l, J/ q, t  w        unsigned        BIASMD              : 1;# n: T. D. z& `
        unsigned        WFT                 : 1;
) ^) l3 j* m8 }6 H    }a;
( m- C$ v5 T( S" N' `, W/ v    struct {- B# n: P. Y4 d% N/ O6 ?
        unsigned        LP                  : 4;5 j& j1 H& y6 d2 ]+ _& c
    }b;
. {- G3 F8 V1 i} LCDPSbits @ 0x792;; Y8 n5 W& \$ M0 F' X! [
那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。. z5 g$ a6 z# I- p
LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。
0 E, [( j$ k( t2 W0 k' ]0 {0 z/ q, v. P, }
(3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。

点评

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

该用户从未签到

4#
 楼主| 发表于 2016-7-2 14:31 | 只看该作者
liao821 发表于 2016-7-2 14:24
* `* n! r. {3 t& ?(1)@定义变量的地址4 W1 {* f4 R; S
(2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节 ...

; B1 r! D- W# ]8 j4 _/ n. i非常感谢哈!!!; l; b, N' b  S6 }7 ~, E
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 13:54 , Processed in 0.187500 second(s), 27 queries , Gzip On.

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

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

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