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

JNZ   L0              ; нет

lhld  Last_PD         ; да

shld  Work_PDmin      ; первый раз

shld  Work_PDmax      ; просто

lhld  Last_PS         ; скопируем

shld  Work_PSmin      ; теперь - систолическое

shld  Work_PSmax      ;

lxi   h,0             ;

shld  Work_PS         ; обнулим перед усреднением

shld  Work_PD         ;

L0:         lhld  Work_PDmin      ; если не первый раз

xchg                  ;

lhld  Last_PD         ; диастолическое

            RST   4               ; сравн. Last_PD и PDmin

JNZ   L1              ;

shld  Work_PDmin      ; сохр. MIN

L1:         xchg                  ; давление в (DE)

lhld  Work_PDmax      ;

            RST   4               ; сравн. PDmax и Last_PD

JNZ   L2              ;

xchg                  ; давление в (HL)

shld  Work_PDmax      ; сохр. MAX

L2:         xchg                  ; давление в (DE)

lhld  Work_PD         ;

            RST   1               ; прибавим

shld  Work_PD         ;

lhld  Work_PSmin      ;

xchg                  ;

lhld  Last_PS         ; диастолическое

            RST   4               ; сравн. Last_PD и PDmin

JNZ   L3              ;

shld  Work_PSmin      ; сохр. MIN

L3:         xchg                  ; давление в (DE)

lhld  Work_PSmax      ;

            RST   4               ; сравн. PDmax и Last_PD

JNZ   L4              ;

xchg                  ; давление в (HL)

shld  Work_PSmax      ; сохр. MAX

L4:         xchg                  ; давление в (DE)

lhld  Work_PS         ;

            RST   1               ; прибавим

shld  Work_PS         ; запомним

L15min:     lxi   h,Count15min    ; указ. на счетчик 15 минут

mov   a,M             ;

dcr   a

mov   M,a

RNZ                   ; ВЫХОД если не >15минут<

mvi   a,Set_15min     ; если >15минут<

mov   M,a             ;

lhld  Work_PD         ;

lxi   d,7             ; прибавим 7, чтобы округлилось

            RST   1               ; по правилам математики

lxi   h,15            ;

call  DIV16_8         ;

xchg                  ; рез-тат в (HL)

shld  Work_PD         ; усредним за 15 минут

lhld  Work_PS         ;

lxi   d,7             ; прибавим 7, чтобы округлилось

            RST   1               ; по правилам математики

lxi   h,15            ;

call  DIV16_8         ;

xchg                  ; рез-тат в (HL)

shld  Work_PS         ; усредним за 15 минут

mvi   h,12            ;

lxi   b,Work_PDmin    ;

lxi   d,StatPoint     ;

L5:         ldax  b               ; копируем в массив

stax  d               ;

inx   b               ; следующий

inx   d               ; адрес

dcr   h               ; декремент счетчика

JNZ   L5              ;

lxi   h,_STATtop      ; не последний ли иэлемент?

            RST   4               ; сравн. (HL), (DE)

JNC   L6              ;

lxi   d,_STATbase     ; поправим (DE) на начало

L6:         xchg                  ;

shld  StatPoint       ; сохр. нов. указатель статистики

call  Display         ; обновим индикацию

RET                   ;

;----------------------------------


DIV16_8:    ;подпрограмма деления 16:8=(16,8) HL-делимое, C-делитель

xra   a               ; (DE)-частное (H)-остаток

add   h               ; (A) - стб делимого

JNZ   PER1            ; если стб>0

add   L               ; (A) - млб делимого

cmp   c               ;

JNC   PER1            ; если делимое > делителя

mov   l,h             ; если делимое < делителя

mvi   h,0             ;

lxi   d,0             ;

cmc                   ; CF=0

RET                   ; выход по делимое < делителя

PER1:       xra   a               ; проверка делителя на 0

add   c               ; (A) - делитель

stc                   ; CF=1

RZ                    ; если делитель = 0

mvi   b,8             ; счетчик циклов

cmc                   ; устранение левых нулей

DIVcycle1:  ral                   ;

inr   b               ;

JNC   DIVcycle1       ;

rar                   ;

mov   c,a             ; (C) - нормализованный делитель

dcr   b               ;

mov   a,b             ; сохр. величины сдвигов делителя

sbi   8               ;

push  psw             ;

DIVcycle2:  xra   a               ; нормализация делимого

add   h               ; (A)-СТБ делимого