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

Шаг 5. Переходим непосредственно к разработке устройств и программ 287 ется цикл, на каждом проходе которого содержимое регистровой пары Z увеличивается на единицу. После каждого такого увеличения произво ­ дится сравнение нового значения Z с содержимым регистровой пары Ү. Заканчивается цикл тогда, когда содержимое Z и содержимое Ү ока ­ жутся равны. В результате число, записанное в регистровой паре Ү, будет определять количество проходов цикла. Поэтому и время задержки, фор ­ мируемое этим циклом, будет пропорционально константе задержки. Однако это время будет слишком мало для получения приемлемого темпа воспроизведения мелодий. Для того, чтобы увеличить время до нужной нам величины, внутрь главного цикла задержки помещен еще один цикл, имеющий фиксированное количество проходов. Описанная выше процедура задержки занимает строки 121 — 135. В строках 121, 122 производится запись нулевого значения в регистро ­ вую пару Z. Большой цикл задержки занимает строки 123 — 130. Малый внутренний цикл занимает строки 124 — 125. Для хранения параметра малого цикла используется регистр loop. В строке 123 в него записыва ­ ется начальное значение. Строки 124,125 выполняются до тех пор, пока содержимое loop не окажется равным нулю. В строке 126 содержимое регистровой пары Z увеличивается на еди ­ ницу. В строках 127 — 130 производится сравнение содержимого двух регистровых пар Y и Z. Сравнение производится побайтно. Сначала сравниваются младшие байты (строка 127). Если они не равны, оператор условного перехода в строке 128 передает управление на начало цикла. Если младшие байты равны, сравниваются старшие байты (строка 129). Если старшие байты неодинаковы, оператор Ьгпе в строке 130 опять заставляет цикл начинаться с начала. И только когда оба оператора сравнения дадут положительный результат (не вызовут перехода), цикл заканчивается, и подпрограмма формирования задержки переходит к завершающей фазе (к строкам 131 — 135). Программа на языке СИ Возможный вариант программы на языке СИ приведен в листинге 5.18. Прежде чем начинать рассмотрение текста этой программы, необходимо разобраться с одним важным вопросом. В новой программе используется такой новый для нас элемент, как ссылочная (индексная) переменная. Ссылочная переменная — это еще одна фирменная особенность классического СИ, которая широко применяется и позволяет сделать программы проще и эффективнее. В то же время никакой другой эле ­ мент не вызывает столько сложностей у начинающих программистов, как ссылочные переменные. Попробую объяснить этот вопрос как можно понятнее.

RkJQdWJsaXNoZXIy MTExODQxMg==