
Для реализации блока "логическое выражение", изображенного на рис. 7.5 в виде ромба, можно использовать любую команду условного перехода, входящую в систему команд микропроцессора. При этом в простейшем случае логическое выражение сводится к анализу сигналов на выводах микроконтроллера или его внутренних флагов. Но в отличие от двумерной блок-схемы, память программ микропроцессора одномерна, т. е. все команды располагаются друг за другом. Для того чтобы выполнялся только один из операторов ("Действие 1" или "Действие 2"), необходимо после выполнения одного из них обойти другой. Это можно осуществить при помощи команды безусловного перехода.
Размещение различных частей конструкции управления "условное выполнение операторов" в памяти программ микропроцессора приведены на рис. 7.6. Направления возможных переходов при ее выполнении показаны на этом же рисунке. При использовании такой конструкции будет выполнены только один из операторов. Какой - зависит от результатов выполнения условного выражения.

Рис. 7.6.Размещение различных частей конструкции управления условным выполнением операторов в памяти программ микропроцессора
В листинге 7.10 проявляется еще одно полезное свойство подпрограмм. Команды условного перехода, используемые для реализации условного выражения, могут передавать управление на участок программы, отстоящий от них не более чем на 127 байтов. Однако для реализации алгоритма одной из ветвей может потребоваться большее количество команд. Выделение их в отдельную подпрограмму позволяет сократить необходимое расстояние условного перехода до трех байт (длины команды вызова подпрограммы LCALL). Подпрограмма может быть размещена в любом месте памяти программ микроконтроллера.
Конструкция условного выполнения операторов может использоваться в неполном варианте, когда присутствует только один оператор. Для ее реализации не обязательно использовать команду безусловного перехода. Она легко реализуется одной командой условного перехода, входящей в состав системы команд любого микропроцессора (а значит и языка программирования ассемблер для него). Однако если система команд микропроцессора неполная (например, есть команда проверки на равенство, но нет проверки на неравенство), то для реализации противоположного оператора тоже может потребоваться команда безусловного перехода.
Блок-схема и примеры реализации конструкции управления условным выполнением одного оператора на языках программирования С-51 и ASM-51 приведены на рис. 7.7 и в листингах 7.11 и 7.12. Каждый из исходных текстов содержит очень подробные комментарии, поэтому дополнительные пояснения не понадобятся.

Рис. 7.7.Блок-схема конструкции управления условным выполнением одного оператора


Конструкция управления циклическим выполнением оператора с проверкой условия после тела цикла
Третья конструкция управления - это циклическое выполнение оператора с проверкой условия после тела цикла. Оператор (или операторы), который должен повторяться в процессе выполнения этой конструкции, называется телом цикла. В процессе выполнения этих операторов обычно модифицируется некоторая переменная, значение которой влияет на завершение цикла. Эта переменная получила название "параметр цикла".
Отметим, что параметр цикла может изменяться и аппаратурой, подключенной к микроконтроллеру или входящей в его состав.
Блок-схема конструкции управления циклическим выполнением оператора с проверкой условия после тела цикла приведена на рис. 7.8. Напомню, что в качестве тела цикла можно использовать любую структурную конструкцию, в том числе и еще один оператор цикла.

Рис. 7.8.Блок-схема конструкции управления циклическим выполнением оператора с проверкой условия после тела цикла
На языках программирования высокого уровня такая конструкция входит в состав языка (оператор do… while в языке программирования С или оператор repeat… until в языке программирования PASCAL). Пример использования циклического выполнения оператора с проверкой условия после тела цикла на языке программирования С приведен в листинге 7.13. Обратите внимание, что в приведенном примере в качестве логического выражения использована константа - единица. Это приводит к бесконечному циклу, эквивалентному безусловной передаче управления на начало тела цикла при помощи ассемблерной команды jmp.

Не сложнее реализуется эта структурная конструкция управления и на языке программирования ассемблер при помощи команды условного или безусловного (для организации бесконечного цикла) перехода. Реализация конструкции цикла с проверкой условия после тела цикла очень похожа на реализацию конструкции условного выполнения оператора.
Отличие заключается в том, что передача управления в команде условного перехода осуществляется не вперед, как при условном выполнении оператора, а назад, на начало цикла. В системе команд микроконтроллеров семейства MCS-51 для реализации цикла с проверкой условия после тела цикла введена специальная команда - djnz. Она позволяет реализовать сразу два алгоритмических действия: вычитания единицы из параметра цикла и проверку содержимого параметра цикла на равенство нулю. Для обозначения начала тела цикла в программе на языке программирования ассемблер применяется метка.
Пример реализации оператора цикла с проверкой условия после тела цикла на языке программирования ASM-51 приведен в листинге 7.14. В этом примере предполагается опрос бита завершения приема байта последовательным портом RI, который объявлен где-то в тексте программы как переменная PrinjatByte.

Структурная конструкция циклического выполнения оператора с проверкой условия до тела цикла
Четвертая структурная конструкция управления - это цикл с проверкой условия до тела цикла. В отличие от предыдущего оператора тело цикла в этом операторе может ни разу не выполниться, если условие завершения цикла сразу же выполнено. Блок-схема цикла с проверкой условия до тела цикла приведена на рис. 7.9.

Рис. 7.9.Блок-схема структурной конструкции управления "циклическое выполнение оператора с проверкой условия до тела цикла"
Конструкция цикла с проверкой условия до тела цикла может быть реализована при помощи средств, входящих в состав языка программирования С-51, как впрочем и других языков, предназначенных для разработки структурированных программ.
Пример использования цикла с проверкой условия до тела цикла в программе, написанной на языке программирования С-51, приведен в листинге 7.15. Как и в предыдущих случаях, для иллюстрации возможности повысить наглядность текста программы за счет использования правильно выбранных названий подпрограмм функция, выполняемая в теле цикла, названа TeloCikla.

Пример реализации цикла на языке программирования ASM-51 приведен в листинге 7.16. Эту конструкцию, как и условное выполнение операторов, невозможно реализовать при помощи одной машинной команды, поэтому реализуем его при помощи команд условного и безусловного перехода. На этот раз команда безусловного перехода помещается в конец конструкции и осуществляет переход на команду проверки условия, т. е. на начало конструкции. Команда безусловного перехода sjmp передает управление на начало цикла после выполнения его тела. Расположенная за командой безусловного перехода метка Koncykia обозначает команду, на которую передается управление, когда прекращается выполнение цикла.
