Как справляться с прерываниями в Протеусе

Я хочу реализовать игру Snake с Atmega16 I, следуя этому уроку. Моя проблема в том, что я не могу справиться с клавиатурой! Я нашел другой урок ( здесь) об одной кнопке с прерыванием. Но в Снейке нам нужны 4 кнопки для наших указаний. И я не знаю, как справиться с этим в Proteus? у нас есть 3 внешних прерывания и 4 кнопки, я не знаю, что делать:(

Любая помощь действительно ценится

ИЗДАНО:

Это моя последняя попытка, но теперь она не определяет направления и всегда попадает в первое условие оператора if в моем прерывании и не проверяет другие условия.

введите описание изображения здесь

Главный:

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 ответ

Решение

Вы всегда заканчиваете первое условие, потому что вы используете логику "активный низкий уровень" для своих кнопок, но вы проверяете, имеет ли бит высокий уровень. Однако, когда не нажата, ваши кнопки вводятся в высокий уровень. Так что просто инвертируйте ваше условие if и проверьте, является ли соответствующий вывод НИЗКИМ (фактически нажатым).

Другие вопросы по тегам