Пример использования цикла с проверкой условия до тела цикла в программе, написанной на языке программирования С-51, приведен в листинге 7.15. Как и в предыдущих случаях, для иллюстрации возможности повысить наглядность текста программы за счет использования правильно выбранных названий подпрограмм функция, выполняемая в теле цикла, названа TeloCikla.
Пример реализации цикла на языке программирования ASM-51 приведен в листинге 7.16. Эту конструкцию, как и условное выполнение операторов, невозможно реализовать при помощи одной машинной команды, поэтому реализуем его при помощи команд условного и безусловного перехода. На этот раз команда безусловного перехода помещается в конец конструкции и осуществляет переход на команду проверки условия, т. е. на начало конструкции. Команда безусловного перехода sjmp передает управление на начало цикла после выполнения его тела. Расположенная за командой безусловного перехода метка Koncykia обозначает команду, на которую передается управление, когда прекращается выполнение цикла.
В процессе написания программ обычно накапливаются подпрограммы и фрагменты кода, которые можно использовать в нескольких программах. Фрагменты исходного кода можно копировать из программы в программу при помощи текстового редактора, в котором вы пишете программы, однако это может привести к некоторым неудобствам. Прежде всего, разрастается текст программы, и в нем становится трудно ориентироваться при написании и редактировании программы. Кроме того, при обнаружении ошибок в отлаженном ранее участке кода или при переходе к работе с другими устройствами (от светодиодного индикатора к жидкокристаллическому, от микросхемы АЦП одного типа к микросхеме другого типа) приходится искать включенные ранее участки кода и заменять их новыми.
Это трудоемкая работа, которая приводит к ошибкам и, в конечном счете, замедляет написание и отладку программ. Но как же решить эту проблему? Намного удобнее использовать и хранить исходный текст программы в нескольких файлах, предоставляя работу по соединению этих файлов в единую программу транслятору. Обычно в один файл помещается участок кода, работающий с каким-либо конкретным устройством (жидкокристаллическим индикатором, последовательной микросхемой ПЗУ и т. д.) или отвечающий за определенную задачу (вывод цифровой и текстовой информации, помехоустойчивое кодирование, прием управляющих сигналов).
Использование готовых участков кодов позволяет собирать новые программы из готовых кусков как в детском конструкторе. Правда, не стоит надеяться, что эти куски будут так же легко соединяться!
Многофайловые программы
Самым простым способом соединения нескольких файлов в одну программу является использование директивы включения текстового файла.
В языке программирования ASM-51 это директива include. Точно так же, только буквами нижнего регистра записывается эта директива и в языке программирования С.
При использовании директивы include в исходный текст программы добавляется содержимое включаемого файла, и только после этого производится трансляция исходного текста в исполняемый код программы. Иными словами, содержимое главного файла программы и включаемых в него файлов объединяются препроцессором транслятора во временном файле, и только после этого производится трансляция полученного временного файла в исполняемый код микроконтроллера. Пример использования директивы включения текстового файла в программе на языке программирования С-51 приведен в листинге 7.17.
В отдельные файлы выделяются, как правило, описания внутренних регистров микроконтроллера и переменных, связанных с выводами микросхемы микроконтроллера. Рассмотрим для примера содержимое включаемых файлов, имена которых использованы в примере, приведенном в листинге 7.17. Фрагменты исходных текстов этих файлов приведены в листингах 7.18 и 7.19[1].
Содержимое файла IO.h является примером использования отдельного файла для хранения функций, осуществляющих ввод и вывод данных. Такое использование включаемых файлов позволяет разделить программу по функциям. В результате новые программы можно собирать из таких файлов как из кирпичиков, используя готовые уже отлаженные подпрограммы. Таким образом, использование включаемых файлов резко упрощает программирование.
В файле REG51.h объявляются переменные, связанные с регистрами специального назначения микроконтроллера 89с51. Они должны использоваться в любой программе, работающей с микроконтроллером 89с51. Не имеет смысла повторять эти объявления в каждой программе — их можно выделить в отдельный файл, что и сделано в приведенном в листинге 7.19 примере. Более того, файлы объявления регистров специальных функций для различных типов микроконтроллеров обычно поставляются разработчиками компиляторов для исключения ошибок.