专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:lch900   来源:lch900   点击数:  更新时间:2014年05月16日   【字体:

 在学习开发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 物理上有了地址 逻辑上却不知道
 
所以不能进行绝对地址操作
关闭窗口

相关文章