【问题标题】:LED stays on. Wont' turn on and offLED 保持亮起。不会'打开和关闭
【发布时间】:2015-09-21 01:15:32
【问题描述】:

所以我要做的就是创建一个函数来打开和关闭 LED,这将被调用到 main 中。 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
}

【问题讨论】:

    标签: c led atmega atmel


    【解决方案1】:

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

    在第一次延迟之后,您需要位与运算符。这将设置在a b 中设置的所有位:

    PORTB &= ~(1U<<PORTB5);
    

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

    注意使用无符号常量。通常建议这样做,因为位运算符和移位是针对负值或符号更改的实现定义的 - 充其量是未定义的行为

    【讨论】:

      【解决方案2】:

      或者|= 不能将1 变成0。使用 and&amp;=

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多