按位宏不起作用(Avr C)

时间:2014-07-17 08:58:07

标签: c macros bitwise-operators avr

我正面临着这个宏的一些问题:

#define SHOW(val)   PORTB = ((PORTB & 0xFF^OUT_PINS) | ((val) & OUT_PINS));

我们说(我之前已定义)

#define OUT_PINS 0b00011110

PORTB在我要保留的其他位上有一些值。

该宏旨在将val应用于PORTB(仅限OUT_PINS),其余部分单独使用。

但是,我只是在所有输出引脚上获得1。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

好的,这是一个愚蠢的错误。

#define SEG_DOT     _BV(PB1)
#define SEG_DIAG1   _BV(PB2)
#define SEG_DIAG2   _BV(PB3)
#define SEG_HORIZ   _BV(PB4)

#define BUTTON      _BV(PB0)

#define OUT_PINS    SEG_DOT | SEG_DIAG1 | SEG_DIAG2 | SEG_HORIZ
#define IN_PINS     BUTTON

#define BTN()       (PINB & BUTTON == 0)
#define SHOW(val)   PORTB = ((PORTB & ~OUT_PINS) | ((val) & OUT_PINS));

正如您所看到的,OUT_PINS宏没有括号,因此当它在SHOW宏中展开时,这一切都变得非常废话。

两种可能的修复方法:

#define OUT_PINS    (SEG_DOT | SEG_DIAG1 | SEG_DIAG2 | SEG_HORIZ)

OR

#define SHOW(val)   PORTB = ((PORTB & ~(OUT_PINS)) | ((val) & (OUT_PINS)));

我更喜欢第一个修复,因为第二个看起来非常Lispy。但是,毕竟为什么不同时使用两者。