新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 看了看ICCAVR的庫文件,談幾點感想

        看了看ICCAVR的庫文件,談幾點感想

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

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

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

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

        BIT指令的來歷:

        #ifndef BIT

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

        #endif

        flash的來歷:

        #define flashconst/* IAR compatibility */

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

        #define NOP()asm("nop")

        #define _NOP()asm("nop")

        還有幾條關于看門狗喂狗的和開總中斷關總中斷的:

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

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

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

        #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)//串口單字節發送函數

        {

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

        //將數據放入緩沖器,發送數據

        UDR=data;

        }

        以下是對USARA寄存器及寄存器內各個位的定義:

        #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)

        明白了嗎?

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

        以iom16v.h為例:

        開始有這樣兩句話:

        #ifndef __iom16v_h
        #define __iom16v_h

        …………

        …內容…

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

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

        假如說吧:

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

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

        #ifndef _delay_c
        #define _delay_c

        #include "delay.c"

        #endif

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

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

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

        #include "delay.c"

        #endif

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

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



        關鍵詞: ICCAVR庫文

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 融水| 曲周县| 丘北县| 九龙城区| 曲阳县| 凤冈县| 磐安县| 定日县| 酒泉市| 太仆寺旗| 广南县| 庆城县| 武山县| 肇州县| 垦利县| 竹溪县| 桂林市| 皮山县| 河北区| 雅江县| 桐柏县| 巴彦县| 壶关县| 塘沽区| 乌鲁木齐县| 大余县| 井陉县| 沙雅县| 洛宁县| 秀山| 吉安县| 察哈| 苍南县| 承德市| 临沂市| 马龙县| 两当县| 临猗县| 满洲里市| 滨州市| 平远县|