在编程我的Atmega644 MCU时。为什么PORTD |=0b00100000可以工作,而PORTD |=(PD5

在编程我的Atmega644 MCU时。为什么PORTD |=0b00100000可以工作,而PORTD |=(PD5,c,microcontroller,atmega,atmel,C,Microcontroller,Atmega,Atmel,我一直在试图弄明白为什么要排队 PORTD |= 0b00100000; 行,但不行 PORTD |= (PD5 <<1); 我有一个连接到PD5的LED,它只在第一个命令时亮起。 我必须定义什么是PD5吗?我从来没有在我的Atmega328P上这样做过,但现在在Atmega644上它不工作了 这里是我包含的库 #define F_CPU 1000000UL // 1MHz internal clock #include <avr/io.h> #inc

我一直在试图弄明白为什么要排队

 PORTD |= 0b00100000;
行,但不行

PORTD |= (PD5 <<1);
我有一个连接到PD5的LED,它只在第一个命令时亮起。 我必须定义什么是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);
示例用法

if ( put_led_on )
    LEDON;
else
    LEDOFF;
或者感谢你自己的研究

PORTD |= (1<<PD5);
这将把位5设置为1


真的吗?这是一个非常基本的错误,谢谢你的澄清。那么,将PORTD的第5位PIND5设置为1的正确语法是什么呢?在一天结束时,我只想将PIND5的位设置为0或1,而不改变其他位。我不使用AtMega,但我知道它们类似于PICs,经过一些研究后,您需要使用第一种类型的赋值清除并设置适当的位。我已经用一些代码更新了答案。我发现了怎么做,你可以像这样做。对不起,但是你关于这里发生了什么的假设是不正确的。AVR头文件将PD5定义为5,而不是访问PIND第5位的宏。对不起,10==0x0a,而不是0x12,恐怕。。。。另外,最好用括号定义LEDON PORTD |=0x00100000,或者更好地定义LEDON do{PORTD |=0b00100000;}while0。什么是PD5,它是如何定义的?请通过提交示例代码、预期结果和实际结果来阅读和编辑您的问题。你说我必须定义什么是PD5是什么意思?我们应该为您定义它吗?你说不起作用是什么意思???很好。谢谢你指出这一点。
PORTD |= (1<<PD5);