Keil C51 xdata基址偏址尋址試驗
一、 第一種方式是定義外部對址常量,程序如下:
本文引用地址:http://m.butianyuan.cn/article/201611/316607.htm#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就可,主程序中的調(diào)用,則此時返回0x1002的數(shù)據(jù)。在子程序中要定義一個xramadd的指針,讓要求的地址指向它。注意要加volatile,這樣在你連讀的情況下,不被編程器優(yōu)化。
二、另外一個情況就是使用_at_指令,這種方式我認為不夠靈活,要是連續(xù)讀寫多個數(shù)據(jù),就要定義一個數(shù)組,勢必沒有指針靈活,程序如下:
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);
}
這樣得到的結(jié)果是不正確的,編譯器并沒有按要求在0x1002的地方尋址,而是在0x1000的地方尋址,怎么解決這個問題呢?那就是定義一個數(shù)組,volatile unchar xdata SCYDRAM[256] _at_ 0x1000;只有這樣,通過數(shù)組來調(diào)用,才能夠得到相應的結(jié)果。程序如下:
void readdata(unchar add)
{
rdata=SCYDRAM[add]; //just make the CS signal of the CY7C024.
rdatah=SEPM244H;
rdatal=SEPM244L;
}
void main()
{
readdata(0x02);
}
這樣讀出的數(shù)據(jù)是正確的。
三、可以使用XBYTE來定義,但是要包括#include 此文件。如下。
#include
#define SCYDRAM XBYTE[0x1000];
#define SEPM244H XBYTE[0x4000];
#define SEPM244L XBYTE[0x5000];
我認為其和_at_指令的做法是一樣的。但是靈活性更差。還不能定義數(shù)組。只能是單地址尋址,這種也是主要用在對外部固定地址尋址之用,比如8255,373,AD轉(zhuǎn)換器等。要連續(xù)尋址最好用第一種方法,第二種定義一個數(shù)組也是可以的。
四、這里寫的只是我的一點調(diào)試總結(jié),可能有很多理解不對的地方,請大家指正。
評論