防滑销钉 发表于 2013-10-11 16:22:11

pic中头文件中关于寄存器的绝对定位

在pic18中关于特殊寄存器的定义,我看的不是很明白。如下所示:

// Register: PORTA
volatile unsigned char         PORTA               @ 0x005;
// bit and bitfield definitions
volatile bit RA0               @ ((unsigned)&PORTA*8)+0;
volatile bit RA1               @ ((unsigned)&PORTA*8)+1;
volatile bit RA2               @ ((unsigned)&PORTA*8)+2;
volatile bit RA3               @ ((unsigned)&PORTA*8)+3;
volatile bit RA4               @ ((unsigned)&PORTA*8)+4;
volatile bit RA5               @ ((unsigned)&PORTA*8)+5;
volatile bit RA6               @ ((unsigned)&PORTA*8)+6;
volatile bit RA7               @ ((unsigned)&PORTA*8)+7;


就我的理解,第一行是对寄存器PORTA的绝对定位,PORTA地址在内存0x005地址处。下面是对PORTA寄存器每一位的绝对定位。
1.关于对PORTA的绝对定位,这种方法和#define PORTA ((*(volatile unsigned char *)0x005))有什么区别呢?
    我百度了很多资料,都没有找到关于@这个符号的具体用法。
2.关于每一位的定义,首先是对PORTA取址,用到了“&”取址符,然后再强制转换为unsigned,然后再乘以8,在加上0到7。
实在是理解不了了。
   对PORTA取址,变成地址0x005,然后强制转换为unsigned型地址,即转换为一个指向位变量的地址,但是还有一个乘以8,这个是为什么呢?

khuohuo 发表于 2013-10-11 16:51:40

参考《PIC单片机入门与实战》中位变量的说明。

防滑销钉 发表于 2013-10-11 17:11:46

khuohuo 发表于 2013-10-11 16:51 static/image/common/back.gif
参考《PIC单片机入门与实战》中位变量的说明。

这本书我看来,我知道是这样用的,但是不理解啊
那个*8到底是什么意思啊?

khuohuo 发表于 2013-10-11 17:29:25

本帖最后由 khuohuo 于 2013-10-11 17:34 编辑

我记得应该是:PICC会对存储器中所有的位进行编码定位。
书中有个公式的。
x位的寄存器地址=位地址/8      
位偏移=位地址%8
书中有讲为什么这样做,好像是为了提高编程效率,有效的使用位命令。
详细请参看书中内容,有具体说明的。在应用方法的前面。

eduhf_123 发表于 2013-11-5 01:32:06

看看这张图就全明白了。

eduhf_123 发表于 2013-11-5 01:33:23

提示:乘以8相当于左移3位。
页: [1]
查看完整版本: pic中头文件中关于寄存器的绝对定位