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

282 Микроконтроллеры AVR от азов программирования... те 12 — те17. Применение удвоенных значений обусловлено необходи ­ мостью перевода адресов из основной адресации в альтернативную. При трансляции программы вместо меток в память будут записаны конкрет ­ ные адреса. Процедура вычисления адреса Большое количество таблиц в нашей программе заставляет позабо ­ титься о процедуре вычисления адреса. Как нам известно из предыдущей программы, для извлечения элемента из таблицы нам необходимо произ ­ вести вычисление его адреса. В новой программе подобные вычисления нам придется выполнять для каждой таблицы. Однотипные вычисления удобно оформить в виде подпрограммы. Эта подпрограмма занимает строки 78 — 84. Вызов подпрограммы произво ­ дится по имени addw. Подпрограмма получает номер элемента таблицы и адрес ее начала. Номер элемента передается в подпрограмму при помощи регистра YL, а адрес — через регистровую пару Z. Используя эти данные, подпрограмма вычисляет адрес нужного эле ­ мента. Для этого она сначала удваивает номер элемента (строка 79). Затем дополняет полученное значение до шестнадцатиразрядного путем записи в YH нулевого байта (строка 80). И, наконец, производит сложение двух шестнадцатиразрядных величин, находящихся к этому моменту в реги ­ стровых парах Y и Z (строки 81, 82). Результат вычислений при этом попадает в регистровую пару Z. Назначение команд push и pop (строки 78,83), по-видимому, уже объяснять не нужно. Текст программы «шаг за шагом» Теперь вернемся к самому началу и рассмотрим текст программы по порядку. Начало программы практически полностью соответствует пред ­ ыдущему примеру (см. листинг 5.15). Небольшое отличие лишь в модуле описания переменных (в новой программе это строки 3 — 10). Теперь там описывается гораздо больше переменных (рабочих регистров). Название и назначение новых переменных прекрасно видны из текста программы. Без изменений остался модуль переопределения векторов прерываний (строки 13— 31) и модуль команд инициализации (строки 32 — 44). Не изменилась даже процедура сканирования управляющих кно ­ пок (строки 45 — 52), которая так же, как и в предыдущем примере, опре ­ деляет номер первого из входов, у которого оказались замкнуты контакты. На этом сходство двух программ заканчивается. Начиная со строки 53, мы видим абсолютно новую программу. Рассмотрим ее подробнее.

RkJQdWJsaXNoZXIy MTExODQxMg==