关于51单片机访问外部寄存器的方法

在学习开发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 物理上有了地址 逻辑上却不知道,所以不能进行绝对地址操作
永不止步步 发表于11-19 10:12 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:307967个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号