新聞中心

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

        單片機宏定義學習手記

        作者: 時間:2016-09-26 來源:網絡 收藏

          前言:

        本文引用地址:http://www.104case.com/article/201609/310319.htm

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

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

          (1)最常用的 PAGE 和 BANK

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

          代碼如下:

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

          * 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

          調用格式是

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

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

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

          (2)帶參數的宏

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

          首先看定義:

          FUNC MACRO ARG1,@ARG2

          MOV A,@ARG1

          MOV PORT5,A

          MOV A,ARG2

          MOV PORT6,A

          ENDM

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

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

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

          FUNC 0X10, @0X20

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

          果,等效于:

          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,然后“或運算”之后結果就是

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


        上一頁 1 2 下一頁

        關鍵詞: 單片機 宏定義

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 元阳县| 宁陕县| 襄汾县| 柳河县| 明溪县| 尼玛县| 阿拉善左旗| 河北区| 七台河市| 嵊泗县| 长顺县| 定边县| 大姚县| 咸阳市| 类乌齐县| 司法| 盐池县| 满城县| 绿春县| 隆回县| 建平县| 神木县| 罗山县| 山东| 昌宁县| 吴江市| 台东县| 长汀县| 石家庄市| 麻城市| 阜城县| 綦江县| 临潭县| 富锦市| 驻马店市| 大足县| 尚义县| 涟水县| 南召县| 普安县| 格尔木市|