Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 5. Переходим непосредственно к разработке устройств и программ 293 50 ACSR=0x80; // Инициализация (отключение) компаратора 51 TCCR1A=0x00; // Инициализация таймера счетчика Т1 52 TCCR1B=0x09; 53 while (1) 54 ml. temp=PIND; 55 for (count=0; count<7, count++) // Цикл сканирования датчиков 56 if (( temp&l)==0) goto m3, // Проверка младшего бита переменной temp 57 temp »= 1; // Сдвиг содержимого temp 58 m2. TC(?R1 A=0x00, // Выключение звука 59 goto ml; // Переход на начало // Воспроизведение мелодии 60 m3 ’ nota = tabm[count]; 61 m4: if (PIND==0x7F) goto m2; 62 if (*nota==0xFF) goto m3, 63 fnota = (*nota)&0x1F; 64 dnota = ((*nota)»5)&0x07, 65 if (fnota==0) goto m5, 66 0CR1A=tabkd[fnota] , 67 TCCR1A=0x40, 68 m5. delay ms ( tabz[dnota] ); 69 TCCRlA=0x00; 70 delay_ms (tabzfO]); 71 nota++, 72 goto m4; // Устанавливаем указатель на первую ноту // Если ни одна кнопка не нажата, закончить // Проверка на конец мелодии И Определяем код тона // Определяем код длительности // Если пауза не воспроизводим звук И Программируем частоту звука // Включаем звук // Формируем задержку // Выключаем звук // Задержка между нотами // Перемещаем указатель на следующую ноту // К началу цикла Строки 60 — 72 занимает процедура проигрывания мелодии. Проигрывание начинается с того, что в переменную nota помещается указатель на массив, содержащий нужную нам мелодию (строка 60). А указатель — это элемент массива tabm с номером, равным коду нажатой кнопки. В строках 61 — 72 находится цикл, который последовательно счи тывает мелодию нота за нотой и проигрывает прочитанные ноты. Цикл организован при помощи оператора безусловного перехода (строка 72). Для перемещения вдоль массива содержимое переменной nota каж дый раз увеличивается на единицу (строка 71). В этом же цикле произво дятся проверка состояния клавиатуры (нажата ли еще хоть одна кнопка) и проверка признака конца мелодии. Рассмотрим подробнее, как все это делается. Проверка состояния клавиатуры происходит в строке 61. Если содер жимое регистра PIND равно 0x7F, то воспроизведение мелодии прекра щается. Управление передается по метке m2. Там происходит выключение звука, а затем переход по метке ml, то есть к началу основного цикла про граммы. Если хоть одна кнопка еще нажата, перехода не происходит и воспро изведение мелодии продолжается. В строке 62 производится проверка на конец мелодии. Содержимое элемента массива, на который указывает ссылочная переменная nota (код ноты), проверяется на равенство числу OxFF. Если код ноты равен ОхҒҒ, то управление передается по метке m3, где указатель снова устанавливается на начало мелодии. В строке 63 вычисляется значение кода тона. Для этого на код ноты, на который указывает переменная nota, накладывается маска. Наложение
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==