Страница 1 из 1

Бегущие огни,кнопка прерывания.

Добавлено: Сб июн 11, 2011 14:54:38
Andrewtar
Доброго всем Уважаемые форумчане! Есть некий код бегущих огней (взятый с радиопати),
в нём при нажатии кнопки светики бегут в другом направление при отпускание опять в другом! Собственно вот какой вопрос !! как сделать чтоб при отпускание кнопки не менялось направление бега светиков. т.е нажал ,отпустил светики в одну сторону , ещё раз нажал отпустил в дргую!

Re: Бегущие огни,кнопка прерывания.

Добавлено: Сб июн 11, 2011 15:18:12
coredumped

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char temp;
volatile unsigned char direction = 0;
/***Процедура обработки прерывания по Таймеру 1***/

ISR (TIMER1_COMPA_vect)
{
if (direction) // Проверка состояния переключателя
{
temp = temp >> 1; // Сдвиг вправо
if (temp==0)
{ temp = 0b10000000;}
}
else
{
temp = temp << 1; // Сдвиг влево
if (temp==0)
{ temp = 0b00000001;}
}
PORTD=temp; // Запись в порт PD
}

int main(void)
{
unsigned int c;
/***настраиваем порты ввода-вывода***/

DDRC = 0x00;
PORTC = (1 << PC0);
DDRD = 0xFF;
PORTD = 0x00;

/***Настраиваем таймер***/

TCCR1A = 0x00;
TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
TCNT1=0x00;
OCR1A=780; // выбор коэффициента деления
TIMSK=(1 << OCIE1A); // разрешение прерывания по совпадению

temp=0b00000000; // Присвоение начального значения

asm ("sei"); // Разрешение прерываний

while (1) 
{
	if((PINC&(1 << PC0)) == 1) c=0;	
	else
	{
		if(c<=10000) c++; //антидребезг	
		if(c==10000) direction ^= 0xFF; //change direction 
	}
} // Бесконечный цикл

}

Re: Бегущие огни,кнопка прерывания.

Добавлено: Сб июн 11, 2011 15:20:37
Andrewtar
Спасибо большое работает то что надо )) буду кумекать что да как!