||
比如置PORTB第1位为1可以写成PORTB_Bit1=1;比PORTB|=(1<<PB1);书写方便,变编译效果一样啊。
相比之下很多人觉得没有什么优点啊,不过你如果看下面就知道IAR书写的优点了
把PORTB的第0位传到PORTD的第0位。标准C语言得写成
if(PORTB&(1<<PB0))PORTD|=(1<<PD0);
else PORTD&=~(1<<PD0);
而IAR可以简单的写为PORTD_Bit0=PORTB_Bit0;多方便啊。
但是PORTB_Bit1=1显然还没有PORTB_1=1书写方便啊。其实只需要把iomacro.h里
Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7全部替换为0,1,2,3,4,5,6,7就可以用
PORTB_2书写代替PORTB_BIT2
对于16为寄存器只要
Bit8,Bit9,Bit10,Bit11,Bit12,Bit13,Bit14,Bit15全部替换为8,9,10,11,12,13,14,15就可以了
我们还可以自己定义一个位域这样就可以在所有的文件中直接定义可以位书写变量
#define DATA_SFR_8_BITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \
volatile union { \
unsigned char _NAME; /* The sfrb as 1 byte */ \
struct { /* The sfrb as 8 bits */ \
__BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \
}; \
};
#define DATA_SFR_8N_BITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H, \
_A2,_B2,_C2,_D2,_E2,_F2,_G2,_H2) \
volatile union { \
unsigned char _NAME; /* The sfrb as 1 byte */ \
struct { /* The sfrb as 8 bits */ \
__BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \
}; \
struct { /* The sfrb as 8 bits */ \
__BYTEBITS(_NAME, _A2,_B2,_C2,_D2,_E2,_F2,_G2,_H2) \
}; \
};
//增加的自己定义的8位数据寄存器,不带地址,可以数字位,也可以字符位操作
//这样定义的全局变量就可以位操作书写了
#define DATA_SFR8(_NAME) DATA_SFR_8_BITS(_NAME,0,1,2,3,4,5,6,7)
#define DATA_SFR8N(_NAME, _B7, _B6, _B5, _B4, _B3, _B2, _B1, _B0)\
DATA_SFR_8N_BITS(_NAME, 0,1,2,3,4,5,6,7, \
_B0,_B1,_B2,_B3,_B4,_B5,_B6,_B7)
比如:
DATA_SFR8(h);
void main()
{h_1=1;
}
不过修改的时候记得备份啊
在 intrinsics.h文件里定义了延时函数 __delay_cycles(unsigned long);
延时函数在程序里用的很多,IAR的延时函数是周期个数的,要计算,书写也不方便。
由于comp_a90.h文件里专门包含函数简写的,我们对IAR延时函数修理一下放在comp_a90.h文件里
//延时函数定义,在main.c最前面定义#define CPU_F X
//X对应为你的CPU的频率,单位为M
#ifdef CPU_F
#ifndef delayus
#define delayus(v) __delay_cycles(CPU_F*(long)v)
#endif
#ifndef delayms
#define delayms(v) __delay_cycles(CPU_F*1000*(long)v)
#endif
#endif
在工程里
#define CPU_F 4//最好在文件的最前面啊
#include"iom8.h"
#include "intrinsics.h"
#include "comp_a90.h"
void main()
{
delayus(1000); //延时1000US
delayms(1); //延时1ms