Пример выполнения задания

Написать систему программ, в которой подпрограмма вывода массива кодов вызывается каждые 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: