Написать систему программ, в которой подпрограмма вывода массива кодов вызывается каждые 1000 мкс. Обработчик прерывания от таймера 0 инкрементирует содержимое ячейки ADRT=50h. Первая программа выполняет циклический анализ содержимого ADRT и вызывает подпрограмму вывода массива кодов в порт Р1. Программа распологается начиная с адреса ADR0=4C8h. Программа должна состоять из двух частей. Первая часть инициализация системы, вторая – анализ содержимого ADRT=3Bh и вызов подпрограммы.
Вторая программа – должна распологаться начиная с адреса ADR1=5E3h. Она должна при каждом обращении передавать в порт Р1 массив длиной 6, расположенный начиная с адреса ADR2=245h.
Выберем начальную константу для таймера таким образом, чтобы прерывание от него поступало каждые 100 мкс. Так как максимальное число в таймере 255, следовательно начальное его значение должно быть 255-100=155=9Bh. Для задания интервала 1000 мкс в ячейке ADRT должен проверяться код 10=Ah.
Программа будет иметь следующий вид:
org 0
jmp start; переход на начало программы
|
|
; обработчик прерывания от ТС0
org 0Bh прерывание от таймера-счетчика ТС0
inc 50h; увеличение ADRT на 1
reti; возврат из прерывания
; организация массива
org 254h объявление массива
db 'Ivanov'
; начало основной программы
org 4C8h начало программы
;первая часть программы - инициализация
start:
mov dptr, #254h; в DPTR записать базу массива
mov tmod, #2; настроить ТС0 в режим 2
mov tl0, #9Bh; начальное значение для ТС0
mov th0, #9Bh; перезагружаемое значение для ТС0
mov ie, #10000010b; разрешить прерывание от ТС0
setb tr0; запустить таймер
; вторая часть программы анализ ADRT и вызов подпрограммы вывода
begin:
mov 50h,#0; инициализация ячейки ADRT
m:
mov a,50h; считать содержимое ADRT
cjne a,#0Ah,m; сравнить c числом 10
call vivod; вызов подпрограммы вывода
jmp begin; переход на начало вывода
; организация подпрограммы
org 5E3h; подпрограмма вывода
vivod:
mov r0,#0; номер выводимого элемента массива
next:
mov a,r0; в А номер выводимого элемента
movc a,@a+dptr; извлечь элемент массива
mov P1,a; вывести
inc r0; перейти к следующему элементу
cjne r0,#6,next; проверить все элементы выведены, если нет, то продолжить
ret; возврат из подпрограммы
end