Keil C51 xdata基址偏址寻址试验[转]
标签:
c51基址it |
分类:软件技术 |
http://blog.sina.com.cn/s/blog_44153f8f0100eqsj.html
#defineXRAM
#defineCYDRAM
#defineEPM244H
#defineEPM244L
void readdata(unint add)
{
}
void main()
{
}
上面程序可以比较灵活的读出自0x1000以后的地址,直要在后面加上所要读出的偏址add就可,主程序中的调用,则此时返回0x1002的数据。在子程序中要定义一个xramadd的指针,让要求的地址指向它。注意要加volatile,这样在你连读的情况下,不被编程器优化。
二、另外一个情况就是使用_at_指令,这种方式我认为不够灵活,要是连续读写多个数据,就要定义一个数组,势必没有指针灵活,程序如下:
volatile unchar xdataSCYDRAM
volatile unchar xdataSEPM244H
volatile unchar xdataSEPM244L
void readdata(unint add)
{
}
void main()
{
}
这样得到的结果是不正确的,编译器并没有按要求在0x1002的地方寻址,而是在0x1000的地方寻址,怎么解决这个问题呢是定义一个数组,volatile unchar xdataSCYDRAM[256]
void readdata(unchar add)
{
}
void main()
{
}
这样读出的数据是正确的。
三、可以使用XBYTE来定义,但是要包括#include
#include
#defineSCYDRAM
#define SEPM244H
#define SEPM244L
我认为其和_at_指令的做法是一样的。但是灵活性更差。还不能定义数组。只能是单地址寻址,这种也是主要用在对外部固定地址寻址之用,比如8255,373,AD转换器等。要连续寻址最好用第一种方法,第二种定义一个数组也是可以的。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!