在学习开发51+RC500的过程中
发现了两种访问外部寄存器的操作方法
一种是用XBYTE方法来直接访问外部寄存器
一种是用基地址加偏移量的方法来访问外部寄存器
两种方法的本质其实都一样,我可以看XBYTE的定义
#define XBYTE ((unsigned char volatile xdata *) 0)
XBYTE直接帮我们定义到了xdata
我们再来看第二种方法
unsigned char xdata ini _at_ 0x7f00; // move base address to 0x7f00
unsigned char xdata *GpBase = &ini; // redirect pointer to base address
#define ReadRawIO(addr) (*(GpBase + addr))
#define WriteRawIO(addr,value) *(GpBase + addr) = value
这里用了 xdata ini _at_ 0x7f00; xdata *GpBase=&ini;
让*GpBase指向0x7f00
(*(GpBase + addr))来表示外部寄存器地址
我在读RC500的官方函数文件的时候发现
老外的程序员在读写RC500寄存器的时候
没有进行寄存器页的选择
unsigned char ReadIO(unsigned char Address)
{
static unsigned char c;
c = ReadRawIO(Address); // read value at the specified
// address
return c;
}
#define ReadRawIO(addr) (*(GpBase + addr))
直接对外部寄存器进行读写
网上流传的读写RC500的方法大多用第一种方法 并且进行了寄存器页的选择
unsigned char ReadRawIO(unsigned char Address)
{
return XBYTE[Address];
}
unsigned char ReadIO(unsigned char Address)
{
WriteRawIO(0x00,GetRegPage(Address));
return ReadRawIO(Address);
}
这种方法读起来容易理解 相比第一种方法
最大的区别就是进行了寄存器页的选择
之所以要第一种方法不用进行页寻址
是因为第一种方法采用的是绝对地址
P2口作为高地址P0口作为低地址 扩展了64K的空间
其中unsigned char xdata ini _at_ 0x7f00; // move base address to 0x7f00
这句话的意思是值选中了P2^7这个口扩展的8K空间 是因为RC500的片选信号连接的是P2^7
第二种方法XBYTE直接对外部寄存器进行读写
但是没有对P2口的地址进行说明 虽然连接了P2^7 物理上有了地址 逻辑上却不知道
所以不能进行绝对地址操作