中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        可移植程序的探討

        作者: 時(shí)間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
        對(duì)于一些狀態(tài)的集合,盡可能使用enum而不是#define 來定義。

        如:

        本文引用地址:http://www.antipu.com.cn/article/201611/315482.htm

        enum {OFF = 0, ON = 1};

        遠(yuǎn)比

        #define OFF 0

        #define ON 1

        好。

        兩種寫法編譯的效果是一樣的,但是寫程序及看程序的人員來說感覺就不一樣了。用enum定義時(shí),可以覺得OFF與ON是一個(gè)集合,有相關(guān)性(且可減少程序中#define的定義)。但用#define定義時(shí),完全可認(rèn)為OFF與ON不相干。特別是在程序中#define定義過多時(shí),查找并理解它的意思都是一個(gè)痛苦。(如:uc/os,看見它的一大堆#define都頭大,要完全明白那一堆定義都得花不少時(shí)間)

        第二,程序中少用

        #if

        #ifdef

        等條件編譯。不符合條件的程序段是不被編譯的,都不檢查語法錯(cuò)誤,當(dāng)在某些情況下打開了條件開關(guān)時(shí),也許一堆錯(cuò)誤就出現(xiàn)了。而且程序并不利于閱讀,當(dāng)讀程序時(shí)突然得去查找某東東是否#define真是痛苦。

        好了,下面是我的習(xí)慣

        1、I/O口輸出電平定義一下,以后萬一I/O電平驅(qū)動(dòng)取反,一改就好。

        //I/O Port Stutes

        enum {OFF = 0, ON = 1};

        //Led Stutes

        enum {LED_ON = 0, LED_OFF = 1};

        eg. LED = LED _ON; //低電平驅(qū)動(dòng)LED亮。

        2、I/O口與任何的其它IC接口,I/O口都要定義,不能直接使用I/O口。(方便以后用于其它的應(yīng)用中)

        如93C46:

        #define CS93C46 P1_0 //片選信號(hào)

        #define SK93C46 P1_1 //時(shí)鐘信號(hào)

        #define DI93C46 P1_2 //數(shù)據(jù)輸入,相對(duì)93C46而言 (即93C46的數(shù)據(jù)輸入)

        #define DO93C46 P1_3 //數(shù)據(jù)輸出

        如字符型LCD:

        #define LCDPORT P0 //lcd數(shù)據(jù)口

        #define RS P1_7 //數(shù)據(jù)指令選擇。低--ins ; 高--data

        #define RW P1_6 //讀寫選擇。 低--w ; 高--r

        #define EN P1_5 //使能。 高到低--使能。

        3、鍵盤口要定義輸入口及屏蔽字

        如:

        #define KEYMASK 0x0f

        #define KEYPORT P2

        4、串口用中斷驅(qū)動(dòng),要帶Buf。

        5、取按鍵的程序及串口的程序編2個(gè),一個(gè)為非阻塞式,一個(gè)為阻塞式(不按鍵或不收到數(shù)據(jù)不返回)。

        6、晶振頻率要定義

        #define FOSC 11059200ul //頻率

        7、波特律定義

        #define BAUD 4800 //波特率4800

        #define SMODX 0 //是否倍頻 0-NO or 1-YES

        #define T1H_VAL (256 - (UINT8)(FOSC * (1<

        #define T1L_VAL T1H_VAL

        8、延時(shí)程序賦值時(shí)寫成FOSC函數(shù),編譯器會(huì)預(yù)先算,不占用MCU資源

        以后移植方便

        9、液晶程序一定要定義長(zhǎng)寬

        如點(diǎn)陣型:

        #define ROW 64

        #define CLUM 128 /*128*64*/

        字符型:

        #define ROW 4

        #define CLUM 20 /*128*64*/

        #define ROW1_ADDR (0x80 + 0) //第一行地址

        #define ROW2_ADDR (ROW1_ADDR + 0x40) //第二行地址

        #define ROW3_ADDR (ROW1_ADDR + CLUM) //第三行地址

        #define ROW4_ADDR (ROW2_ADDR + CLUM) //第四行地址

        然后所有的和液晶地址有關(guān)的計(jì)算全部引用這2個(gè)量。

        換用任何屏直接一改,高層不變

        10、驅(qū)動(dòng)層與應(yīng)用接口層分在不同的文件,移植方便。

        如:鍵盤、LCD、串口等。

        再說下效率問題:

        switch與if的效率

        switch與if的區(qū)別

        如果純粹比較數(shù)字或字符,建議使用switch,因?yàn)樗粫?huì)在一開始的switch括號(hào)中取出變量值一次,然后將這個(gè)值與下面所設(shè)定的case比較,但如果使用if,每次遇到條件式時(shí),都要取出變量值,效率的差異就在這兒。例如:

        if(a==1)

        //...

        elseif(a==2)

        //...

        elseif(a==3)

        //...

        這個(gè)程序片段在最差的狀況下,也就是a=3時(shí),共需3次比較,而每次比較都必須取出變量a的值一次。如果換成switch:

        switch(a)

        {

        case1:

        //...

        break;

        case2:

        //...

        break;

        case3:

        //...

        break;

        }

        在這個(gè)程序片段中,只在開頭switch的括號(hào)中取出變量a的值,然后逐一比較下面的case,效率的差別就在這兒。當(dāng)然并不是使用if就不好,遇到復(fù)合條件時(shí),switch就幫不上忙了,由于無法在switch中組合復(fù)雜的條件語句,這時(shí)就得使用if了。簡(jiǎn)單地說,if與switch兩者可以搭配著靈活使用。



        關(guān)鍵詞: 可移植程序編

        評(píng)論


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

        關(guān)閉