LED 保持亮起。不会打开和关闭

LED stays on. Wont' turn on and off

所以我想做的就是创建一个函数来打开和关闭将被调用到 main 中的 LED。 LED 亮起,但不会打开和关闭。我的代码有什么问题?

我正在使用 ATmega328p 开发板和 Atmel Studio 6.2

#define F_CPU 16000000UL // 16MHz clock from the debug processor
#include <avr/io.h>
#include <util/delay.h>

dot();

int main()
{
    DDRB |= (1<<DDB5);
    while(1)
    {
    dot();
    }
}

int dot()
{
    PORTB |= (1<<PORTB5); // Set port bit B5 to 1 to turn on the LED
    _delay_ms(200); // delay 200mS
    PORTB |= (0<<PORTB5); // Set port bit B5 to 0 to turn on the LED
    _delay_ms(200); // delay 200mS
}

阅读有关位运算符的信息。 a |= b 设置在 a b 中设置的所有位。所以如果 b == 0,它不会改变 a

您需要在第一次延迟后使用位与运算符。这将设置 a b:

中设置的所有位
PORTB &= ~(1U<<PORTB5);

反转运算符~反转掩码,因此它只留下相关位0,所有其他位都是1。所以位号PORTB5将被清除,所有其他保持不变。

注意使用无符号常量。通常建议这样做,因为位运算符和移位是为负值定义的实现,或者如果符号发生变化 - 最好的情况是 未定义的行为 最坏的情况。

|=无法使1变为0。使用和&=.

// dummy line to enable highlight
PORTB &= ~(1<<PORTB5); // Set port bit B5 to 0 to turn on the LED