call TrToVRAM ; заполним экранное ОЗУ
call TurnInit ; инициализация системы
mvi a,1001b ; разрешим RST6.5 и RST7.5
sim
call TimerInit ; запустим таймер
ei ; разрешим прерывания
hlt
;---------------------------------; TURNIKET
; Обработчик прерывания турникета
;---------------------------------TURNIKET: mvi a,1011b
sim ; замаскируем RST7.5
ei ; разрешим остальные
call Filter ; получим состояние турникетов
mvi a,1
CheckTurn: push psw
call TurnAnalys ; проанализируем
pop psw
dcr a
cpi 9
JNZ CheckTurn ; цикл проверки 8-ми турникетов
mvi a,1001b ; размаскируем RST7.5 и 6.5
sim
RET
;---------------------------------; Filter
; Чтение входных сигналов и обновление по
; ним таблицы состояний турникетов (TurnTable)
;---------------------------------Filter: in Pin1 ; турникеты 1,2
mov b,a
ani 01h
sta InpG_1 ; сигнал с датчика жетона
mov a,b
ani 02h
sta FE1_1 ; первый фотодатчик
mov a,b
ani 04h
sta FE2_1 ; второй фотодатчик
mov a,b
ani 10h
sta InpG_2
mov a,b
ani 20h
sta FE1_2
mov a,b
ani 40h
sta FE2_2
in Pin2 ; турникеты 3,4
mov b,a
ani 01h
sta InpG_3
mov a,b
ani 02h
sta FE1_3
mov a,b
ani 04h
sta FE2_3
mov a,b
ani 10h
sta InpG_4
mov a,b
ani 20h
sta FE1_4
mov a,b
ani 40h
sta FE2_4
in Pin3 ; турникеты 5,6
mov b,a
ani 01h
sta InpG_5
mov a,b
ani 02h
sta FE1_5
mov a,b
ani 04h
sta FE2_5
mov a,b
ani 10h
sta InpG_6
mov a,b
ani 20h
sta FE1_6
mov a,b
ani 40h
sta FE2_6
in Pin4 ; турникеты 7,8
mov b,a
ani 01h
sta InpG_7
mov a,b
ani 02h
sta FE1_7
mov a,b
ani 04h
sta FE2_7
mov a,b
ani 10h
sta InpG_8
mov a,b
ani 20h
sta FE1_8
mov a,b
ani 40h
sta FE2_8
RET
;---------------------------------; TurnAnalys
; Aнализ состояния турникета
; на входе в (a) - номер турникета
;---------------------------------TurnAnalys: push psw ; запомним номер
ral
ral
ral ; умножим номер на 8
mov e,a
mvi d,0
lxi h,TurnTable-16 ; начало массива минус 16
call ADD16 ; сместимся на нужный сегмент
; в таблице состояний турникетов
pop psw ;
push h ; запомним реальный адрес
push psw ; запомним номер турникета
mvi c,8
lxi d,TempBuf ; начало временного буфера
TCopy: mov a,M ; копируем все
stax d ; во временный буфер
inx h
inx d
dcr c
JNZ TCopy ; цикл копирования
lda Mode_t ; возьмем режим
cpi 1 ; проверим Mode
JNZ Mode2 ; если не режим 1
lda InpG_t ; если режим 1 возьмем InpG
ora a ; проверим
JZ CheckF1 ; если не опускали жетон
sta Geton_t ; если жетон то установим флаг
pop psw ; вспомним номер
mvi b,Green ; и включим зеленую лампочку
mvi c,Door+Red ; и откроем и выкл красную
call SetOut ; ****>
push psw ; восстановим стек
CheckF1: lda FE1_t ; проверим первый фотодатчик
ora a
JZ CopyBack ; если никого нет то на выход
lda Geton_t ; если кто-то есть то проверим жетон
ora a
JZ BadMan ; если идут без жетона
mvi a,2 ; если с жетоном то установим второй
sta Mode_t ; режим и следим дальше
JMP CopyBack ; на выход из процедуры
;---------------------------------BadMan: mvi a,4 ; установим 4 режим - тревога!
sta Mode_t
lxi h,Count10sec ; заведем часы на 10 сек
shld TrCount_t
pop psw ; вспомним номер
mvi b,Red+Door+Sound; надо закрыть турникет! ALARM!!!
mvi c,Green ; выкл зеленую лампочку
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.