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

评论