JNB IS_INSTALLMODE,END_KBRD ;режим ввода кода УСТАВКИ К ?
MOV R0,#K
JB NO_INTETR,HITETR ;если NO_INTETR=0 - вводим мл.тетрада
XCHD A,@R0 ;обмен младшими тетрадами
CPL NO_INTETR ;взведение NO_INTETR=1 - следующей пойдёт ст.тетрада
JMP END_KBRD
HITETR:
MOV B,A ;обмен старшими тетрадами
MOV A,R0
SWAP A
MOV R0,A
MOV A,B
XCHD A,@R0
MOV A,R0
SWAP A
MOV R0,A
CPL IS_INSTALLMODE ;ввод кода уставки завершён
CPL NO_INTETR
END_KBRD:
USING 0
POP B
POP ACC
POP DPH
POP DPL
POP PSW
RETI
;Вывод на индикацию X1-X4 и Q4
INDOUT:
SETB P1.7 ;Взводим для вывода на светодиоды X1-X4
MOV A,Q4; ;получение старшей выводимой цифры
MOV B,#100;
DIV AB;
MOV DPTR,#TABLE ;получение изображения первой цифры по ее номеру
MOVC A,@A+DPTR
MOV DPTR,#ADDR_RGIND ;запись в регистр для вывода "изображение" цифры
MOVX @DPTR,A ;вывод на старшее знакоместо
MOV A,B ;получение младшей выводимой цифры
MOV B,#10
DIV AB
MOV DPTR,#TABLE ;получение изображения первой цифры по ее номеру
MOVC A,@A+DPTR
ORL A,10000000b ;выбираем второй индикатор
MOV DPTR,#ADDR_RGIND ;запись в регистр для вывода "изображение" цифры
MOVX @DPTR,A ;вывод на младшее знакоместо
RET
RSEG BITVAR
IS_INSTALLMODE: DBIT 1
NO_INTETR: DBIT 1
IS_INDMODE: DBIT 1
RSEG VAR
X_IN: DS 1
K: DS 1
Q4: DS 1
RSEG CONST
TABLE: DB 00111111b,00000110b,01011011b,01001111b,01100110b,01101101b,01111101b,00000111b,01111111b,01101111b;для отображения десятичных цифр
END
Листинг программы для ОМЭВМ AT89C2051:
NAME 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 P1.2 ;линия формирования прерывания INT3 для AT89C51
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
MOV A,P3
ANL A,00000111b ;то её код равен номеру линии сканирования
JMP OUT_RGKEYB
LINE1:
JNB ACC.1,LINE2 ;если нажатая клавиша на линии 2
MOV A,P3
ANL A,00000111b
ADD A,#8 ;то прибавляем 8 к номеру линии сканирования
JMP OUT_RGKEYB
LINE2:
MOV A,P3 ;если нажатая клавиша на линии 3
ANL A,00000111b
ADD A,#16 ;то прибавляем 16 к номеру линии сканирования
JMP OUT_RGKEYB
OUT_RGKEYB:
MOV P1,A ;запись в регистр RGKEYB
MOV A,P3
CLR P3.5
CLR P3.4
CLR P3.3
CLR P1.2 ;формирование сигнала прерыания INT3
SETB P1.2
NEXT_SCAN:
CPL P3.0 ;формирования кода линии для следующего сканирования
JNB P3.0,NEXT1
JMP SCAN
NEXT1:
CPL P3.1
JNB P3.1,NEXT2
JMP SCAN
NEXT2:
CPL P3.2
JMP SCAN
RSEG BITVAR
RSEG VAR
RSEG CONST
END
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.