方法1--宏定义方式
我们来看对一个端口中位0(BIT0)的位操作程序是如何实现的,因此,假定P1.0 是输出,P1.1 是输入。
定义位操作宏如下:
#define P1BIT0_OUT_HIGH P1OUT |=BIT0
#define P1BIT0_OUT_LOW P1OUT &=~BIT0
#define P1BIT1_IN P1IN &=BIT1
注:BIT0,BIT1 定义在相应430 器件的头文件中使用位操作
......
P1BIT0_OUT_HIGH; //输出P1.0 为高
if(P1BIT_IN) P1BIT0_OUT_LOW; //如果P1.1 输入高,则输出P1.0 低
......
从某种程度上,这种编程方法具备高级语言的编程特点,具有很好的可读性,可移植性也不错,也是目前用的比较多的方法。但是缺点,是不能把宏定义统一起来,每个宏需要程序员自己定义,由此,在多项目管理中,对代码的移植性带来了一些问题。同时,也存在着一些潜在的问题,例如,无意的错误定义等。这给程序调试多多少少带来一些负面影响。
方法2--使用IO 头文件方式
IAR 除了提供目前我们经常使用的mspx43xxx.h 头文件外,其实,也定义了可以进行位操作的寄存器结构定义。还是以P1 口的BIT0,BIT1 为例。这个头文件就是io 头文件,根据不同的器件,命名为io430xxx.h,在这些头文件中,将每个寄存器封装到一个联合结构中,因此,我们既可以象方法1 一样,通过自己定义宏,实现自己的位操作,也可以像51 一样,进行位操作。使用方法如下:
......
P1OUT_bit.POUT_0=1; //输出P1.0 为高
if(P1IN_bit.PIN_1) P1OUT_bit.POUT_0=0; //如果P1.1 输入高,则输出P1.0 低
......
IO 方法,表述方法没有方法1 好。但是比较直接,当然,为了更好的可读性,可以再次重新定义宏。如下:
#define P1BIT0_OUT_HIGH P1OUT_bit.POUT_0=1
#define P1BIT0_OUT_LOW P1OUT_bit.POUT_0=0
#define P1BIT1_IN P1IN_bit.PIN_1
如此定义后,可直接使用方法1 编制的源代码,唯一的,需要修改方法1 所定义的宏了。
总结
两种方法产生的汇编代码,是相同的,仅仅是对同一个对象的不同表述而已。建议用户采用io 定义方法,因为,io 定义几乎包含了mspx430xxx.h 的所有定义,一般而言,可以直接替换。此外,用这两种编程时,建议中断和低功耗采用如下函数,他们包括在头文件intrinsics.h 中。
中断:
__disable_interrupt();
__enable_interrupt();
SR 寄存器:
__bis_SR_register(设置参数);
__bic_SR_register(设置参数);
功耗模式:
__low_power_mode_0();
__low_power_mode_1();
__low_power_mode_2();
__low_power_mode_3();
__low_power_mode_4();
__low_power_mode_off_on_exit();