我正面临着这个宏的一些问题:
#define SHOW(val) PORTB = ((PORTB & 0xFF^OUT_PINS) | ((val) & OUT_PINS));
我们说(我之前已定义)
#define OUT_PINS 0b00011110
和PORTB
在我要保留的其他位上有一些值。
该宏旨在将val
应用于PORTB
(仅限OUT_PINS
),其余部分单独使用。
但是,我只是在所有输出引脚上获得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。但是,毕竟为什么不同时使用两者。