ATmega 2560 控制 LED 灯亮灭:开关断开时两个灯亮的原因分析
ATmega 2560 控制 LED 灯亮灭:开关断开时两个灯亮的原因分析
假设 +V 连接 LED0, LED1 的头以及开关的头;尾分别连接向 ATmega 2560 的 PD2, PD1, PD0。ATmega 2560 接地。
假设 DDRC 已经被初始化,执行如下代码:
int val = 0;
PORTD |= 0x06;
while (1)
{
PORTD &= ~(1 << val);
if (PIND & 0x01)
{
val += 1;
if (val > 2)
{
val = 2;
}
}
else
{
val = 1;
}
}
问题:开关什么情况下,两个灯都亮?
答案:当开关连接的头和尾都没有接通时,也就是开关处于断开状态时,两个灯都亮。
原因分析:
-
当
val = 0时,执行PORTD &= ~(1 << val)语句,相当于将 PD0 引脚电平拉低,LED0 亮;同时 PD1、PD2 引脚电平为高,LED1 不亮。 -
随后,如果
PIND & 0x01判断结果为 0,即开关未接通,则val被赋值为 1,再执行PORTD &= ~(1 << val)语句,相当于将 PD1 引脚电平拉低,LED1 亮;同时 PD0、PD2 引脚电平为高,LED0 不亮。 -
此时
val = 1,继续执行if语句,由于开关未接通,val被赋值为 1,再次执行PORTD &= ~(1 << val)语句,相当于将 PD1 引脚电平拉低,LED1 仍然亮着,同时 PD0、PD2 引脚电平为高,LED0 还是不亮。
因此,当开关未接通时,两个灯都亮。
原文地址: https://www.cveoy.top/t/topic/ojU9 著作权归作者所有。请勿转载和采集!