Аппаратные средства МПС. Карта распределения адресного пространства МПС. Расчет электрического сопряжения компонентов МПС, страница 18

djnz R0,L4

mov DPTR,#0FFFFH  ;сформировать 1 на входе CS БИС NVRAM, перевести в режим

;хранения

movx A,@DPTR

pop DPH

pop DPL

pop ACC

pop 0

reti

INT3_PROC:

;произошло нажатие клавиши

;необходимо опросить IOP, получить код клавиши

          push 0

push 1

push 2

mov R0,A

mov A,#40H

          mov DPTR,#8041H

movx @DPTR,A     

mov DPTR, #8040H

movx A,@DPTR      ;Принять код клавиши в A

mov R1,A                ;запомнить в R1

clr C

subb A,#16   ;запомнить в A порядковый номер управляющей клавиши,

;считая от INSTALL

jnc CB_PRESSED              ;Это действительно управляющая клавиша?

mov R2,INPUT_MODE      ;Нет-определить, активен ли режим ввода уставки

cjne R2,#1,EXIT                ;нет-конец

;находимся в режиме ввода уставки

acall PROCESS_NEXT_CHAR         ;вызвать процедуру ввода уставки

EXIT:  mov A,R0

pop 2

          pop 1

          pop 0 

retiRETI

 

CB_PRESSED:       ;была нажата одна из командных клавиш

;определим, какая именно, и предпримем соответствующие действия

cjne A,#0,L5

;Нажата клавиша INSTALL

mov INPUT_MODE,#1   ;перейти в режим ввода уставки

;Примечание. От ввода уставки можно отказаться, нажав, например, клавишу ;OUTPUT. Однако и без ее нажатия старое значение уставки сохраняет силу до ;ввода обеих шестнадцатеричных цифр нового.

mov COUNT,#0                 ;обнулить число введенных цифр уставки

acall CLEAR_DISPLAY  ;очистить дисплей

sjmp EXIT

L5:     cjne A,#1,L6

;Нажата клавиша OUTPUT

;выйти из режима ввода уставки

          mov INPUT_MODE,#0

acall DISPLAY_ALL     ;вывести требуемые значения на индикацию

sjmp EXIT

L6:      cjne A,#2,L8

;Нажата клавиша BREAK

;повиснуть

L7:     sjmp L7

L8:     ;не нажата ни одна из управляющих клавиш

sjmp EXIT

PROCESS_NEXT_CHAR:  ;ввод следующей цифры уставки в 16-ной СС

;вывести на индикацию введенную цифру уставки

;послать УС ККД

push DPL

push DPH

 

mov DPTR,#8041H

mov A,#90H            ;запись с 0 адреса с автоинкрементированием

add A,COUNT         ;заполнять ОЗУ дисплея с адреса COUNT

movx @DPTR,A

mov DPTR,#8040H

mov A,R1                ;вывести цифру в R1

movx DPTR,A

 

pop DPH

pop DPL

 

mov A, COUNT   ;загрузить число считанных цифр

add A,PRE_K    ;получить указатель на ячейку, в которой будет сохранена цифра

mov R0,A                ;сохранить цифру

mov @R0,R1         

mov A,COUNT       ;инкрементировать смещение относительно PRE_K

inc A

cjne A,#2,PNC_EXIT ;это последняя (вторая) цифра уставки? Нет-выход

;Да-сформировать новое значение уставки

mov A,PRE_K

swap A                   ;переместить старшую цифру в старшую тетраду

add A,PRE_K+1      ;дописать младшую цифру в младшую тетраду

mov Q0,A               ;сохранить новое значение уставки

PNC_EXIT:

RETret

 

CLEAR_DISPLAY:   ;очистка дисплея

push DPL

push DPH

push ACC

mov DPTR,#8041H            ;

mov A,#0DBH                             ;11011011B-очистка памяти дисплея, код

;бланкирования 20H(пробел "_"), сброс байта состояния и cигнала прерывания

movx @DPTR,A                ;

pop ACC

pop DPH

pop DPL

RET

TF0_HANDLER:

push ACC

push PSW

inc SYS_CLOCK_LOW

mov A,SYS_CLOCK_HIGH

addc A,#0

mov SYS_CLOCK_HIGH,A

pop PSW

pop ACC

reti

TF1_HANDLER:

push PSW

inc TIMER

pop PSW

reti

3.8  Вывод данных на индикацию

DISPLAY_ALL:

push 0

push 1

push 2

push 3

mov R2,A

mov R3,B

;отправить IOP управляющее слово записи в память дисплея

mov DPTR,#8041H

mov A,#90H            ;запись с 0 адреса с автоинкрементированием

movx @DPTR,A

;вывести значение Q4 в десятичной системе счисления (3 цифры)

mov R0,#3

mov A,Q4

L9:     mov B,#10              ;последовательно "выдвигать" в B десятичные разряды Q4

mul AB

mov R1,A

mov A,B

;преобразовать код цифры в семисегментное представление

mov DPTR,#CONVERTOR_TABLE