Физический интерфейс
Физический интерфейс между клавиатурой и микроконтроллером показан на рисунке 1. Используются две сигнальных линии — синхронизации и данных. Сигнальные линии с открытым коллктором и имеют подтягивающие резисторы, расположенные в клавиатуре. Это позволяет как микроконтроллеру, так и клавиатуре формировать на линиях низкий уровень. Существует два типа разъемов, 5-ти штырьковый DIN разъем типа 5D, и миниатюрный 6-ти штырьковый мини-DIN. Расположение выводов показано в таблице 1.
Рисунок 1. Интерфейс подключения
Разьем | ||
DIN41524 | 6-pin Mini DIN PS2 | |
Синхронизация | 1 | 5 |
Данные | 2 | 1 |
Не используются | 3 | 2, 6 |
Земля GND | 4 | 3 |
Питание +5 В | 5 | 4 |
Экран | Оплетка | Оплетка |
Таблица 1. Расположение контактов разъемов PC клавиатуры
Временный диаграммы
Временные диаграммы передачи данных от клавиатуры к микроконтроллеру показаны на рисунке 2. Протокол обмена следующий: один старт бит (всегда 0), восемь бит данных, один бит четности и один стоп бит (всегда 1). Данные действительны в течении низкого уровня сигнала синхронизации. Синхросигнал формируется клавиатурой с длительностью низкого и высокого уровней по 30-50 мкс. Микроконтроллер также может посылать команды в клавиатуру, устанавливая низкий уровень на линии синхронизации, затем формируя импульс низкого уровня на линии данных (старт бит). После чего линия синхронизации должна быть освобождена микроконтроллером. Затем клавиатура сформирует 10 синхроимпульсов. Данные на линии данных должны быть установлены микроконтроллером до формирования спада сигнала синхронизации. После 10-го бита, клавиатура проверяет наличие высокого уровня на линии данных (стоп бит), и если это так то, в свою очередь формирует низкий уровень. Это указывает микроконтроллеру, что данные приняты клавиатурой.
Скан-коды
Каждая клавиша АТ клавиатуры имеет свой скан-код. Этот код передается при нажатии клавиши. Если клавиша остается нажатой, то код начинает передаваться повторно. Частота повторения примерно 10 раз в секунду. Когда клавиша отпускается, после скан-кода клавиши передается код «BREAK» ($F0). Для большинства клавиш размер скан-кода составляет один байт. Некоторые клавиши, такие как Home, Insert и Delete имеют расширенный скан-код, от двух до пяти байт. Первый байт всегда $E0. Он также выдается и при формировании «BREAK» кода, то есть E0 F0 xx … АТ клавиатуры могут поддерживать три набора скан-кодов, Второй из которых устанавливается по умолчанию. В примере используется только второй набор.
Алгоритм
Прием данных от клавиатуры обрабатывается прерыванием INT0. Прием будет происходить независимо от выполнения остальной программы. Алгоритм довольно прост: сохранение значения линии данных по спаду синхроимпульса. Это проще всего выполняется, если линия синхронизации подключена к INT0 или INT1. Прерывание будет выполняться по каждому фронту и спаду синхроимпульса, данные будут сохраняться по каждому спаду. После получения всех бит, данные можно декодировать. Это осуществляется вызовом функции decode. Для символьных клавиш эта функция сохраняет ASCII код клавиш в буфере. Это позволяет учитывать, удерживалась ли нажатой клавиша shift при нажатии данной клавиши. Другие функциональные клавиши вроде курсорных, ctrl и Alt и т.д. игнорируются. Карта соответствия скан-кодов ASCII кодам обрабатывается с помощью таблиц, одной для клавиш нажатых вместе с shift, а другой без.
Изменения и дополнения
Если микроконтроллер потеряет синхронизацию с клавиатурой, все остальные принятые биты будут неверны. Один из способов решения этой проблемы это использование таймаута. Если 11 бит не получены в течении 1,5 мс, значит произошла ошибка. Счетчик битов должен быть сброшен, а поврежденные данные удалены. Для установки таких параметров как скорость и период повтора нажатой клавиши, необходимо посылать данные в клавиатуру. Это можно сделать, как описано выше. Команды можно найти в спецификации производителя клавиатуры.
Рисунок 2. Временные диаграммы передачи данных клавиатурой в микроконтроллер.
Источник: kazus.ru