在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Keil C51 xdata基址偏址尋址試驗(yàn)

            Keil C51 xdata基址偏址尋址試驗(yàn)

            作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            本人最近用KEIL C51來做一個(gè)程序,要用到外部數(shù)據(jù)存貯器,也要尋址外部別的芯片,因?yàn)橐玫綄?duì)外部數(shù)據(jù)的連續(xù)讀寫,因此對(duì)xdata做了一點(diǎn)詳細(xì)研究。

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

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

            二、另外一個(gè)情況就是使用_at_指令,這種方式我認(rèn)為不夠靈活,要是連續(xù)讀寫多個(gè)數(shù)據(jù),就要定義一個(gè)數(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的地方尋址,怎么解決這個(gè)問題呢?那就是定義一個(gè)數(shù)組,volatile unchar xdata SCYDRAM[256] _at_ 0x1000;只有這樣,通過數(shù)組來調(diào)用,才能夠得到相應(yīng)的結(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];

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

            四、這里寫的只是我的一點(diǎn)調(diào)試總結(jié),可能有很多理解不對(duì)的地方,請(qǐng)大家指正。



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉