头文件含义
avr_macros.h里面包含了读写16位寄存器的简化书写,和几个位操作函数
comp_a90.h对大量的内在函数做了简要书写
ina90.h包含"inavr.h""comp_A90.h"文件
intrinsics.h内在函数提供最简单的操作处理器底层特征。休眠,看门狗,FLASH函数。
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使用了扩展语言,它对位域的支持变为最小为char类型,我们可以很方便地用来定义位变量。
采用结构体来定义位变量:
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;
但是采用以上结构体做出来的位变量只可以访问t的位,不能够直接访问变量t,和标准的IAR位操作也不一样,可以采用联合体来定义。
#include<iom16.h>
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
}
延时函数
__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)
中断函数:
在IAR编译器里用关键字来__interrupt来定义一个中断函数,用#pragmavector来提供中断函数的入口地址
#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();