正文

<012> WinAVR中sbi()和cbi()函数编译报错的解决2006-09-13 17:58:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/18509.html

分享到:

今天在用WinAVR的20050214版本时发现编译无法通过,不能识别sbi()cbi()函数。论坛里查了一下,原来是这个版本里没有定义这两个函数。(查看 帖1, 帖2)

看了一下, 大概有三种方法解决:


<1>

#ifndef sbi 
    #define sbi(reg,bit)   reg |= (_BV(bit)) 
#endif
 
#ifndef cbi 
    #define cbi(reg,bit)   reg &= ~(_BV(bit)) 
#endif

<2>

#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

<3>

#define sbi(x, y)  (x |= (1 << y))   /*置位寄器x的第y位*/
#define clr(x, y)  (x &= ~(1 <<y ))  /*清零寄器x的第y位*/

其实前两种方法追根溯源还是用的第三种方法, 因为_BV是用<<定义的。 可以在WinAVR的安装目录下\include\avr中找到一个sfr_defs.h文件,里面有对_BV的定义:

#define _BV(bit) (1 << (bit))

觉得还是用第3种方法比较直观, 也是本质, 所以决定以后就用它定义。

阅读(6332) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册