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

Шаг 5. Переходим непосредственно к разработке устройств и программ 225 Следующий этап процедуры сдвига — вызов подпрограммы задержки. Вызов этой подпрограммы происходит в строке 27. В строке 28 произво ­ дится сдвиг содержимого регистра rab на один бит вправо. В строке 29 оператор Ьгсс проверяет состояние признака переноса. Эта проверка позволяет обнаружить момент, когда закончится полный цикл сдвига. Как это происходит, иллюстрирует табл. 5.2. В таблице показаны значения всех разрядов вспомогательного регистра rab для каждого из восьми шагов, составляющих полный цикл сдвига. Разряды сдвигаемого регистра обозначены как Ь7 — ЬО. Последний стол ­ бец показывает содержимое признака переноса. Как видно из таблицы, единица, которая в начале находится в самом старшем разряде, при каж ­ дом очередном шаге сдвигается в соседнюю позицию. Сдвиг информации в рабочем регистре Таблица 5.2 Шаг Ь7 Ьб Ь5 Ь4 ьз Ь2 ы ЬО с 1 1 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 0 0 3 0 0 1 0 0 0 0 0 0 4 0 0 0 1 0 0 0 0 0 5 0 0 0 0 1 0 0 0 0 б 0 0 0 0 0 1 а 0 0 7 0 0 0 0 0 0 1 0 0 8 0 0 0 0 0 0 0 1 0 9 0 0 0 0 0 0 0 0 1 В результате, после восьмого шага она оказывается в ячейке признака переноса. Пока С равно нулю, оператор Ьгсс в строке 29 передает управ ­ ление по метке m2, и цикл сдвига продолжается. После восьмого шага при ­ знак переноса С станет равен единице. Поэтому перехода на начало цикла в строке 29 не произойдет, и управление перейдет к строке 30. В результате очередного девятого цикла сдвига не произойдет. Оператор безусловного перехода в строке 30 передаст управление на начало основного цикла, и программа снова приступит к проверке состояния кнопки. Процедура сдвига влево занимает строки 31 — 38. Эта процедура рабо ­ тает точно так же, как и процедура сдвига вправо. Отличия: ♦ начальное значение, записываемое в регистр rab (см. строку 31), равно 0Ь00000001; ♦ вместо оператора lsr (сдвиг вправо) в строке 36 использован опе ­ ратор lsl (сдвиг влево). В качестве подпрограммы задержки применена уже известная нам подпрограмма с тремя вложенными циклами. Текст этой подпрограммы полностью скопирован из предыдущего примера (листинг 5.7) и распо ­ ложен в строках 39 — 55.

RkJQdWJsaXNoZXIy MTExODQxMg==