Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

284 Микроконтроллеры AVR от азов программирования... случае — если все кнопки отпущены. Если хотя бы одна кнопка нажата, то при чтении порта мы получим другое значение. Проверкой вышеописанного условия занимается оператор breq в строке 63. Если все кнопки оказались отпущены, этот оператор завер ­ шает цикл воспроизведения мелодии и передает управление на метку ml, то есть на самое начало основного цикла программы. Там происходит выключение звука, а затем новое сканирование клавиатуры. Если хотя бы одна кнопка окажется нажатой, то цикл воспроизведе ­ ния звука продолжается дальше, и управление переходит к строке 64, где происходит извлечение кода ноты. Так как адрес этой ноты находится в регистровой паре Z (указатель текущей ноты), то для извлечения ноты просто используется команда 1pm. В строке 65 происходит проверка признака конца мелодии. Только что прочитанный код ноты сравнивается с кодом OxFF. Оператор breq в строке 66 передает управление по метке гп4, если мелодия действительно закончилась (условие выполняется). Если код ноты не равен OxFF, пере ­ хода не происходит, и управление переходит к строке 67. В строках 67 — 75 происходит обработка кода ноты. То есть из кода ноты выделяется код тона и код длительности. Сначала на код ноты наклады ­ вается маска, которая оставляет пять младших разрядов, а три старших сбрасывает (строка 67). Под действием маски в регистре temp остается код тона, который затем помещается в регистр f nota (строка 68). Теперь нам нужно найти код длительности ноты. Для этого нам заново придется извлечь код ноты из памяти программ. Так как до этого момента мы не изменяли положение указателя текущей ноты, то для извлечения нет никаких препятствий. В строке 69 мы повторно извле ­ каем код ноты из памяти программ. Но на этот раз значение указателя увеличивается. Теперь можно приступать к выделению кода длительно ­ сти. Как вы помните, длительность кодируется тремя младшими битами кода ноты. Для выделения этих битов нам также нужно использовать маску. Но одной маской нам не обойтись. Нам нужно не про ­ сто выделить три старших раз ­ ряда, а сделать их младшими, как это показано на рис. 5.16. Процедура выделения кода длительности занимает строки 70 — 74. Сначала про ­ грамма производит много ­ кратный циклический сдвиг кода ноты до тех пор, пока три старших разряда не станут Рис. 5.16. Разложение кода ноты Код тона 0 0 0 d4 d3 d2 d1 dO 1 L J k t d7 d6 d5 d4 d3 d2 d1 dO длительности 0 0 0 0 0 d2 d1 dO

RkJQdWJsaXNoZXIy MTExODQxMg==