ICCAVR位操作的宏定义
C语言位操作的功能是其比较出色的地方,现在许多微处理器都支持C编译器也可看出。汇编语言的位操作也很直观,但在某些C编译器对位操作却不能象汇编中对单个的位进行直接处理,而要转化为对一个字节的操作,在ICCAVR中这种限制充分体现出来。如要对PORTA的PORTA0置1,则应写成PORTA|=0X01;这样的位处在字节的两端还比较直观,但若是要置PORTA的第3位,第6位置1,则写出的程序可读性不强了。于是便有了一些宏操作定义#define BIT(x) (1 << (x))(需要包含头文件macros.h)才可直接使用。下面给出两种置1和清0的宏定义:
置1:
1,#define set(x) (1<<(x))
2,#define setb(temp,x) temp|=(1<<(x))
清0:
1,#define clr(x) (~(1<<(x)))
2,#define clrb(temp,x) temp&=~(1<<(x))
比较上述置1的两种宏定义,
第1种在写1时需写成 PORTA|=set(x); x表要处理的位,
第2种更象函数,使用起来也比较直观:setb(PORTA,x), 可读性比较强
但是第2种却并非是万能的,以MEGA8515为例,USART的UBRRH和UCSRC共用一个I/O location,在写UBRRH的时候最高位必须为0,写UCSRC时则正好相反。上述第2种的置1和清0操作只能对1 个BIT进行操作,所以是不能处理UBRRH和UCSRC的写入工作的,而第1种置1和清0操作却可以通过或/与进行多个位操作的,比如写入UCSRC 0x01可以写作:UCSRC|=set(7)|set(0); 而如果用第2种宏定义则让它太为难了。
两种方法有其利弊,使用的时候靠自己衡量了。
by eleclike @2007-12-5
文章评论(0条评论)
登录后参与讨论