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

add   b               ; x9

add   b               ; x10

dcx   h               ; спозиц. на единицы

add   M               ; прибавим единицы

mov   c,a             ; сохраним в (C)

inx   h               ;

inx   h               ; на сотни

mov   l,M             ; возьмем сотни

mvi   h,0             ;

dad   h               ;

dad   h               ;

mov   d,h             ;

mov   e,l             ; :(DE)=x4

dad   h               ;

dad   h               ;

dad   h               ; (HL)=x32

xchg                  ;

RST   1               ;

xchg                  ; :(DE)=x36

dad   h               ; (HL)=x64

RST   1               ; (HL)=x100

mov   e,c             ; десятки и единицы

mvi   d,0             ;

RST   1               ; сложим все.

RET                   ; выход с рез-том в (HL)

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

Get1DEC:    in    Port2C          ; позиц. код (9-8) с дек. перекл.

cma                   ;

ani   00000011b       ;

mov   d,a             ;

in    Port2B          ; позиц. код (7-0) с дек. перекл.

cma                   ;

mov   e,a             ;

ora   d               ;

JZ    Check10         ; выход по нулю

mov   a,e             ;

call  PosToBin8       ;

ora   a               ;

JNZ   Check10         ; если уже есть число

mov   a,d             ;

call  PosToBin8       ;

adi   8               ; учтем что это был ст. бойт

Check10:    dcr   a               ; т.к. нулевая позиция = 1h

cpi   10              ; проверка пределов

RC                    ; выход если число в пределах 10

mvi   a,9             ; ограничение

RET                   ;

ENDPROC               ;

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

;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

;           DISPLAY

; Обновление экрана согласно текущему режиму индикации.

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

Display     PROC                  ;

lda   IndMode         ; режим

dcr   a               ;

rlc                   ; x2 байта

mov   e,a             ;

mvi   d,0             ;

lxi   h,Cur_PDmin     ;

RST   2               ; споз. на нужный

mov   c,M             ;

mov   b,M             ;

call  HexToDec        ; в двоично-дес.

mov   a,h             ;

ani   0Fh             ;

sta   DDisp100        ; сотни

mov   a,l             ;

ani   0F0h            ;

rrc                   ;

rrc                   ;

rrc                   ;

rrc                   ;

sta   DDisp10         ; десятки

mov   a,l             ;

ani   0Fh             ;

sta   DDisp1          ; единицы

lda   DDisp1          ;

call  Recode7         ;

out   Ind1            ; вывод в инд. '1'

lda   DDisp10         ;

call  Recode7         ;

out   Ind10           ; вывод в инд. '10'

lda   DDisp100        ;

call  Recode7         ;

out   Ind100          ; вывод в инд. '100'

RET                   ;

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

HexToDec:   xra   a               ; преобр. 16-битного двоичного

mov   h,a             ; в двоично-десятичное

mov   l,a             ;

mov   d,b             ; (DE) - исх. число

mov   e,c             ;

mov   c,a             ;

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

Cycle:      xchg

dad   h

xchg

mov   a,l

adc   l

daa

mov   l,a

mov   a,h

adc   h

daa

mov   h,a

mov   a,c

adc   c

daa

mov   c,a

dcr   b               ; проверка конца цикла

JNZ   Cycle           ;

mov   a,c             ; на выходе (AHL)

ret                   ;

;---------------------------------Recode7:    lxi   h,Z_GEN         ;

add   L               ; позиционируемся на символ

mov   L,a             ;

mvi   a,0             ;

adc   h               ;

mov   h,a             ;

mov   a,M             ;

ret                   ; выход с кодом в (A)

ENDPROC               ;

;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

;           GETADATA

; Получим данные с двух входных каналов и положим в ADCdata1 и 2.

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

GetAData    PROC                  ;

mvi   a,4*2+1         ; PC4=1

out   Port1RCW        ; канал 1

call  Delay5ms        ; чтобы установилось напряжение

call  ADCwork         ; возьмем значение_1

shld  Last_PD         ; и сохраним

mvi   a,4*2+0         ; PC4=0

out   Port1RCW        ; канал 2

call  Delay5ms        ; чтобы установилось напряжение