您的位置 首页 芯闻

Keil C51 xdata基址偏址寻址实验

本人最近用KEILC51来做一个程序,要用到外部数据存贮器,也要寻址外部别的芯片,因为要用到对外部数据的连续读写,因此对xdata做…

自己最近用KEIL C51来做一个程序,要用到外部数据存贮器,也要寻址外部其他芯片,由于要用到对外部数据的接连读写,因而对xdata做了一点具体研讨。

一、 榜首种方法是界说外部对址常量,程序如下:

#define XRAM 0x0000
#define CYDRAM 0x1000
#define EPM244H 0x4000
#define EPM244L 0x5000

void readdata(unint add)

{

volatile unchar xdata *xramadd;
xramadd=CYDRAM+add; //justproduce the CS signal of the CY7C024.
rdata=*xramadd;
_nop_();
xramadd=EPM244H;
rdatah=*xramadd;
xramadd=EPM244L;
rdatal=*xramadd;

}

void main()

{

readdata(0x0002);

}

上面程序能够比较灵敏的读出自0x1000今后的地址,直要在后边加上所要读出的偏址add就可,主程序中的调用,则此刻回来0x1002的数据。在子程序中要界说一个xramadd的指针,让要求的地址指向它。留意要加volatile,这样在你连读的状况下,不被编程器优化。

二、别的一个状况便是运用_at_指令,这种方法我以为不行灵敏,要是接连读写多个数据,就要界说一个数组,必然没有指针灵敏,程序如下:

volatile unchar xdata SCYDRAM _at_ 0x1000;
volatile unchar xdata SEPM244H _at_ 0x4000;
volatile unchar xdata SEPM244L _at_ 0x5000;

void readdata(unint add)

{

rdata=SCYDRAM+add; //justproduce the CS signal of the CY7C024.
rdatah=SEPM244H;
rdatal=SEPM244L;

}

void main()

{

readdata(0x0002);

}

这样得到的成果是不正确的,编译器并没有按要求在0x1002的当地寻址,而是在0x1000的当地寻址,怎样处理这个问题呢?那便是界说一个数组,volatile unchar xdata SCYDRAM[256] _at_ 0x1000;只要这样,经过数组来调用,才能够得到相应的成果。程序如下:

void readdata(unchar add)

{

rdata=SCYDRAM[add]; //just make the CS signal of the CY7C024.
rdatah=SEPM244H;
rdatal=SEPM244L;

}

void main()

{

readdata(0x02);

}

这样读出的数据是正确的。

三、能够运用XBYTE来界说,可是要包含#include 此文件。如下。

#include

#define SCYDRAM XBYTE[0x1000];
#define SEPM244H XBYTE[0x4000];
#define SEPM244L XBYTE[0x5000];

我以为其和_at_指令的做法是相同的。可是灵敏性更差。还不能界说数组。只能是单地址寻址,这种也是首要用在对外部固定地址寻址之用,比方8255,373,AD转换器等。要接连寻址最好用榜首种方法,第二种界说一个数组也是能够的。

四、这儿写的仅仅我的一点调试总结,可能有许多了解不对的当地,请我们纠正。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/274386.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部