原创 ICCAVR位操作的宏定义

2007-12-5 17:27 4088 7 7 分类: MCU/ 嵌入式
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条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条