Доброго всем Уважаемые форумчане! Есть некий код бегущих огней (взятый с радиопати),
в нём при нажатии кнопки светики бегут в другом направление при отпускание опять в другом! Собственно вот какой вопрос !! как сделать чтоб при отпускание кнопки не менялось направление бега светиков. т.е нажал ,отпустил светики в одну сторону , ещё раз нажал отпустил в дргую!
Бегущие огни,кнопка прерывания.
Бегущие огни,кнопка прерывания.
- Вложения
-
- 123.c
- (950 байт) 412 скачиваний
- Реклама
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Бегущие огни,кнопка прерывания.
Код: Выделить всё
#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: Бегущие огни,кнопка прерывания.
Спасибо большое работает то что надо )) буду кумекать что да как!
