我一直在试图理解为什么行
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"
不确定是否会引起麻烦?我在这里错过了一些非常基本的东西吗?
答案 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