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

call  SetOut          ; ****>

push  psw             ; восстановим стек

JMP   CopyBack        ; на выход из процедуры

;---------------------------------Mode2:      cpi   2               ; проверим на режим 2

JNZ   Mode3           ; если не режим 2 то JMP на реж.3

lda   FE2_t           ; если реж.2 то пров. втор. фотод.

ora   a

JZ    CopyBack        ; если еще не дошли - то на выход

mvi   a,3             ; если дошли до второго датчика

sta   Mode_t          ; то уст. режим 3

JMP   CopyBack        ; на выход из процедуры

;---------------------------------Mode3:      cpi   3               ; проверим реж.3

JNZ   Mode4           ; если не режим 3 на реж.4

lda   FE1_t

mov   b,a             ; проверим чтобы человек с

lda   FE2_t           ; чемоданом вышел

ora   b               ; за оба фотодатчика;

JNZ   CopyBack        ; если человек еще здесь...

mvi   a,1             ; если уже прошел то

sta   Mode_t          ; установим опять режим 1

pop   psw             ; вспомним номер турникета

mvi   b,Red           ; вкл красный транспарант

mvi   c,Green         ; выкл красный транспарант

push  psw             ; ****>

call  INC10           ; учтем человека

call  TrToVRAM        ; покажем на табло

JMP   CopyBack        ; и на выход из процедуры

;---------------------------------Mode4:      lhld  TrCount_t       ; режим тревоги

dcx   h

mov   a,h

ora   l               ; декремент TrCount_t типа word

JNZ   CopyBack        ; если не прошло 10 сек

pop   psw             ; если время вышло то вспомним номер

mvi   b,0             ; ничего не включим

mvi   c,Sound         ; но зато выкл звук

call  SetOut          ; ****>

push  psw             ; восст. стек

mvi   a,1

sta   Mode_t          ; установим первый режим

CopyBack:

pop   psw             ; востановим стек

pop   h               ; вспомним реальный адрес

mvi   c,8

lxi   d,TempBuf       ;

TCopyBack:  ldax  d

mov   M,a

inx   h

inx   d

dcr   c

JNZ   TCopyBack       ; копируем все назад в таблицу

RET                   ; ВСЕ.

;---------------------------------;           TurnInit

; Инициализация системы с признаками

; теста турникетов

;---------------------------------TurnInit:   xra   a               ; (A)=0

lxi   h,TurnTable     ; начало массива

mvi   c,8*8+4

Clear:      mov   M,a             ; очистка массива турникетов

dcr   c               ; и зеркал выходных сигналов

JNZ   Clear

mvi   a,1

sta   Mode_1          ; сначала все

sta   Mode_2          ; в режиме 1

sta   Mode_3

sta   Mode_4

sta   Mode_5

sta   Mode_6

sta   Mode_7

sta   Mode_8

mvi   a,1

SetTest1:   mvi   b,Test_b_1      ; первая фаза теста mvi   c,Test_c_1      ; закрыть двери и вкл красные

call  SetOut

inr   a

cpi   9

JNZ   SetTest1

call  Delay1          ; задержка 1сек

mvi   a,1

SetTest2:   mvi   b,Test_b_2      ; вторая фаза теста, по идее

mvi   c,Test_c_2      ; зеленые транспаранты.

call  SetOut

inr   a

cpi   9

JNZ   SetTest2

call  Delay1          ; задержка 1сек

mvi   a,1

FinINIT:    mvi   b,INIT_b        ; инициализация

mvi   c,INIT_c        ; перед нормальной работой.

call  SetOut

inr   a

cpi   9

JNZ   FinINIT

RET                   ; все.

;---------------------------------;           Delay1

;      Задержка 1 сек.

;---------------------------------Delay1:     push  psw             ; сохраним рег. (A)

lxi   b,Count1sec

LDel:       dcx   b               ; задержка 1сек

mov   a,a

mov   a,a

mov   a,a

mov   a,a

mov   a,a

mov   a,a

mov   a,b

ora   c

JNZ   LDel

pop   psw

RET

;---------------------------------;           SetOut

; Включает и выключает сигналы на нужный турникет.

; на входе:  в (A) - номер турникета

; в мл.тетраде (B) - сигналы, подлежащие включению

; в мл.тетраде (С) - сигналы, подлежащие вЫключению

;---------------------------------SetOut:     push  psw             ; сохраним рег. (A)

mov   d,a             ; проверим номер

ani   01h

mov   a,d             ; восст. (A)

JNZ   LowTetr         ; нечетный (мл. тетрада)