完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如下面PIC16F1933为例。
// Register: LCDPS // LCD Phase Register volatile unsigned char LCDPS @ 0x792; // bit and bitfield definitions // LCD Prescaler Selection bits volatile bit LP0 @ ((unsigned)&LCDPS*8)+0; // LCD Prescaler Selection bits volatile bit LP1 @ ((unsigned)&LCDPS*8)+1; // LCD Prescaler Selection bits volatile bit LP2 @ ((unsigned)&LCDPS*8)+2; // LCD Prescaler Selection bits volatile bit LP3 @ ((unsigned)&LCDPS*8)+3; // Write Allow bit volatile bit WA @ ((unsigned)&LCDPS*8)+4; // LCD Active bit volatile bit LCDA @ ((unsigned)&LCDPS*8)+5; // Bias Mode Selection bit volatile bit BIASMD @ ((unsigned)&LCDPS*8)+6; // Waveform Type bit volatile bit WFT @ ((unsigned)&LCDPS*8)+7; #ifndef _LIB_BUILD volatile union { struct { unsigned LP0 : 1; unsigned LP1 : 1; unsigned LP2 : 1; unsigned LP3 : 1; unsigned WA : 1; unsigned LCDA : 1; unsigned BIASMD : 1; unsigned WFT : 1; }; struct { unsigned LP : 4; }; } LCDPSbits @ 0x792; #endif 疑问: 1, volatile bit LP0 @ ((unsigned)&LCDPS*8)+0; 这里的 @是什么用法 ? 2, volatile union { struct { unsigned LP0 : 1; 这里定义一个union包含struct,但是struct里头又指定 LP0为 unsigned类型,但是前面是 bit型。这个怎么理解 ? 3, 还有LP0 :1 ; 是什么意思呢 ? 求指教 ? |
|
相关推荐
|
|
本帖最后由 bj2008wyou 于 2015-4-29 12:03 编辑
(1)@定义变量的地址 (2)union只是一个联合体, 该联合体内成员是2个位域结构体。该联合体占用一个字节,所以这2个位域结构体共享这个字节的部分(或全部)的bit。 volatile unsigned char LCDPS @ 0x792; //LCDPS变量的地址是0x792 volatile bit LP0 @ ((unsigned)&LCDPS*8)+0; // LP0即为变量LCDPS的 bit0 volatile union { struct { unsigned LP0 : 1; unsigned LP1 : 1; unsigned LP2 : 1; unsigned LP3 : 1; unsigned WA : 1; unsigned LCDA : 1; unsigned BIASMD : 1; unsigned WFT : 1; }; struct { unsigned LP : 4; }; } LCDPSbits @ 0x792; 这是说 联合体变量LCDPSbits的地址是 0x792, 且由于只占用一个字节,故该变量与LCDPS基本等同。 里面的struct成员有2个,都是位域结构体类型,暂且称为a和b,即假设这样定义 volatile union { struct { unsigned LP0 : 1; unsigned LP1 : 1; unsigned LP2 : 1; unsigned LP3 : 1; unsigned WA : 1; unsigned LCDA : 1; unsigned BIASMD : 1; unsigned WFT : 1; }a; struct { unsigned LP : 4; }b; } LCDPSbits @ 0x792; 那么就是说,成员a和b共享一个字节,就是开始定义的变量LCDPS,而且a使用完了LCDPS的8个bit,而B只使用了LCDPS的前4个bits。 LCDPSbits.a.LP0与外面定义的bit类型LP0并不冲突,因为变量名的作用域不一样。如果你写 LP0 = 1或者LCDPSbits.a.LP0 = 1,都相当将LCDPS的位0置1。 (3)这是说LP0占用一个bit,你该多看下C语言的位域结构体是怎么定义的就知道了。 |
|
|
|
|
|
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
|
|
|
|
|
|
非常详细!!!!
|
|
|
|
|
|
解释的很好很详细
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2081 浏览 1 评论
3625 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2334 浏览 2 评论
2761 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4022 浏览 5 评论
970浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6353浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 08:49 , Processed in 1.129019 second(s), Total 83, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号