2015-05-13 9 views
0

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

Любая помощь очень ценна

Редакцией:

Это моя последняя попытка, но теперь это не обнаружить направления и всегда попадающие в первое условие 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(); 
} 

}

+0

Простого опроса 4 контакта без прерывания должно быть достаточно. Вам не нужно столько времени ответа для взаимодействия с пользователем (до 100 мс должно быть достаточным и достижимым в зависимости от реализации кода змеи). –

+0

@ Rev1.0 Спасибо за ваш см, см. Мой отредактированный вопрос :) – Amir

+0

Вы действительно хотите вызвать 'init_interrupts();' все время в то время? Как я и предположил, я не буду использовать прерывания на данный момент. Просто опросите свои входы в 'while()', аналогично тому, что вы делаете в ISR. Кроме того, плохой практикой является выполнение основных функций в ISR (например, call up(), down() и т. Д.), Поскольку вы обычно хотите сократить время выполнения ISR как можно короче. Начните просто. Постарайтесь понять, что вы делаете, не полагайтесь на примерный код, не понимая, что он делает. –

ответ

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^