当前位置: 代码迷 >> 单片机 >> AVR单片机 ATmega16 读取IO口电位的奇葩有关问题
  详细解决方案

AVR单片机 ATmega16 读取IO口电位的奇葩有关问题

热度:101   发布时间:2016-04-28 15:26:16.0
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的发光点亮、熄灭有一定的延时性,可在拉高拉低后适当加短延时时间
------解决方案--------------------
楼主走一下单步运行,先看逻辑上能不能实现功能,再说其他。