在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 看了看ICCAVR的庫文件,談幾點(diǎn)感想

            看了看ICCAVR的庫文件,談幾點(diǎn)感想

            作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            一直以來在論壇常見到網(wǎng)友們說什么包含庫文件后是不是就不用自已寫器件的驅(qū)動程序了?(比如說LCD的,延時函數(shù),SPI,UART,E2PROM等等),編了這么久的程序,也一直是“悶”著頭寫程序,只知道BIT指令等等是在macros.h中定義的,PA等等端口的地址也是在iomXXv.h中定義的,也沒細(xì)想過什么,知其然即可,呵呵,不求甚解。。。

            本文引用地址:http://www.biyoush.com/article/201611/317061.htm

            今天看到此帖:avr.com/bbs/dispbbs.asp?boardid=2&Id=30" rel="nofollow">[下載]ICCAVR庫函數(shù)源程序 突然想去看看,于是到ICC的安裝目錄下,到include文件夾中看了看,感覺有些收獲,故發(fā)此帖。

            打開macros.h看到了一些宏定義:

            BIT指令的來歷:

            #ifndef BIT

            #define BIT(x)(1 << (x))

            #endif

            flash的來歷:

            #define flashconst/* IAR compatibility */

            一直不明白在ICC中asm("nop"); _NOP(); NOP(); 是不是一樣的,前者容易理解,是在C中嵌入?yún)R編,可為什么后兩者都能編譯通過呢?看看在macros.h中的兩條宏定義你就明白了:

            #define NOP()asm("nop")

            #define _NOP()asm("nop")

            還有幾條關(guān)于看門狗喂狗的和開總中斷關(guān)總中斷的:

            #define WDR() asm("wdr") //喂狗

            #define SEI()asm("sei") //開總中斷

            #define CLI()asm("cli") //關(guān)總中斷

            #define _WDR() asm("wdr")

            #define _SEI()asm("sei")

            #define _CLI()asm("cli")

            明白了一些東西嗎?

            看看iom16v.h文件,你就可以明白PORTA|=(1<

            #define PA7 7

            也就是說編譯時PA7是7,1<

            聽了上面解釋你就明白這個什么意思了吧:

            void usart_send(unsigned char data)//串口單字節(jié)發(fā)送函數(shù)

            {

            while(!(UCSRA&BIT(UDRE)));

            //將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù)

            UDR=data;

            }

            以下是對USARA寄存器及寄存器內(nèi)各個位的定義:

            #define UCSRA(*(volatile unsigned char *)0x2B)

            #define RXC 7

            #define TXC 6

            #define UDRE 5

            #define FE 4

            #define DOR 3

            #define OVR 3 /*This definition differs from the databook*/

            #define PE 2

            #define U2X 1

            #define MPCM 0

            #define UDR(*(volatile unsigned char *)0x2C)

            明白了嗎?

            談一點(diǎn)題外話,是看到這些頭文件開頭都有的兩句話有感說一說一些編程技巧,關(guān)于條件編譯的吧.

            以iom16v.h為例:

            開始有這樣兩句話:

            #ifndef __iom16v_h
            #define __iom16v_h

            …………

            …內(nèi)容…

            …………
            #endif
            這樣有一個好處就是不重復(fù)定義。

            因此在我們編程時,可以用這種編程思想:

            假如說吧:

            我們要用到LCD1602的功能函數(shù),而在這個LCD文件(取名為LCD1602.c)時又要用到延時函數(shù)(取名為delay.c),在主函數(shù)中我們也要用到delay.c,但你就會發(fā)現(xiàn),如果在主函數(shù)中加入#include "LCD1602.c"后,再包含#include "delay.c"就會編譯出錯,說你重復(fù)定義`delay文件中的函數(shù)。因此我們可以這樣:

            在LCD1602.c中包含"delay.c"時這樣寫:

            #ifndef _delay_c
            #define _delay_c

            #include "delay.c"

            #endif

            同樣在主函數(shù)中包含延時時,也按這種方式寫,就會避免重復(fù)包含同一個文件這個問題了。

            可能有許多網(wǎng)友不明白條件編譯,解釋一下上面幾句話吧:

            #ifndef _delay_c//如果沒有定義過_delay_c才對下面的語句進(jìn)行編譯,范圍到#endif結(jié)束
            #define _delay_c

            #include "delay.c"

            #endif

            可能有些網(wǎng)友感覺自已可以運(yùn)籌帷幄這個問題,但你想過沒,如果你編的程序很大,而且經(jīng)常相互包含文件呢?

            以上僅為個人觀點(diǎn),不足與不妥及錯誤之處敬請廣大網(wǎng)友批評指證!



            關(guān)鍵詞: ICCAVR庫文

            評論


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

            關(guān)閉