Mov A, @R0 ; в аккумулятор заносим регистры, начиная с регистра В
Movx @R1, A ; заносим регистр из аккумулятора во внешнее
; энергонезависимое ОЗУ данных по тому же адресу
dec R0 ; уменьшаем адрес внешнего ОЗУ
dec R1 ; уменьшаем адрес копируемого регистра
cjne R1, #7Fh , SAVE_SFR ; проверка: все ли SFR сохранены
; сохраняем четыре банка регистров R0 - R7
mov R0, 1Fh ; адрес регистра R7 из 3 банка регистров
mov R1, 1Fh ; адрес во внешнем ОЗУ
SAVE_Rx:
Mov A, @R0 ; в аккумулятор заносим регистры, начиная с R7 (банк 3)
Movx @R1, A ; заносим регистр из аккумулятора во внешнее
; энергонезависимое ОЗУ данных по тому же адресу
dec R0 ; уменьшаем адрес внешнего ОЗУ
djnz R1, SAVE_Rx ; уменьшаем адрес копируемого регистра
; сохраняем аккумулятор, а также R0 и R1 (банк 0)
; в ОЗУ сохранены не те значения A, R0 и R1, т.к. они менялись в подпрограмме
push DPTR
pop R1 ; извлекаем R1 из стека
mov A, R1 ; помещаем R1 в аккумулятор
mov DPTR, #1 ; задаем в DPTR адрес R1 во внешней памяти данных
movx @ DPTR, A ; сохраняем R1
pop R0 ; извлекаем R0 из стека
mov A, R0 ; помещаем R0 в аккумулятор
mov DPTR, #0 ; задаем в DPTR адрес R0 во внешней памяти данных
movx @DPTR, A ; сохраняем R0
pop ACC ; извлекаем аккумулятор из стека
mov DPTR, #0E0h ; задаем адрес аккумулятора во внешней памяти
movx @R1, A ; сохраняем аккумулятор во внешнее ОЗУ
pop DPTR ; значения всех регистров во внутреннем ОЗУ остались прежними
RETI
;--------------------------------------------------------------------------------------------------------------------END
Листинг программы для ОМЭВМ AT89C2051:
PROG SEGMENT CODE
CONST SEGMENT CODE
VAR SEGMENT DATA
BITVAR SEGMENT BIT
STACK SEGMENT IDATA
EXDAT SEGMENT XDATA
RSEG STACK
DS 10H
CSEG AT 0
USING 0
JMP INIT
RSEG PROG
ORG 40H
INIT:
setb P3.5 ;линия формирования прерывания INT3 для AT89S8252
mov P3,#8H
SCAN:
mov A,P3 ;читаем содержимое порта P3
anl A,#00111000b ;получаем номер линии возврата - 1-ца
;в соответствующем разряде
rr A ;сдвиг на 3 разряда
rr A
rr A
anl A,#00011111b ;обнуляем старшие 3 разряда
cjne A,#0,READ_KEY ;если на линии возврата все нули,
;то нажатых клавиш на линии нет
jmp NEXT_SCAN
READ_KEY: ;чтение кода клавиши
jnb ACC.0,LINE1 ;если нажатая клавиша на линии 1
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.