Я хочу реализовать игру Snake с Atmega16 I после this учебник. Моя проблема в том, что я не мог справиться с KeyPad! Я нашел еще один учебник (here) об одной кнопке с прерыванием. Но в Snake нам нужно 4 кнопки для наших указаний. И я не знаю, как справиться с этим в Proteus? мы имеем 3 внешних прерываний и 4 кнопки я не знаю, что делать :(Как управлять направлениями с прерыванием в Proteus
Любая помощь очень ценна
Редакцией:
Это моя последняя попытка, но теперь это не обнаружить направления и всегда попадающие в первое условие 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();
}
}
Простого опроса 4 контакта без прерывания должно быть достаточно. Вам не нужно столько времени ответа для взаимодействия с пользователем (до 100 мс должно быть достаточным и достижимым в зависимости от реализации кода змеи). –
@ Rev1.0 Спасибо за ваш см, см. Мой отредактированный вопрос :) – Amir
Вы действительно хотите вызвать 'init_interrupts();' все время в то время? Как я и предположил, я не буду использовать прерывания на данный момент. Просто опросите свои входы в 'while()', аналогично тому, что вы делаете в ISR. Кроме того, плохой практикой является выполнение основных функций в ISR (например, call up(), down() и т. Д.), Поскольку вы обычно хотите сократить время выполнения ISR как можно короче. Начните просто. Постарайтесь понять, что вы делаете, не полагайтесь на примерный код, не понимая, что он делает. –