Поскольку рабочий регистр требуется для инициализации регистра COUNT1 и организации внутреннего 1-мс цикла, мы не можем использовать его для хранения величины К во время выполнения подпрограммы. Вообще говоря, если бы вызывающая программа знала, что регистр h’31’ используется подпрограммой для хранения значения
В качестве примера рассмотрим Программу 6.5, в которой реализован тот же самый алгоритм, только блок формирования 100-мс задержки вызывается как существующая подпрограмма (код которой приведен в Программе 6.3), т. е. является вложенной подпрограммой. Предположим, что для хранения параметра
; ************************
; * ФУНКЦИЯ: Формирует задержку длительностью около К х 100 мс *
; * при частоте резонатора 4 МГц *
; * ПРИМЕР: К = 100, задержка 10 с *
; * ВХОД: К в W, от 1 до 256 *
; * ВЫХОД: Изменяются флаги и W. *
; * Регистры h’30’ и h’31’ обнуляются *
; ************************
К equ h’31’; Временная переменная для К
DELAY_K100MS
movwf К; Сохраняем К в регистре
; Задача 1: ФОРМИРУЕМ 100-мс задержку ------------
DK_LOOP
call DELAY_100MS
; Задача 2: Декрементируем К -------------------------
decfsz K,f; Декрементируем К
; Задача 3: ПОКА К > 0 -----------------------------------
goto DK_LOOP; ПОВТОРЯЕМ, ПОКА К > 0
return
Подпрограмма, код которой приведен в Программе 6.4, все еще имеет тип void, т. е. не возвращает никаких значений в вызвавшую программу. В качестве следующего примера мы напишем подпрограмму, результатом работы которой будет однобайтное значение. Эта подпрограмма будет использоваться совместно с цифровым индикатором. Большинство таких индикаторов работают по принципу выборочного включения требуемых сегментов, как показано на Рис. 6.8. Обычно эти сегменты представляют собой светодиоды (см. Рис. 11.15 на стр. 361) или электроды элемента на жидких кристаллах.
Рис. 6.8.
Системное представление нашей подпрограммы приведено на Рис. 6.8,