资讯详情

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

在学习开发51+RC500的过程中

发现了两种访问外部寄存器的操作方法 一种是用XBY 方法来直接访问外部寄存器 一种是用基地址加偏移量的方法来访问外部寄存器 两种方法的本质其实都一样,我可以看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 物理上有了地址 逻辑上却不知道 所以不能进行绝对地址操作 -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台