При таком подключении на входах порта P1 при нажатии клавиши формируется унитарный код, в котором будет только один 0 в позиции, соответствующей нажатой клавиши. Использовать унитарный код в программах неудобно, так как он сильно затрудняет выполнение различных процедур по обработке данных. Поэтому более предпочтительно преобразовать такой унитарный код в обычный позиционный. В табл. 7.2 приведены унитарные и позиционные коды для клавиатуры, состоящей из четырех клавиш.
Таблица 7.2
Коды клавиатуры
Нажата |
Унитарный |
код |
Позиционный |
код |
клавиша |
прямой |
инверсный |
двоичный |
HEX |
SA1 SA2 SA3 SA4 |
1111 1110 1111 1101 1111 1011 1111 0111 |
0000 0001 0000 0010 0000 0100 0000 1000 |
0000 0000 0000 0001 0000 0010 0000 0011 |
00H 01H 02H 03H |
Обычно процедура опроса клавиатуры оформляется в виде подпрограммы, которая вызывается по мере необходимости из основной программы.
Код нажатой клавиши удобно хранить в какой-либо ячейке памяти данных МК. Подпрограмму опроса клавиатуры назовем INPKEY. Текст ее может иметь следующий вид:
; INPKEY – подпрограмма опроса клавиатуры
; Выходной параметр: ячейка памяти данных KEYCODE –
; позиционный код нажатой клавиши
KEYCODE: EQU 30H ; Адрес ячейки в ПД
INPKEY: MOV A,P1 ; Пересылка в аккумулятор
; входного кода
CPL A ; Инвертировать аккумулятор
ANL A,#0FH ; Выделить разряды А3-А0
CALL IDENTIF ; Вызов подпрограммы
; идентификации нажатой клавиши
MOV KEYCODE,A ; Пересылка кода в ячейку ПД
RET
Идентификация (кодирование) нажатой клавиши может быть выполнена двумя способами:
1) наложением маски;
2) сдвигом исходного унитарного кода.
Рассмотрим пример подпрограммы идентификации с именем IDENTIF1 при использовании метода наложения масок.
IDENTIF1: CJNE A,#01H,M1 ; Переход на M1, если
; (A) ≠ 0000 0001
MOV A,#00H ; Код клавиши SA1
RET
M1: CJNE A,#02H,M2 ; Переход на М2, если
; (A) ≠ 0000 0010
MOV A,#01H ; Код клавиши SA2
RET
M2: CJNE A,#04H,M3 ; Переход на М3, если
; (A) ≠ 0000 0100
MOV A,#02H ; Код клавиши SA3
RET
M3: CJNE A,#08H,M4 ; Переход на М4, если
; (A) ≠ 00001000
MOV A,#03H ; Код клавиши SA4
RET
M4: MOV A,#0FH ; Нет нажатой клавиши
RET
В подпрограмме IDENTIF1 предусмотрен вариант, когда не будет нажата ни одна из клавиш SA1-SA4. В этом случае в ячейку хранения кода KEYCODE заносится число 0FH, которое не соответствует ни одному из возможных кодов клавиш. Это позволяет программе определить такую ситуацию.
Очевидно, что недостатком метода наложения масок для идентификации нажатой клавиши является громоздкость его программной реализации при большом количестве клавиш.
Более компактным является метод идентификации, основанный на сдвигах исходного унитарного кода, принятого от клавиатуры, и подсчета числа сдвигов на счетчике до появления первого переноса.
Рассмотрим программную реализацию метода сдвигов унитарного кода.
IDENTIF2: MOV R2,#0 ; Счетчик сдвигов
MOV R7,#4 ; Количество клавиш
SHIFT: RRC A ; Сдвиг инверсного кода вправо
JC M1 ; Переход на М1, если есть перенос
INC R2
DJNZ R7,SHIFT
MOV A,#0FH ; Нет нажатой клавиши
JMP EXIT
M1: MOV A,R2
EXIT: RET
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.