在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁(yè) > 模擬技術(shù) > 牛人業(yè)話 > 單片機(jī)宏定義學(xué)習(xí)手記

            單片機(jī)宏定義學(xué)習(xí)手記

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

              前言:

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

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

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

              (1)最常用的 PAGE 和 BANK

              EMC 的IC是分幾個(gè)page和幾個(gè)bank的,低端的EM78P156等只有一個(gè)bank和一個(gè)page,所以不用切換,新一點(diǎn)的IC基本都要切換的了,這個(gè)經(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個(gè)BANK)

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

              這樣方便多了,而且不會(huì)出錯(cuò)

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

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

              首先看定義:

              FUNC MACRO ARG1,@ARG2

              MOV A,@ARG1

              MOV PORT5,A

              MOV A,ARG2

              MOV PORT6,A

              ENDM

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

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

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

              FUNC 0X10, @0X20

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

              果,等效于:

              MOV A,@0x10

              MOV PORT5,A

              MOV A,0x20

              MOV PORT6,A

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

              (3)說一點(diǎn)C語言的一種良好風(fēng)格

              C語言上面有一種比較好的編程風(fēng)格,給個(gè)C51的例子:

              我們想設(shè)置TIMER0在模式1,TIMER1在模式2

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

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

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

              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 ;

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

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


            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: 單片機(jī) 宏定義

            評(píng)論


            相關(guān)推薦

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

            關(guān)閉