首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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种宏定义则让它太为难了。
两种方法有其利弊,使用的时候靠自己衡量了。

关键字:ICC  AVR  位操作  宏定义
返回列表