porta equ 80h ;адреса портов
portb equ 81h ;
portc equ 82h
porcrl equ 83h
pov equ 34077 ;постоянная времени на одну секунду
povdr equ 254 ;постоянная времени дребезга
kod equ 00001010b ;код режима через две секунды или через пять секунд (клавиши "1" и "3")
kod1 equ 00001011b ;код обоих режимов и останова (клавиши "0", "1", "3")
mask equ 01101100b ;маска индикации
org 800h ;инициализация
lxi sp,900h
mvi a,89h
out porcrl
begin: mvi a,01100000b
out portb ;инициализация регистров микропроцессора
mov d,a
reset: mvi c,povdr ;ожидание нажатия
;защита от дребезга при нажатии
vvod: in portc
ani kod
jz reset
dcr c
jnz vvod
in portc
;запоминание нажатой клавиши
lxi h,klav
mov m,a
;защита от дребезга при отпускании
rept: mvi c,povdr
out: in portc
ana a
jnz rept
dcr c
jnz out
;конец защиты от дребезга
creg: call reg ;вызов подпрограммы режим
mov a,m ;при выполнения подпрограммы режим flag устанавливается в 0 или 1 (flag - специально организованный флаг, сигнализирующий нажатие клавиши 0 - останов, если нажата клавиша 0, то flag устанавливается в 0)
;в данный момент в паре h находится адрес ячейки памяти flag
ana a ;проверка флага
jz begin ;флаг = 0, переход на начало
rstr: mov a,d ;флаг = 1,выполняется следующий шаг программы - пересылка текущего (начального) состояния индикатора из регистра в аккумулятор
out portb ;вывод на индикацию
xri mask ;смена состояния индикатора на противоположное*
mov d,a ;пересылка из a в d
mov b,e ;пересылка из e в b эталона количества секунд
crcl: call zader ;* вызов подпрограммы задержки на 1 секунду
dcr b ;уменьшение количества секунд на единицу
jnz crcl ;отработана задержка на заданное количество секунд?,нет, продолжаем отработку задержки
mvi a,0 ;
out portb ;погашенные индикаторы
call zader
call zader
jmp rstr (зацикливание)
;***подпрограммы***
;подпрограмма режим()
reg: lxi h,klav ;определение нажатой клавиши
mov a,m ;
ani 01b ;нажата кл. 0 ?
jnz off ;да, переход на метку off
mov a,m ;пересылка кода нажатой клавиши из памяти в аккумулятор
lxi h,flag ;загрузка в пару h адреса ячейки flag
mvi m,1 ;установка флага в 1
ani 010b ;нажата кл. 1?
jnz fast ;да, переход на метку fast
mvi e,5 ;нет, значит загружаем в эталон количества секунд 5
jmp return ;выход
fast: mvi e,2 ;нажата клавиша 1, эталон количества секунд - 2
jmp return ;выход
off: lxi h,flag ;
mvi m,0 ;установка флага в 0
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.