<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 看了看ICCAVR的庫文件,談幾點(diǎn)感想

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

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

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

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

打開(kāi)macros.h看到了一些宏定義:

BIT指令的來(lái)歷:

#ifndef BIT

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

#endif

flash的來(lái)歷:

#define flashconst/* IAR compatibility */

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

#define NOP()asm("nop")

#define _NOP()asm("nop")

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

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

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

#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

也就是說(shuō)編譯時(shí)PA7是7,1<

聽(tīng)了上面解釋你就明白這個(gè)什么意思了吧:

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

{

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

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

UDR=data;

}

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

#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)題外話(huà),是看到這些頭文件開(kāi)頭都有的兩句話(huà)有感說(shuō)一說(shuō)一些編程技巧,關(guān)于條件編譯的吧.

以iom16v.h為例:

開(kāi)始有這樣兩句話(huà):

#ifndef __iom16v_h
#define __iom16v_h

…………

…內容…

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

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

假如說(shuō)吧:

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

在LCD1602.c中包含"delay.c"時(shí)這樣寫(xiě):

#ifndef _delay_c
#define _delay_c

#include "delay.c"

#endif

同樣在主函數中包含延時(shí)時(shí),也按這種方式寫(xiě),就會(huì )避免重復包含同一個(gè)文件這個(gè)問(wèn)題了。

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

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

#include "delay.c"

#endif

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

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



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>