AVR单片机 ATmega16 读取IO口电位的奇葩问题?
IO状态是这样的。
DDRD=0x00;
PORTD=0x00;
程序是这样的:
while(1)
{
if((PIND&BIT(4))==0x10)
{
PORTB&=~BIT(0); //输出一个低电平,点亮发光管。
}
else
{
PORTB&=~BIT(4); //输出一个低电平,点亮发光管。
}
}
无论PD4是高还是低,为什么两个指示灯都是亮的呢?我用的开发板测试的。
使用仿真软件发现,即使是低电平程序莫名就跑到了 PORTB&=~BIT(0);这里。。按理说这里是高电平才会进入的,问题在哪里呢? 单片机 avr atmega16
[解决办法]
PORTB&=~BIT(4); 这条语句仅仅能够使PB4=0,不能够使PB0=1;同理,PORTB&=~BIT(0);仅仅能够使PB0=0,不能够使PB4=1;
所以,只要你改变过PD4的电平,输出过高和低两种电平后,两指示灯就都亮了,不会灭掉。
[解决办法]
PB口要设置成输出态
[解决办法]
if((PIND&BIT(4))==0x10)
LZ首先要确认的是,你的这个条件,能在外部触发变化的时候,能正确的进入两个分支
然后,再谈你现在的LED的输出
LED的亮灭,这个和接法有一定关系,具体还要看你的接法
[解决办法]
LED的发光点亮、熄灭有一定的延时性,可在拉高拉低后适当加短延时时间
[解决办法]
楼主走一下单步运行,先看逻辑上能不能实现功能,再说其他。