Разработка микроконтроллера для управления турникетом в метро, страница 7

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         ; выкл зеленую лампочку