对我的Atmega644 MCU进行编程时。为什么PORTD | = 0b00100000有效,但PORTD | =(PD5 << 1)不起作用?

时间:2019-04-16 20:10:33

标签: 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>
  #include <util/delay.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <avr/interrupt.h>
  #include "lcd.h"

不确定是否会引起麻烦?我在这里错过了一些非常基本的东西吗?

2 个答案:

答案 0 :(得分:1)

  

PORTD | =(PD5 << 1);

PD5定义为数字5。将其左移一位可得到10,这与所需的值无关。

另一方面,

1 << PD5将为您提供左移1位5位的结果,它等于0b00100000-正是您要得到的结果。

答案 1 :(得分:0)

分配不同。

PORTD |= 0b00100000;

将端口D的第5位设置为1

PORTD |= (PD5 <<1);

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

定义一些宏以打开或关闭LED,以防止每次都必须设置“位”

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

示例用法

if ( put_led_on )
    LEDON;
else
    LEDOFF;

或者感谢您自己的研究

PORTD |= (1<<PD5);

将第5位设置为1