; защита от дребезга на нажатие и отпускание
zader3: in portc ; опрос клавиатуры, w31
ani kodkl1
jz zader2 ; дребезг или помеха – продолжаем отработку
; временной задержки, w32
dcr c
jnz zader3 ; w33
in portc
mov b,a
zader4: mvi c,povdr ; защита от дребезга на отпускание, w34
zader5: in portc ; w35
ana a
jnz zader4 ; w36
dcr c
jnz zader5 ;конец защиты от дребезга, w37
; т.к. нажато что то нужное и это не помеха и не дребезг, то надо
; остановиться или сменить режим, а значит необходимо срочно выйти из
; подпрограммы временной задержки. Это можно осуществить с помощью
; команды безусловного или условного перехода в любое место основной
; программы. Но тогда в стеке останется адрес возврата и стек
; приблизится к программе. Если это повторится несколько раз, то стек ;может стереть программу, и она перестанет функционировать. Для
; предотвращения этого перед «аварийным» выходом из подпрограммы
; надо скорректировать указатель стека, т.е. извлечь из него уже ненужный
; адрес возврата. Это можно сделать выполнив команду POP, которая
; берет из стека 2 байта и помещает их в указанную пару, изменяя
; при этом указатель стека.
pop h ; коррекция указателя стека перед «аварийным»
; выходом из подпрограммы
mov a,b ; что нажато?
cpi 02h ; нажата клавиша «1» (стоп)
jz circl ; переход к метке circl, w38
cpi 08h ; нажата клавиша «3» (ночной режим)
jz noch ; переход к выполнению «ночного» режима, w39
jmp jestk ; переход к «жесткому режиму», w40
zader2: dcx h ; ** 5 уменьшение на 1 пост. времени, w41
mov a,h ; ** 5 проверка на рав-во «0» содерж. регис-й пары
ora l ; ** 4
jnz zader1 ; ** 10 нет, пост-я времени еще не равна «0»,
; переход к след. циклу врем. задер. на 1 сек., w42
ret ; *10 Возврат из подпрограммы задержки, w43
; таблица кодов для вывода на индикаторы необходимых сегментов
base: db 80h ; код сегмента «А» (красный свет)
db 02h ; код сегмента «G» (желтый свет)
db 10h ; код сегмента «D» (зеленый свет)
end ; директива ассемблера, означающая конец ;текста программы.
Расчет временной задержки
Од+Мн+ Pov =2000000, где Од – суммарное количество тактов команд, выполняющихся однократно при формировании временной задержки (помечены знаком *); Мн – суммарное количество тактов команд, выполняющихся в цикле (помечены знаком **); Pov – количество повторений цикла; 2220000 – количество тактов в 1 с. (для тактовой частоты 2,22 МГц).
Од=17+10=27
Мн=10+7+10+5+5+4+10=51 такт
Pov=(2220000-Од)/Мн
Pov=(2220000-27)/51=43528,8823529
В качестве Pov берем целое число проходов 43528.
Листинг программы
Кросс-асемблер 80/85 ### Файл листинга SVET.lst
Входной файл > SVET.asm
Объектный файл > SVET.obj
1 проход
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.