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

          新聞中心

          EEPW首頁 > 模擬技術 > 牛人業(yè)話 > 單片機宏定義學習手記

          單片機宏定義學習手記

          作者: 時間:2016-09-26 來源:網(wǎng)絡 收藏

            前言:

          本文引用地址:http://www.ex-cimer.com/article/201609/310319.htm

            這幾天在整理和生產(chǎn)EMC程序的一些宏,發(fā)現(xiàn)這東西真的是好用得超乎了想象,大大的簡化了寫程序時的重復勞動。以下以 EM78P260為主,其實其他型號大通小

            異,注意修改一下寄存器就可以。

            (1)最常用的 PAGE 和 BANK

            EMC 的IC是分幾個page和幾個bank的,低端的EM78P156等只有一個bank和一個page,所以不用切換,新一點的IC基本都要切換的了,這個經(jīng)常用的冬冬,做成宏就最合適,

            代碼如下:

            /*****************************************************

            * BANK SELECTION *

            *****************************************************/

            BANK macro num

            if num == 0

            bc R4,6

            bc R4,7

            elseif num == 1

            bs R4,6

            bc R4,7

            elseif num == 2

            bc R4,6

            bs R4,7

            elseif num == 3

            bs R4,6

            bs R4,7

            else

            message "warring!"

            endif

            endm

            /*****************************************************

            * PAGE SELECTION *

            *****************************************************/

            PAGE macro num

            if num == 0

            bc psw,5

            bc psw,6

            elseif num == 1

            bs psw,5

            bc psw,6

            elseif num == 2

            bc psw,5

            bs psw,6

            elseif num == 3

            bs psw,5

            bs psw,6

            else

            message "warring!"

            endif

            endm

            調(diào)用格式是

            BANK num (num是 0~3 代表4個BANK)

            PAGE num (num是 0~3 代表4個PAGE)

            這樣方便多了,而且不會出錯

            (2)帶參數(shù)的宏

            作為例子,我們假定定義一個宏“ FUNC” ,帶兩個參數(shù),功能是單純的將傳進來的數(shù)據(jù)傳到PORT5 和 PORT6 而已,演示用法。

            首先看定義:

            FUNC MACRO ARG1,@ARG2

            MOV A,@ARG1

            MOV PORT5,A

            MOV A,ARG2

            MOV PORT6,A

            ENDM

            注意到,為什么 ARG1前面有個 @ 的符號的呢?這個代表的是宏接收的第一個參數(shù)是一個立即數(shù),而ARG2沒有那個符號,代表宏接收的第二個參數(shù)是一個寄存器的地址。

            為了程序的統(tǒng)一性,做宏的時候,凡是立即數(shù)的,都加上@符號,普通寄存器變量都不加,形成統(tǒng)一的風格。

            好了,看在主程序怎么用:

            FUNC 0X10, @0X20

            這樣就OK了,編輯器編譯的時候,會自動進行宏替換,將0X10這個立即數(shù)作為第一個參數(shù)傳遞進去,而將0X20寄存器的內(nèi)容,作為第二個參數(shù)傳遞進去,進行宏替換之后的結(jié)

            果,等效于:

            MOV A,@0x10

            MOV PORT5,A

            MOV A,0x20

            MOV PORT6,A

            基本用法就是這樣。不難,試一下就會用。

            (3)說一點C語言的一種良好風格

            C語言上面有一種比較好的編程風格,給個C51的例子:

            我們想設置TIMER0在模式1,TIMER1在模式2

            一般教程的思維和代碼就是:

            翻資料看看TMOD的位的定義,然后慢慢算,模式1和模式2該給什么值,最后寫指令:TMOD = 0x21; 完工…..

            其實我們還可以有另外一種辦法,那就是這樣寫:

            TMOD = CT0_MODE1 | CT1_MODE2 ;

            其中里面用到一些宏,具體定義是:

            #define CT0_MODE0 0x00 // Timer0/Counter0 Mode

            #define CT0_MODE1 0x01

            #define CT0_MODE2 0x02

            #define CT0_MODE3 0x03

            #define CT1_MODE0 0x00 // Timer1/Counter1 Mode

            #define CT1_MODE1 0x10

            #define CT1_MODE2 0x20

            #define CT1_MODE3 0x30

            TMOD = CT0_MODE1 | CT1_MODE2 ;

            這個應該很容易看的懂吧?中間的 “|”是或運算,這個就是編譯器在編譯的時候做的運算了,具體CT0_MODE1 代表 0X01 CT1_MODE2 代表0x20,然后“或運算”之后結(jié)果就是

            0X21 了,跟上面一樣。但是老實說,大家愿意用哪個辦法去做呢?我會毫不猶豫的選擇第二種,有意義的符號比沒有意思的數(shù)據(jù)來的好用。


          上一頁 1 2 下一頁

          關鍵詞: 單片機 宏定義

          評論


          相關推薦

          技術專區(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); })();