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
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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.