НПО Системы Безопасности
(499)340-94-73 График работы:
ПН-ПТ: 10:00-19:00
СБ-ВС: выходной

Главная » Периодика » Безопасность

0 ... 65666768697071 ... 159


jlfsc STATUS, Z

jo Address ; Если равно О, то да.

if ((Delay & 0x080) i= 0) ; Есть автоповтор Ijtfsc STATUS, С

jjggf Variable ; Нет - декрементирование,

: если больше Delay.

else btfss

goto

xorlw btfsc gotiT movlw movwf goto endif

ButtonEnd ; Конец макрокоманды

endm

Описание параметров этой макрокоманды приведено в табл. 8.2.

Таблица 8.2 Параметры макрокоманды

STATUS, С

ButtonEnd

; Меньше, чем проверяемое.

; закончить.

Rate

; Все еще автоповтор

STATUS, Z

ButtonEnd

; Нет - инкрементирование,

Delay

; да - возврат к началу.

Variable

Address

Параметр

Назначение

Port,Pin

Вывод подключения клавиши (например, PORTA, о)

Down

Соаояние, когда клавиша нажата

pelay

Число итераций макрокоманды перед переходом к Address (до 127) Если уаановлен 0, выполняется переход при условии, что параметр Target поаоянен (отсутавует дребезг контактов клавиши). Если бит 7 параметра Delay уаановлен. автоповтора нет

Rate

Соответавует числу циклов (до 127) перед автоповтором

Target

Логическая переменная (1 или 0)

..Add ress

Адрес для перехода при нажатии клавиши или автоповторе

ВЗАИМОДЕЙСТВИЕ С МАТРИЧНОЙ КЛАВИАТУРОЙ

Клавиатура обычно строится как коммутационная матрица [матри-Чакоммутации). Матрица коммутации в данном случае двумерная, •ждый ее узел содержит кнопку (клавишу), которая коммутирует один столбец матрицы с одной из строк (рис. 8.8). Путем сканирования столбцов (поочередного соединения их «землей») и считывания кода строк можно непрерывно следить за состоянием клавиатуры.

Когда ни одна из кнопок не нажата, на всех линиях строк должен ••ть высокий уровень (1). При замыкании одной из кнопок во время •Проса соответствующего столбца на линии строк вместо 1 будет 0.



) .}

77777 77777

- Строка 1

Управление столбцом О

Управление столбцом 1

-Строка О В результате микроконтроллер может

зафиксировать факт нажатия и определить, какая клавиша нажата.

В PIC-микроконтроллерах для управления матричными клавиатурами целесообразно использовать выводы порта PORTB. Напомним, что входы этого порта снабжены внутренними резисторами, подключаемыми к напряжению нитания, а выходы портов в схемном отношении аналогичны транзисторным ключам с открытым стоком (рис. 8.9).

Изначально все выводы порта следует конфигурировать как входы, причем должна быть задана «подтяжка» входов через внутренние резисторы к напряжению нитания. При опросе текуш;ий вывод переводится в режим выхода и на него выдается логический 0. Затем происходит считывание линий строк. Процесс повторяется для других столбцов. Подобным образсУМ обеспечивается сканирование всей

Рис. 8.8

Матрица коммутации с управляемыми транзиаорными ключами

Микроконтроллер

Сенсоры строк

Драйверы столбцов

RBO }

RBO }

RBO }

RBO }

RBO }

RBO } RBO }

RBO }

Рис. 8.9

Схема управления матричной клавиатурой 4x4



авиатурыи производится поиск замкнутых переключателей (нажатых клавишей). Фрагмент соответствующей программы пред ставлен ниже:

int KeyScan ( ) Сканирование клавиатуры

I и возврат,когда клавиша нажата.

int 1 = О

int key = -1

while (key == -1) {

for (i = 0; (1 , 4) & ((PORTB & OxOOF) == OxOFO); i++); switch (PORTB & OxOOF) { Поиск нажатой клавиши.

Строка 0.

Строка 1.

Строка 2.

case

OxOOE:

key = i;

break;

case

OxOOD;

case

OxOOC:

key = 0x04

+ i;

break;

case

OxOOB:

case

OxOOA:

case

0x009:

case

0x008;

key = 0x08

+ i;

break;

else

key = OxOC

+ i;

break;

Строка 3.

) Завершение switch.

) Завершение while (цикла),

return key;

} Конец функции KeyScan.

Выход из функции KeyScan происходит, только когда обнаруживается нажатая клавиша. Следует отметить, что эта подпрограмма не защищает от дребезга контактов клавиши, а также не позволяет во Время своей работы выполнять другие операции.

Проблемы могут быть разрешены путем использования программы сканирования в рамках программы обработки прерываний, исполнение которой инициируется с периодичностью 5 мс:

Inrerrupt KeyScan ( ) Цикл сканирования клавиатуры - 5 мс.

Int i = 0; int key = -1

for (1 = 0; (1 < 4) & ((PORTB & OxOOF) = = OxOOF));i++); if (PORTB & OxOOF) != OxOOF) { Клавиша нажата.



0 ... 65666768697071 ... 159