頭文件含義
avr_macros.h里面包含了讀寫16位寄存器的簡化書寫,和幾個位操作函數(shù)
comp_a90.h對大量的內(nèi)在函數(shù)做了簡要書寫
ina90.h包含"inavr.h""comp_A90.h"文件
intrinsics.h內(nèi)在函數(shù)提供最簡單的操作處理器底層特征。休眠,看門狗,F(xiàn)LASH函數(shù)。
iomacro.HI/O寄存器定義文件樣本。
iom8.h包含I/O等寄存器定義
位操作
在c語言里對位的操作如一般如下:
PORTB|=(1<<2); //置PORTB的第2位=1
PORTB&=~(1<<2); //置PORTB的第2位=0
PORTB^|=(1<<2); //取反PORTB的第2位
While(PORTB&(1<<2)); //判斷1
While(!(PORTB&(1<<2))); //判斷為0
IAR編譯器對位的支持更強大,除了上面的方法外還有以下更簡單的操作方法:
PORTB_Bit2=1;//置PORTB的第2位=1
PORTB_Bit2=0;//置PORTB的第2位=0
PORTB_Bit2=~PORTB_Bit2;//取反PORTB的第2位
While(PORTB_Bit2);或者while(PORTB_Bit2==1);//判斷1
while(PORTB_Bit2==0);//判斷0
PORTC_Bit4=PORTB_Bit2;//把PORTB的第2位傳送到PORTC的第4位
位變量定義:
由于iar使用了擴展語言,它對位域的支持變?yōu)樽钚閏har類型,我們可以很方便地用來定義位變量。
采用結(jié)構(gòu)體來定義位變量:
struct
{
unsignedcharbit0:1;
unsignedcharbit1:1;
unsignedcharbit2:1;
unsignedcharbit3:1;
unsignedcharbit4:1;
unsignedcharbit5:1;
unsignedcharbit6:1;
unsignedcharbit7:1;
}t;
然后就可以用以下位變量
t.bit0=1;
t.bit0=~t.bit0;
但是采用以上結(jié)構(gòu)體做出來的位變量只可以訪問t的位,不能夠直接訪問變量t,和標準的IAR位操作也不一樣,可以采用聯(lián)合體來定義。
#include
union
{
unsignedchart;
struct
{unsignedchart_bit0:1,
t_bit1:1,
t_bit2:1,
t_bit3:1,
t_bit4:1,
t_bit5:1,
t_bit6:1,
t_bit7:1;
};
};
voidmain(void)
{
t_bit0=1;//訪問變量t的位
t_bit0=~t_bit0;
PORTB=t;//直接訪問變量t
}
延時函數(shù)
__delay_cycles(unsignedlong);
如果處理器頻率為1M,延時100us,如下:
__delay_cycles(100);
延時任意時間
#define CPU_F 8000000
#define delay_us(x) __delay_cycles(CPU_F*x/1000000)
#define delay_ms(x) __delay_cycles(CPU_F*x/1000)
中斷函數(shù):
在IAR編譯器里用關(guān)鍵字來__interrupt來定義一個中斷函數(shù),用#pragmavector來提供中斷函數(shù)的入口地址
#pragmavector=0x12 //定時器0溢出中斷入口地址
__interruptvoidtime0(void)
{
;
}
上面的入口地址寫成#pragmavector=TIMER0_OVF_vect更直觀,每種中斷的入口地址在頭文件里有描述。
中斷指令
__disable_interrupt(); //也可以用_CLI();也可以SREG_Bit7=0;
__enable_interrupt(); //也可以用_SEI();也可以SREG_Bit7=1;
MCU控制指令
__no_operation(); //空操作指令
_NOP();
__sleep(); //休眠指令
_SLEEP();
__watchdog_reset(); //看門狗清零
_WDR();
來源:暢學電子
審核編輯:何安
-
AVR單片機
+關(guān)注
關(guān)注
22文章
607瀏覽量
55484 -
IAR
+關(guān)注
關(guān)注
5文章
350瀏覽量
36664
發(fā)布評論請先 登錄
相關(guān)推薦
評論