gpt4 book ai didi

c - 按位宏不起作用 (Avr C)

转载 作者:行者123 更新时间:2023-11-30 15:31:27 26 4
gpt4 key购买 nike

我在使用此宏时遇到一些问题:

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

假设我已经(之前定义)

#define OUT_PINS 0b00011110

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

该宏旨在将 val 应用于 PORTB(仅限 OUT_PINS),而保留其余部分。

但是,我只是在所有输出引脚上得到 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)

或者

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

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

关于c - 按位宏不起作用 (Avr C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com