;---------------------------------mov 0xA6, #0E1H ;очистка памяти
mov 0xA6, #01EH
;---------------------------------;вывод случайного числа на ЖКИ
LCALL RAND ;вызов п/п, генерирующей случайное число
MOV A,R2 ;запись рандома из R2 в аккумулятор
MOV DPTR,#0E003H ;установка указателя на ячейку видеопамяти
MOVX @DPTR,A ;запись рандома по указанному адрему
LCALL LCD_OUT ;вывод на ЖКИ
;---------------------------------OZID:
mov 0xA6, #0E1H ;очистка памяти
mov 0xA6, #01EH
LCALL GET_KEY ;подпрограмма для нажатой кнопки
MOV A,R1
JZ OZID
MOV R6,A
WAIT:
mov 0xA6, #0E1H ;очистка памяти
mov 0xA6, #01EH
LCALL GET_KEY ;подпрограмма для нажатой кнопки
MOV A,R1 ;загрузка нажатой кнопки в аккумулятор
JNZ WAIT ;повтор цикла, если кнопка не была нажата
MOV A,R6
XRL A,R2 ;исключающее "или"
JNZ NE_RAV ;если содержимое R6 и R2 равны, то
INC R0
MOV A,P5
ANL A,#OFF
MOV P5,A; VSE OFF
MOV A,P5
ORL A,#GRE
MOV P5, A;
LCALL SHOW_OUT
JMP GLAV
NE_RAV:
DEC R0
MOV A,P5
ANL A,#OFF
MOV P5,A; VSE OFF
MOV A,P5
ORL A,#RED
MOV P5, A; RED ON
LCALL SHOW_OUT
JMP GLAV
;==================================
;подпрограмма для распознавания нажатой клавиши
;результат хранится в регистре R1
;в случае, если клавиша не нажата R1=0
;---------------------------------GET_KEY:
MOV R1,#0H;присваиваем регистру начальное значение
;---------------------------------;проверка кнопок нижней строки
;первый бит равен 0, остальные равны 1
;---------------------------------MOV A,#11111101B;маска сигнала.
MOV P4,A;посылаем на нижнюю строку сигнал
MOV A,P4;считываем значение порта 4
ANL A,#00100000B;сверяем с маской
JNZ CON1;в случае неравенства продолжаем
MOV R1,#'Z';в случае равенства присваеваем R1 соответ. знач.
CON1:
MOV A,P4
ANL A,#10000000B
JNZ CON2
MOV R1,#'0'
CON2:
MOV A,P4
ANL A,#01000000B
JNZ CON3
MOV R1,#'S'
CON3:
;---------------------------------MOV A,#11101111B
MOV P4,A
MOV A,P4
ANL A,#00100000B
JNZ CON14
MOV R1,#'1'
CON14:
MOV A,P4
ANL A,#10000000B
JNZ CON24
MOV R1,#'2'
CON24:
MOV A,P4
ANL A,#01000000B
JNZ CON34
MOV R1,#'3'
CON34:
RET
;==================================
;программа для генерации псевдослучайного числа
;результат хранится в регистре R2
;---------------------------------RAND:
INC R3 ;увеличиваем счётчик на 1
MOV A,R3 ;засылаем в аккумулятор
MOV B,#10D ;записываем в регистр В число 10
DIV AB ;делим значение аккумулятора на значение В
MOV A,B ;переписываем остаток от деления из В в А
ADD A,#30H ;добавляем к результату 30Н для
;преобразования числа в символ ASCI
MOV R2,A ;записываем результат в регистр R2
RET ;выход из подпрограммы
;==================================
;подпрограмма для вывода на ЖКИ
;нажатого числа и текущего счёта
;---------------------------------SHOW_OUT:
MOV A,R2
MOV DPTR,#0E003H
MOVX @DPTR,A
MOV dptR,#0E005H
MOV A,#'S'
MOVX @DPTR,A
MOV A,#'C'
INC DPTR
MOVX @DPTR,A
MOV A,#':'
INC DPTR
MOVX @DPTR,A
MOV DPTR,#0E009H
MOV A,R0
ADD A,#30H
MOVX @DPTR,A
LCALL LCD_OUT
RET
END
В ходе работы была получена программа-игра, использующая клавиатуру стенда для ввода цифры, дисплей стенда для вывода счёта игры и нажатой клавиши, а также светодиоды, которые наглядно показывают верно, или нет, была нажата клавиша.
В процессе работы мы изучили работу основных частей стенда, в особенности это касается клавиатуры. В результате были найдены ошибки в описании стенда, а именно – не соответствие между битами порта 4 и столбцами и строками клавиатуры.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.