ПРАКТИКУМ ПО ОМПТ. Практикум по основам микропроцессорной техники Саранск 2003 удк 004. 384 378. 146147
Скачать 0.74 Mb.
|
4.6. Пример программы к лабораторной работе №2.Цель второй лабораторной работы состоит в создании программы по управлению аппаратными средствами, в данном случае - собственными аппаратными средствами отладочного устройства. Программа должна с определенной периодичностью менять на индикаторах УОУ заданную последовательность символов (шестнадцатеричных цифр), подчиняющуюся той или иной закономерности. П ринцип формирования изображения какого-либо символа на семисегментном индикаторе состоит в том, что каждому сегменту индикатора соответствует определенный разряд посылаемого на этот индикатор двоичного кода. Если сегмент нужно зажечь, то в этот разряд записывается “1”, в противном случае – “0”. Соответствие между сегментами индикатора и разрядами двоичного кода, а также пример получения кода цифры “3” проиллюстрированы на рис. 11. Рис. 11. Принцип формирования кодов семисегментных индикаторов Для того, чтобы информация появилась на нужном индикаторе, необходимо ее записать в буфер индикации. Буфер индикации представляет собой область ОЗУ учебно-отладочного устройства, из которой записанные там коды передаются на соответствующие индикаторы. Адреса ячеек буфера индикации и их соответствие конкретным индикаторам на передней панели УОУ приведены в таблице 11. Таблица 11. Буфер индикации
Необходимые для работы индикаторов семисегментные коды шестнадцатеричных символов в принципе могут быть получены путем аппаратной дешифрации соответствующих четырехбитных значений от 0H до FH. В УОУ используется программный способ получения кодов, при котором в ПЗУ по адресам 02B3H – 02C2H помещена таблица семисегментных кодов всех символов (табл. 12), и адрес ячейки с нужным кодом может быть вычислен путем сложения соответствующего значения с базовым адресом таблицы. Например, адрес, по которому хранится семисегментный код цифры “3”, равен 02B3H + 3H = 02B6H. Таблица 12. Семисегментные коды символов
Требуемая временная задержка может быть обеспечена за счет выполнения необходимого числа раз некоторого программного цикла. В простейшем случае в цикл включаются лишь команды отсчета числа этих циклов. Для определения времени выполнения цикла подсчитывается количество машинных тактов, за которое выполняются команды цикла. Время выполнения одного машинного такта на УОУ “Электроника - 580” в режиме “прогон” составляет 0,5 мкс (тактовая частота 2 МГц). Зная время выполнения одного цикла и величину необходимой задержки, легко определить необходимое количество циклов повторения. Число машинных тактов, которое включает в себя каждая команда микропроцессора КР580ВМ80А приведено в описании его системы команд. Рассмотрим пример подпрограммы временной задержки TIMER, перед обращением к которой (по команде CALL TIMER) необходимо загрузить число циклов задержки в регистровую пару ВС. TIMER: DCX B ; число машинных тактов равно 5 MOV A,B ; 5 ORA C ; 4 JNZ TIMER ; 10 RET В каждом из циклов содержимое регистровой пары BC уменьшается на единицу. Выход из программы осуществляется тогда, когда значение в регистровой паре станет равным нулю. Так как при выполнении команды DCX B признаки не устанавливаются, то для проверки обнуления регистровой пары используется операция ИЛИ между содержимым обоих регистров. Результат этой операции равен нулю только в том случае, когда содержимое каждого из регистров B и C равно нулю. Четыре команды цикла выполняются за 24 такта или за 12 мкс. Таким образом, при коде временной задержки FFFFH, что соответствует 65535 циклам, будет получена задержка 12 * 65535 мкс = 786,42 мс (около 0,79 с). Для получения задержки, например, 0,35 с необходимо разделить это значение на длительность одного цикла: 0,35 с / 12 мкс = 29167 = 71EFH. Рассмотрим далее в качестве примера программу, реализующую вывод на индикацию (на индикаторы 1 и 2) последовательности символов: 0_, _F, 1_, _E, 2_, _D, … , E_, _1, F_, _0, 0_, _F, 1_, _E, … Логика данной последовательности состоит в том, что оба индикатора работают поочередно, на первом цифры сменяются в порядке возрастания от 0 до F, а на втором – в порядке убывания от F до 0. Для реализации последовательности в общем случае необходимо организовать цикл с соответствующим изменением переменных цикла и вычислением необходимых адресов таблицы семисегментных кодов для вывода их содержимого на индикаторы. Однако для упрощения программы можно непосредственно оперировать адресами таблицы семисегментных кодов, изменяя один от 02B3H до 03C2H, а другой от 03C2H до 02B3H. В качестве первого указателя таблицы семисегментных кодов будем использовать регистровую пару HL, а в качестве второго – регистровую пару DE. Текст программы на языке ассемблера, реализующей заданную последовательность изменения символов с периодом 0,35 с (с использованием вышеописанной подпрограммы TIMER), приведен ниже. START: LXI H, 02B3H ; начальная установка указателей LXI D, 02C2H ; таблицы семисегментных кодов CYCLE: MOV A, M ; загрузка кода символа по указателю 1 STA 83F8H ; вывод символа на индикатор 1 XRA A ; обнуление аккумулятора STA 83F9H ; гашение индикатора 2 INX H ; перевод указателя 1 вперед по таблице кодов LXI B, 71EFH ; загрузка кода временной задержки CALL TIMER ; выполнение временной задержки STA 83F8H ; гашение индикатора 1 LDAX D ; загрузка кода символа по указателю 2 STA 83F9H ; вывод символа на индикатор 2 DCX D ; перевод указателя 2 назад по таблице кодов LXI B, 71EFH ; загрузка кода временной задержки CALL TIMER ; выполнение временной задержки MOV A, E ; проверка, не вышел ли указатель 2 CPI B2H ; за начало таблицы кодов JNZ CYCLE ; если не вышел, то переход на начало цикла JMP START ; иначе – переход на начальную установку В приведенной программе для получения нулевого кода в аккумуляторе с целью гашения индикатора в первый раз используется команда XRA A (операция ИСКЛЮЧАЮЩЕЕ ИЛИ, когда оба операнда берутся из аккумулятора). Во второй раз используется тот факт, что при выходе из подпрограммы TIMER аккумулятор обязательно обнулен. В конце программы проверяется содержимое регистра E на равенство B2H, что является признаком выхода второго указателя (регистровой пары DE) за пределы таблицы семисегментных кодов (содержимое регистра D всегда равно 02H). Основную программу длиной 44 байта и подпрограмму TIMER длиной 7 байт можно разместить в памяти в произвольном порядке – одну вслед за другой, общая длина кода программы получится равной 51 байт. Например, при расположении программы с адреса 8200H последний байт ее попадет по адресу 8232H. |