<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Keil C51 xdata基址偏址尋址試驗

Keil C51 xdata基址偏址尋址試驗

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏
本人最近用KEIL C51來(lái)做一個(gè)程序,要用到外部數據存貯器,也要尋址外部別的芯片,因為要用到對外部數據的連續讀寫(xiě),因此對xdata做了一點(diǎn)詳細研究。

一、 第一種方式是定義外部對址常量,程序如下:

本文引用地址:http://dyxdggzs.com/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就可,主程序中的調用,則此時(shí)返回0x1002的數據。在子程序中要定義一個(gè)xramadd的指針,讓要求的地址指向它。注意要加volatile,這樣在你連讀的情況下,不被編程器優(yōu)化。

二、另外一個(gè)情況就是使用_at_指令,這種方式我認為不夠靈活,要是連續讀寫(xiě)多個(gè)數據,就要定義一個(gè)數組,勢必沒(méi)有指針靈活,程序如下:

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);

}

這樣得到的結果是不正確的,編譯器并沒(méi)有按要求在0x1002的地方尋址,而是在0x1000的地方尋址,怎么解決這個(gè)問(wèn)題呢?那就是定義一個(gè)數組,volatile unchar xdata SCYDRAM[256] _at_ 0x1000;只有這樣,通過(guò)數組來(lái)調用,才能夠得到相應的結果。程序如下:

void readdata(unchar add)

{

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

}

void main()

{

readdata(0x02);

}

這樣讀出的數據是正確的。

三、可以使用XBYTE來(lái)定義,但是要包括#include 此文件。如下。

#include

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

我認為其和_at_指令的做法是一樣的。但是靈活性更差。還不能定義數組。只能是單地址尋址,這種也是主要用在對外部固定地址尋址之用,比如8255,373,AD轉換器等。要連續尋址最好用第一種方法,第二種定義一個(gè)數組也是可以的。

四、這里寫(xiě)的只是我的一點(diǎn)調試總結,可能有很多理解不對的地方,請大家指正。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>