Описание: Создание "эфекта" бегущих огней |
Поиск в теме | Версия для печати |
lamakazzz |
Отправлено: 13 Марта, 2010 - 12:37:56
|
Главнокомандующий
Сообщений всего: 328
Дата рег-ции: Янв. 2010
|
dimamukhin
если Вы программист, то должны знать, что все задачи, которые не понимаете, - надо рисовать.
Вообще, после того, как Вы уяснили себе задачу - нарисуйте на бумаге блок-схему, некий алгоритм работы вашей программы и Вам будет намного легче, чем прокручивать всё это в голове. Будет виден каждый шаг и Вы поймете, где чего не додумали.
На свой старый код не смотрите, давайте попробуем с нуля. Постановка задачи у Вас есть, теперь разберемся с алгоритмом.
1) Объявляем переменные.
CODE:int i, j; // объявления переменных;
2) Начало Цикла1 (забегая вперед скажу, что нам понадобятся два цикла, при чем второй цикл будет внутри первого, поэтому обозначим их как Цикл1 и Цикл2) .
Итак, в этом цикле мы будем производить итерации и зажигать и оставлять соответствующие диоды, начиная с 8, потом 7, потом 6 и так до 1го. Поэтому в этом цикле будем использовать декремент, что в языке С соответствует i--, где i это переменная (а еще есть --i, но в данном случае это не подходит. и если интересно почему - почитайте литературу).
Получается что-то типо
CODE:for (i = 8; i >= 1; i--) // начало цикла1;
{
3) Начало Цикла2. В этом цикле будем мигать диодами, начиная с 1го и пока не достигнем диода, который уже светит, то есть до i-1. Поэтому в этом цикле будем использовать инкремент j++ и в каждой итерации будем зажигать j-ый светодиод.
CODE: for (j = 1; j <= i-1; j++) // начало цикла2;
{
4) Собсна, что мы должны ща делать? Мигать диодом! для удобства понимания определим некоторую функцию (почему функцию - расскажу позже), с помощью которой будем подавать лог. 1 на порт, соответствующий порядковому номеру нужного диода. Номер этого диода у нас будет как входной параметр:
CODE: Turn_on_LED(j); // Зажигаем светик под номером j. эту функцию напишете сами, думаю, труда не составит. функции вообще для тренировки, можно и без них обойтись
5) чтобы диод погорел - нужно поставить некоторую задержку, поэтому:
CODE: delay_ms(100); // задержка
6) теперь необходимо потушить светик. Вообще говоря, можно использовать ту же самую функцию, что и включение диода - просто инвертировать значения порта и это будет самый лучший вариант в данном случае. Но можно и написать другую функцию, тут уж зависит от полета фантазии. для простоты обозначим функцию так:
CODE: Turn_off_LED(j); // тушим светик под номером j
7) чтобы диод горел с одинаковой периодичностью - нужно поставить такую же задержку, поэтому:
CODE: delay_ms(100); // задержка
8) на этом Цикл2 заканчивается, поэтому:
9) итак, отработая все итерации Цикла2, последний мигнувший диод у нас окажется под номерм i-1. Что нам теперь нужно? Теперь необходимо диод с номером i добавить в список постоянно горящих диодов, поэтому определим некоторую функцию:
CODE:Add_LED_to_List(i); // функцию тоже напишете сами - это домашнее задание :)) (можно ведь и совсем без функции, просто биты соответствующие выставить:)
10) Ну и теперь собсна светим диодами, которые находятся в нашем списке. Опять же, определяем функцию:
CODE:Turn_on_List_LEDs(); // я ленивый, писать тут тоже не хочу, поэтому Вам придется потрудиться XDD
11) Усё, конец Цикла1.
Я бы Вам блок-схему показал, но рисовал на бумаге, а фоткать щас нечем. так что звыняйтэ, бананив нэма XDD(Отредактировано автором: 13 Марта, 2010 - 12:43:03) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (2): [1] 2 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|