Ввод в МКС аналоговых сигналов. Параметры интегральных АЦП. Условное графическое обозначение типового АЦП, страница 4

При таком подключении на входах порта 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