在为我的 Atmega644 MCU 编程时。为什么 PORTD |= 0b00100000 有效,但 PORTD |= (PD5 <<1) 无效?

When programming my Atmega644 MCU. Why does PORTD |= 0b00100000 work, but not PORTD |= (PD5 <<1)?

我一直在努力理解为什么

这行
 PORTD |= 0b00100000;

有效,但无效

PORTD |= (PD5 <<1);

我有一个 LED 连接到 PD5,它只在第一个命令时亮起。 我必须定义 "PD5" 是什么吗?我从来不需要在我的 Atmega328P 上这样做,但现在在 Atmega644 上它不起作用?

这是我包含的库

  #define F_CPU 1000000UL  // 1MHz internal clock
  #include <avr/io.h>
  #include <util/delay.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <avr/interrupt.h>
  #include "lcd.h"

不确定是否会引起麻烦?我是否遗漏了一些非常基本的东西?

作业不同。

PORTD |= 0b00100000;

将端口 D 的位 5 设置为 1

PORTD |= (PD5 <<1);

将 PORTD 的第 1 位和第 2 位设置为 1(因为 PD5 == 5 和 PD5 << 1 == 10 (0x0A) 即 1010 二进制)

定义一些宏来设置 LED 开或关,避免每次都设置 'bits'

#define LEDON PORTD |= 0b00100000
#define LEDOFF PORTD &= ~0b00100000

用法示例

if ( put_led_on )
    LEDON;
else
    LEDOFF;

或者感谢你自己的研究

PORTD |= (1<<PD5);

这会将位 5 设置为 1

PORTD |= (PD5 <<1);

PD5 定义为数字 5。将它左移一位得到 10,这与您想要的值无关。

另一方面,

1 << PD5 会给你左移 1 5 位的结果,它等于 0b00100000——正是你想要的。