Написание программы-игры, использующей в своей работе клавиатуру и дисплей (ЖКИ) стенда. Генератор случайных чисел, страница 2

;---------------------------------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 и столбцами и строками клавиатуры.