如何处理Proteus中的中断指示

时间:2015-05-13 15:03:16

标签: avr atmega atmega16

我想在this教程之后使用Atmega16实现Snake游戏。我的问题是我无法处理KeyPad!我找到了另一个关于一个带有中断的按钮的教程(here)但是在Snake中我们需要4个按钮来指示我并且我不知道如何在Proteus中处理这个问题? 我们有3个外部中断和4个按钮我不知道该怎么做:(

任何帮助真的很感激

已编辑:

这是我的最后一次尝试但是现在它没有检测到方向并且总是在我的中断中进入if语句的第一个条件而不检查其他条件

enter image description here

主要:

void main()

{

TCCR0=0X01;
DDRC=0XFF;
DDRB=0XFF;
DDRD|=(1<<PD0)|(1<<PD1)|(1<<PD7); 
DDRD&=~((1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6));
DDRA=0xFF;

pos=1;
position();
right();

while(1)
{
    no_inp();
    init_interrupts();
}

}

这是我的中断:

ISR (INT0_vect){
sss=0;
if((PIND&(1<<PIND3))&& status!=3)
{
    right();
    status=1;
}
else if((PIND&(1<<PIND4))&& status!=4)
{   
    up();
    status=2;
}
else if((PIND&(1<<PIND5))&& status!=1)
{
    left();
    status=3;
}
else if((PIND&(1<<PIND6))&& status!=2)
{
    down();
    status=4;
}
else
{
    no_inp();
}

}

1 个答案:

答案 0 :(得分:1)

您总是在第一个条件下结束,因为您对按钮使用“低电平有效”逻辑,但是检查该位是否为高电平。但是,未按下时,按钮输入会拉高。因此,只需反转if条件并检查相应的引脚是否为低电平(实际按下)。