日志档案

发表于 2007-12-5 17:27:45

0

标签: ICCAVR  位操作  

ICCAVR位操作的宏定义

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

系统分类: 单片机   |   用户分类: 单片机   |   来源: 原创   |   【推荐给朋友】

    阅读(596)    回复(0)  

投一票您将和博主都有获奖机会!