В качестве простого примера доработаем Программу 6.3 таким образом, чтобы она формировала задержки длительностью
Рис. 6.7.
Поскольку в данном случае имеется всего один однобайтный параметр, наиболее удобным местом для размещения в вызывающей программе значения К является рабочий регистр. Таким образом, для формирования 5-с задержки, в вызывающей программе можно написать:
movlw d’50’; 50 х 0.1 с даст нам 5-секундную задержку
call DELAY_K100MS; Сформируем ее!
Сама подпрограмма, код которой приведен в Программе 6.4, реализует следующий алгоритм:
1. ВЫПОЛНЯТЬ, ПОКА K > 0:
а) Сформировать задержку 100 мс.
б) Декрементировать К.
2. Конец.
; *******************
; * ФУНКЦИЯ: Формирует задержку длительностью около К х 100 мс *
; * при частоте резонатора 4 МГц *
; * ПРИМЕР: К = 100, задержка 10 с *
; * ВХОД: К в W, от 1 до 256 *
; * ВЫХОД: Изменяются флаги и W. *
; * Регистры h’30’ и h’31’обнуляются *
; ********************
COUNT1 equ h’30’; Счетчик 100-мс цикла
К equ h’31’; Временная переменная для К
N equ d’249’; Параметр задержки
DELAY_K100MS
movwf К; Сохраняем К в регистре
; ФОРМИРУЕМ 100-мс задержку -------------
DELAY_100MS
movlw d’100’; Инициализируем счетчик 100-мс цикла
movwf COUNT1
DELAY_1MS
movlw N; Инициализируем внутренний цикл
D_LOOP
addlw -1; Декрементируем счетчик
bcfss STATUS,Z; Проверяем: равен нулю?
goto D_LOOP; ЕСЛИ нет, ТО повторяем
decfsz COUNT1,f; Декрементируем счетчик 100-мс цикла
goto DELAY_1MS; и повторяем, пока он не будет равен 0
; Декрементируем К -------------------
decfsz K,f
; ПОКА К > 0 -----------------------------
goto DELAY_100MS; Повторяем 100-мс задержку, ПОКА К > 0
FINI
return
Программа просто копирует значение параметра из W в регистр h’31’, прежде чем приступить к выполнению уже знакомого нам участка кода (он выделен комментариями в виде пунктирной линии), который идентичен коду Программы 6.3 и предназначен для формирования одной задержки длительностью 100 мс. После формирования указанной задержки регистр, содержащий значение К, декрементируется, этот блок выполняется снова, и так до тех пор, пока
Поскольку проверка К на ноль производится после формирования 100-мс задержки[94], то значение