Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПТ методичка исправл длин прилож.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
981.5 Кб
Скачать

4.4 Сканирование клавиатуры и программное определение номера нажатой клавиши

На рис.13 изображена схема клавиатуры микроЭВМ, организованная в виде матрицы 4х6. Будем считать порт РА микросхемы программируемого параллельного интерфейса (ППИ) сканирующим портом, а порт РС - читающим.

За один цикл считываются данные с одного столбца из четырех кнопок. Для простоты рассмотрим только один столбец, т.е. клавиши « 3 », « 7 », « B », « F » (рис.9 приложения). Чтение столбца клавиши представляется собой двухшаговую операцию: запись данных в сканирующий порт и чтение байта данных читающим портом.

Чтобы выбрать определенный столбец клавиш, соответствующий бит сканирующего порта (РА5-РА0) устанавливается в логическую

«1», другие биты остаются равными логическому. « 0 ». Таким образом, чтобы выбрать столбец клавиш « 3 », « 7 », « B », « F » нужно послать в порт РА код 0010 0000 (20H), чтобы выбрать клавиши « 1 », « 5 », « 9 », « D » - - код 0000 1000 (08H) и т.д.

После вывода сканирующего байта в порт РА производится чтение входным портом РС. Наличие нуля во входном байте, считанном портом РС, свидетельствует о том, что нажата клавиша в соответствующем столбце. Номер нажатой клавиши определяется по формуле:

Nклав = Nст + Nряд 6

где Nст, Nряд - номер столбца и ряда, на пересечении которых находится нажатая клавиша.

В программе сканирования клавиатуры учитывается «дребезг» клавиши, т.е. она программно устраняется. Введена программная задержка на время «дребезга», т.е. чтение читающего порта после нажатия клавиши прекращается на время «дребезга».

Алгоритм определения номера нажатой клавиши приведен на рис.15.

Рисунок 15 – Алгоритм определения номера нажатой клавиши

Программа, написанная в соответствии с алгоритмом, изображенным на рис. 15, имеет вид (табл.23):

Таблица 23

Адрес

Код

Метка

Мнемокод

Комментарий

1

2

3

4

5

0800

06 20

M1:

MVI B, 20H

запись маски

сканирования

0802

0E 06

MVI C, 06H

счетчик столбцов

0804

16 05

M2:

MVI D, 05H

счетчик рядов

0806

3E 10

MVI A, 10H

засветка

0808

D3 F8

OUT F8

вывод в порт F8

080A

3E 40

MVI A, 40H

символа

080C

D3 F9

OUT F9

вывод в порт F9

080E

78

MOV A, B

вывод маски

сканирования

080F

D3 F8

OUT F8

в порт F8

0811

DB FA

IN FA

чтение состояния клавиш из порта состояния

клавиатуры FA

0813

F6 8B

ORI 8BH

маска 10001011

0815

0F

RRC

сдвиг постоянных

0816

0F

RRC

двух первых единиц

0817

0F

МЕТ3:

RRC

--

0818

D2 32 08

JNC МЕТ5

если в столбце есть

нажатая клавиша, то

переход к МЕТ5

081B

15

DCR D

последняя клавиша в столбце?

081C

C2 17 08

JNZ МЕТ3

если нет, то переход к следующей клавише (МЕТ3)

081F

78

MOV A, B

иначе изменить маску сканирования

0820

0F

RRC

для перехода к следующему столбцу

0821

47

MOV B, A

хранение маски

сканирования

Продолжение таблицы 23

1

2

3

4

5

0822

0D

DCR C

последний столбец?

0823

C2 04 08

JNZ МЕТ2

если нет – переход к

следующему (МЕТ2)

0826

C3 00 08

JMP МЕТ1

иначе переход на

начало (МЕТ1)

0829

1E 32

МЕТ4:

MVI E, 32H

запись числа в регистр Е

082B

CD 5B 03

CALL DELAY

подпрограмма DELAY - борьба с дребезгом

082E

15

DCR E

декремент

содержимого Е

082F

C2 29 08

JNZ МЕТ4

переход на МЕТ 4,

если содержимое Е

не равно нулю

0832

15

МЕТ 5:

DCR D

декремент

содержимого D

0833

7A

MOV A, D

содержимое D

в аккумулятор

0834

CA 50 08

JZ МЕТ6

если нажата клавиша

во 2ом ряду, то переход

на МЕТ6

0837

15

DCR D

декремент

содержимого D

0838

7A

MOV A, D

содержимое D в

аккумулятор

0839

CA 57 08

JZ МЕТ7

если нажата клавиша

в 3ем ряду, то переход

на МЕТ7

083C

15

DCR D

декремент

содержимого D

083D

7A

MOV A, D

содержимое D в

аккумулятор

083E

CA 50 08

JZ МЕТ8

если нажата клавиша

в 1ом ряду, то переход

на МЕТ8

0841

15

DCR D

декремент

содержимого D

Продолжение таблицы 23

1

2

3

4

5

0842

15

DCR D

декремент

содержимого D

0843

7A

MOV A, D

содержимое D в

аккумулятор

0844

CA 65 08

JZ МЕТ9

если нажата клавиша

в 4ом ряду, то переход

на МЕТ9

0850

3E 06

МЕТ6

MVI A, 06H

вычисление номера

клавиши

0852

81

ADD C

во 2ом ряду

0853

27

DAA

и

0854

C3 70 08

JMP IND 1

переход к подпрограмме определения кода

нажатой клавиши

0857

3E 12

МЕТ7

MVI A, 06H

вычисление номера

клавиши

0859

81

ADD C

во 3ем ряду

085A

27

DAA

и

085B

C3 70 08

JMP IND 1

переход к подпрограмме определения кода

нажатой клавиши

085Е

3E 00

МЕТ8

MVI A, 00H

вычисление номера

клавиши

0860

81

ADD C

в 1ом ряду

0861

27

DAA

и

0862

C3 70 08

JMP IND 1

переход к подпрограмме определения кода

нажатой клавиши

0865

3E 18

МЕТ9

MVI A, 06H

вычисление номера

клавиши

0867

81

ADD C

во 4ом ряду

0868

27

DAA

и

0869

C3 70 08

JMP IND 1

переход к подпрограмме определения кода

нажатой клавиши

086C

FF

END:

RST

возврат в “монитор”