今天在用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种方法比较直观, 也是本质, 所以决定以后就用它定义。
评论