找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4080|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:262 发表于 2014-2-22 01:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
在学习开发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 物理上有了地址 逻辑上却不知道
所以不能进行绝对地址操作


板子到了之后我会对这两种方法进行验证
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表