Читайте также:
|
|
В качестве примера ниже приведена программа, реализующая секундомер на таймере TC1, с использованием преобразования данных в BCD формат с помощью команды деления div AB и динамической индикацией полученного результата.
;*******ЛАБОРАТОРНАЯ РАБОТА 11*************
;*****Программа изучения преобразования BCD*********
; Производится динамическая индикация числа
; хранящегося в регистре R1(секунды)
; с предварительным преобразованием
; в двоично-десятичный формат в двух правых разрядах
; индикатора стенда HL2
; циклически с интервалом 1 сек значение регистра R1 увеличивается на 1
; по достижении числа 3Ch(60) регистр сбрасывается и счет начинается заново
; интервал 1 сек реализован с использованием прерывания от таймера Т1
; вектор переполнения 001Bh
; составил А. Н. Алаев
; ********************************************************
.ORG 0; установка указателя сч команд для ассемблера на 0
clr IE.7;глобальный запрет прерываний
mov TMOD,#00010001b;запретить упр. Т0,T1 от вн. вывода, уст. Т0,T1
; в 16-ти разр режим с синхр. от внутр. генератора
mov TL1,#175;запись в мл. регистр Т1 начального условия
;мл. байт дополняющего кода числа 50000
mov TH1,#60;запись в ст. регистр Т1 начального условия
;ст. байт дополняющего кода числа 50000
setb tcon.6;запуск таймера Т1
ljmp ind;безусловный переход на ПП индикации ind
;**********************************************************
.ORG 001Bh; установка указателя сч. для ассемблера на вектор прерывания
; от переполнения таймера T1
ljmp schet; безусловный перход на ПП обработки прерывания
;***************************************************************
ind:; основная подпрограмма счета и динамической индикации
setb IE.3; разрешение прерываний по переполнению таймера Т1
ind1:
;**********************************************************
call preobr; вызов подпрограммы преобразования в BCD формат
;************************************************************
clr IE.7; глобальный запрет прерываний
mov A,R3; пересылка в акк. индицируемого числа
anl A,#00001111b;обнуление старшей тетрады (поготовка инд. младшей)
call decod; вызов подпрограммы преобразования в семисегм. код
; мл тетрады
mov R2,A; запоминание преобразованного результата в R2
mov DPTR,#8001h; устанавливаем в DPTR адрес регистра сегм дин. индикатора
mov A,#00h; обнуление акк.
movx @DPTR,A; гашение всех сегментов
mov DPTR,#8002h; устанавливаем в DPTR адреса регистра анодов дин. индикатора
mov A,#00000011b; запись кода дешифр. включения крайнего правого разр. инд.
movx @DPTR,A; включение крайнего правого разряда инд.
mov A,R2; пересылка семисегм. кода правой цифры
mov DPTR,#8001h; устанавливаем в DPTR адрес регистра сегм дин. индикатора
movx @DPTR,A; высвечивание крайней правой цифры
;****************************************************
call delay; вызов подпрограммы задержки на 10 мс
;**********************************************************
mov A,R3; пересылка в акк. индицируемого числа
anl A,#11110000b;обнуление младшей тетрады (поготовка инд. старшей)
swap A;обмен тетрад аккумулятора
call decod; вызов подпрограммы преобразования в семисегм код
; ст тетрады
mov R2,A; запоминание преобразованного результата в R2
mov DPTR,#8001h; устанавливаем в DPTR адрес регистра сегм дин. индикатора
mov A,#00h; обнуление акк.
movx @DPTR,A; гашение всех сегментов
mov DPTR,#8002h; устанавливаем в DPTR адреса регистра анодов дин. индикатора
mov A,#00000010b; запись кода дешифр. включения второго справа разр. инд.
movx @DPTR,A; включение второго справа разряда инд.
mov A,R2; пересылка семисегм. кода левой цифры
mov DPTR,#8001h; устанавливаем в DPTR адрес регистра сегм дин. индикатора
movx @DPTR,A; высвечивание второго справа разр.
setb IE.7; разрешили прерывания от таймера после вывода на инд.
;************************************************************************
call delay; вызов ПП задержки на 10 мс
;*************************************************************************
sjmp ind1; абсолютный переход на начало программы
;*************************************************************************
;ПОДПРОГРАММА ПРЕОБРАЗОВАНИЯ ЧИСЛА В СЕМИСЕГМЕНТНЫЙ КОД
;*************************************************************************
decod:
mov DPTR,#tablecod; занесение в DPTR начального адреса массива таблицы ниже
movc A,@A+DPTR; пересылка в акк. преобр. в семисегм. код числа
; ранее хранившегося в акк.
ret
;-------------------------------------------------------------------------
tablecod:; формирование массива для преобразования двоичного кода
; в семисегментный
; PGFEDCBA -сегм.
db 00111111b; 0h числа
db 00000110b; 1h
db 01011011b; 2h
db 01001111b; 3h
db 01100110b; 4h
db 01101101b; 5h
db 01111101b; 6h
db 00000111b; 7h
db 01111111b; 8h
db 01101111b; 9h
db 01110111b; Ah
db 01111100b; Bh
db 00111001b; Ch
db 01011110b; Dh
db 01111001b; Eh
db 01110001b; Fh
;----------------------------------------------------------------
;****************************************************************
;**************************************************************
;ПОДПРОГРАММА ЗАДЕРЖКИ НА 10 мс
;****************************************************************
delay:
clr tcon.4; остановка таймера Т0
mov TL0,#239;запись в мл. регистр Т0 начального условия
;мл. байт дополняющего кода числа 10000
mov TH0,#216;запись в ст. регистр Т0 начального условия
;ст. байт дополняющего кода числа 10000
setb tcon.4; запуск счета таймера Т0
jnb TF0,$; ожидание переполнения счетчиков таймера Т0
; через 10 мс по флагу
clr TF0; сброс флага переполнения
clr tcon.4; останов таймера
ret
;********************************************************************
;****************************************************************
ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ
;******************************************************************
schet:
push DPH; сохранение в стеке DPTR
push DPL
push PSW; сохранение в стеке PSW
push ACC; сохранение в стеке аккумулятора
clr tcon.6; остановка таймера Т1
clr IE.7; глобальный запрет прерываний
mov TL1,#175;запись в мл. регистр Т1 начального условия
;мл. байт дополняющего кода числа 50000
mov TH1,#60;запись в ст. регистр Т1 начального условия
;ст. байт дополняющего кода числа 50000
djnz R5,d1; анализ прохождения интервала 1 сек
; и переход если прошло 20 х50 мс циклов
mov R5,#20; запись множителя 20 для формирования интервала
; 20х50 мс после окончания очередного интервала
inc R1; увеличение на '1' содержимого рабочего регистра
cjne R1,#3Ch,d1; сравнение содержимого рабочего регистра с 60
; и переход на метку d1 если не равно
mov R1,#00h; сброс рабочего регистра
d1: pop ACC; пересылка из стека в аккумулятор
pop PSW; пересылка из стека PSW
pop DPL; DPTR
pop DPH
clr TF1; сброс флага прерываний от таймера Т1
setb tcon.6; запуск таймера Т1
setb IE.7;глобальное разрешение прерываний
reti
;*********************************************************************
;*********************************************************************
;Подпрограмма преобразования 8-ми разрядного двоичного кода в двоич-
;но десятичный (BCD) упакованный, в R3 записываются младшие разряды числа
; в R4 (младшую тетраду) - старший
preobr:
mov B,#100; заносим во вспомогательный регистр делитель
mov A,R1; заносим в акк. преобразуемое число
div AB;делим преобр. число на 100
mov R4,A;переписываем частное от деления (старший двоично десятин.
;разряд) в регистр R4 (код сотен)
mov A,B;переписываем в акк. остаток от деления
mov B,#10;заносим во вспомогательный регистр делитель
div AB;делим на 10, в результате в акк. в мл. тетраде хранится код десятков
;в ст. тетраде нули
; а в рег. В в мл. тетраде -код единиц
mov R0,B; переписываем код единиц в регистр R0
swap A; меняем местами ст. и мл. тетраду акк.
; в результате в ст. тетраде хранится код десятков
; в мл. записаны нули
xrl A,R0; логическое суммирование регистров
; в результате получили упакованный BCD в акк.
; - в ст. тетраде находится код десятков, а в мл.
; - код единиц
mov R3,A; переписываем результат в регистр для индикации десятков и единиц
ret
end
Дата добавления: 2015-07-20; просмотров: 42 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Регистр приоритетов прерываний | | | Краткие теоретические сведения |