<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          Keil C51 xdata基址偏址尋址試驗

          作者: 時間:2016-11-11 來源:網絡 收藏
          本人最近用KEIL C51來做一個程序,要用到外部數據存貯器,也要尋址外部別的芯片,因為要用到對外部數據的連續(xù)讀寫,因此對xdata做了一點詳細研究。

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

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

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

          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轉換器等。要連續(xù)尋址最好用第一種方法,第二種定義一個數組也是可以的。

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



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();