Интерфейс сканера штрихкодов “в разрыв клавиатуры” работает как эмулятор клавиатуры и набирает кнопки, соответствующие символам сканируемого штрихкода. То есть, если в Windows запустить блокнот и отсканировать штрихкод, то мы увидим его в рабочей области блокнота. Работа и настройка с интерфейсом проста и не требует установки доп драйверов. А некоторые программы работают только через “разрыв клавиатуры”. Неудобство же заключается в том что необходимо следить за текущей раскладкой клавиатуры (должна соответствовать штрихкоду) и курсор должен находится в поле ввода штрихкода.
Работа в режиме COM порта более надежна, но зачастую требует предварительной установки драйверов и настройки для программ, в том числе и 1с.
Сканеры штрихкодов не всегда имеют интерфейс “в разрыв клавиатуры”, но можно заставить их работать в этом режиме.
Через программу ComKey
Скачиваем и запускаем программу – она появляется в трее:
Как включить экранную клавиатуру Windows #shorts
По правой кнопки мыши вызывается меню настроек, где указывается Порт и Скорость,которые соответствуют установленному сканеру
Если все указано верно, то сканер работает в разрыв клавиатуры.
Теперь остается добавить ярлык в папку Автозагрузки Windows. Но у меня выявилась проблема: порт и скорость не сохранялись после перезагрузки.
Эти параметры на время сеанса программа хранит в HKEY_CURRENT_USERSoftwareRKDComKeySettingsПараметры Baud (REG_DWORD) – скорость
Значение Baud | Скорость |
00000001 | 110 |
00000002 | 300 |
00000003 | 600 |
00000004 | 1200 |
00000005 | 2400 |
00000006 | 4800 |
00000007 | 9600 |
00000008 | 14400 |
00000009 | 38400 |
Лайфхак! Как из обычной, сделать механическую клавиатуру? #HappyPC
и Port (REG_DWORD) – Порт.
Значение Port | Порт |
00000001 | COM1 |
00000002 | COM2 |
00000003 | COM3 |
00000004 | COM4 |
Сделал Bat файл, который прописывает параметры и потом запускает ComKey :
Источник: itnote-tlt.ru
Имитируем работу клавиатуры
Заняться устройством подобного рода меня побудил тот факт, что большая часть простых для повторения геймортовских устройств не позволяла реализовать достаточное количество кнопок управления. Игровой порт PC изначально вообще расчитан максимум на четыре кнопки. Всевозможные расширения также не обладают желаемой гибкостью.
К примеру, популярное среди самодельщиков расширение CH Flightstick Pro позволяет реализовать до 14-ти кнопок, но при этом одновременно нельзя использовать две любые кнопки – о полетах на таких устройствах в играх, в которых приходится постоянно «крутить головой» – в тех же птичках, можно забыть. Некоторые расширения используют исключительно цифровой интерфейс – данные о нажатых кнопках и отклонении ручки передаются по цифровым линиям геймпорта, которые изначально предназначались для передачи данных о четырех «стандартных» кнопках.
Я даже считаю такие расширения в чем-то избыточными. Да и преобразование аналоговых данных в цифровые усложняет конструкцию джойстика. Кроме того, не всякая игра захочет понять что за монстр к ней «присосался». А клава – вот она, во всей своей 102-х клавишной красе! Кроме того, масла в огонь подливали подписчики RU.GAME.FLIGHT, время от времени вопрошавшие «а как бы мне клаву приручить и с джоем скрестить?» и уходившие ни с чем.
Короче говоря, задача устройства – «сидеть» на шине между клавиатурой и PC и имитировать нажатие клавиш на клавиатуре, в соответствии с нажатыми кнопками устройства.
Итак, я засел за разработку. До этого у меня был опыт работы с различными микропроцессорами и микроконтроллерами. В общем – пальцы от уха до уха. И я наивно полагал, что вот, сейчас я возьму доки, сделаю RTFM и через неделю буду на белом коне.
Вся загвоздка оказалась в том, что документации о протоколе передачи данных между клавиатурой и контроллером я не смог найти ни в Интернете, ни в соответствующих конференциях Фидо. Пришлось брать осцилограф и несколько недель заниматься разбором времянок и попытками их повторить. Поэтому большая часть изложенной ниже информации является результатом моих умозаключений и не подтверждена документально. Если я в чем-то заблуждаюсь – рад буду выслушать комментарии по адресу
Основные принципы передачи данных
Все нижеследующее справедливо для PS/2 и AT-клавиатур, которые отличаются только исполнением разъема (могут подключаться через переходник).
Между клавиатурой и контроллером, расположенным на материнской плате компьютера (далее – просто «контроллером»), осуществляется двусторонний обмен данными. Контроллер передает различные команды (например – изменение состояния светодиодов или скорости автоповтора). Клавиатура передает скан-коды нажатых клавиш (скан-код – условное обозначение клавиши, не стоит путать с ASCII-кодами).
Скан-коды
1 | 16 | 2 | 1E | 3 | 26 | 4 | 25 |
5 | 2E | 6 | 36 | 7 | 3D | 8 | 3E |
9 | 46 | 45 | — | 4E | + | 55 | |
Backspace | 66 | Tab | 0D | Q | 15 | W | 1D |
E | 24 | R | 2D | T | 2C | Y | 35 |
U | 3C | I | 43 | O | 44 | P | 4d |
[ | 54 | ] | 5B | Enter | 5A | Ctrl(L) | 14 |
A | 1C | S | 1B | D | 23 | F | 2B |
G | 34 | H | 33 | J | 3B | K | 42 |
L | 4B | ; | 4C | ‘ | 52 | ` | 0E |
Shift(L) | 12 | 61 | Z | 1A | X | 22 | |
C | 21 | V | 2A | B | 32 | N | 31 |
M | 3A | , | 41 | . | 49 | / | 4A |
Shift(R) | 59 | Alt(L) | 11 | Space | 29 | Caps Lock | 58 |
Esc | 76 | F1 | 05 | F2 | 06 | F3 | 04 |
F4 | 0C | F5 | 03 | F6 | 0B | F7 | 83 |
F8 | 0A | F9 | 01 | F10 | 09 | F11 | 78 |
F12 | 07 | Scroll Lock | 7E | *[numpad] | 7C | Num Lock | 77 |
7[numpad] | 6C | 8[numpad] | 75 | 9[numpad] | 7D | -[numpad] | 7B |
4[numpad] | 6B | 5[numpad] | 73 | 6[numpad] | 74 | +[numpad] | 5A |
1[numpad] | 69 | 2[numpad] | 72 | 3[numpad] | 7A | 0[numpad] | 70 |
.[numpad] | 71 | Alr(R) | E0-11 | Ctrl(R) | E0-14 | Print Screen | E0-12-E0-7C |
Insert | E0-70 | Delete | E0-71 | Left | E0-6B | Home | E0-6C |
End | E0-69 | Up | E0-75 | Down | E0-72 | PageUp | E0-7D |
PageDown | E0-7A | Right | E0-74 | Enter[numpad] | E0-5A | /[numpad] | E0-4A |
Примечание: на самом деле AT-клавиатура имеет три различных набора сканкодов. Я привел только значения для набора № 2 – дефолтного.
При нажатии на клавишу клавиатура передает контроллеру скан-код этой клавиши. При отпускании – сначала префикс 0F0h, а потом скан-код отпущенной клавиши.
Комбинации клавиш с Shift, Alt и Ctrl передаются как последовательность двух скан-кодов. С точки зрения контроллера эти клавиши ничем не отличаются от всех остальных. Точно так же на аппаратном уровне не различаются режими Num Lock и Caps Lock – они различаются на программном уровне программой, которая обслуживает прерывания от клавиатуры.
Коротко хочу остановиться на реализации режима автоповтора. Как правило функции автоповтора возлагаются на саму клавиатуру – через определенное время, если клавиша не отпущена, то клавиатура посылает еще один точно такой же скан-код. Если в это время нажать еще одну клавишу, то к контроллеру «полетит» уже другой скан-код и будет считаться, что нажата только одна клавиша. В играх эта проблема решена элементарно – клавиша считается нажатой, пока не прийдет соответствующий скан-код с префиксом 0F0h. Поэтому я не стал реализовывать функции автоповтора в принципе.
Кроме приведенных выше скан-кодов, клавиатура может возвращать некоторые служебные команды. Но эти команды, равно как и команды, выдаваемые контроллером, не представляют в данном случае практической ценности. Поэтому на них останавливаться не буду.
Описание протокола обмена
Обмен данными между клавиатурой и контроллером осуществляется асинхронно по последовательному протоколу. Суть асинхронной передачи состоит в том, что данные передаются только тогда, когда есть что передавать – нажата/отпущена клавиша на клавиатуре и нужно выдать соответствующий скан-код или контроллеру нужно выдать команду клавиатуре.
Для обмена данными служат две линии – KBData и KBSync. При передаче скан-кодов клавиатура выставляет очередной разряд данных на линии KBData и подтверждает передачу переводом из «1» в «0» сигнала на линии KBSync. При приеме данных от контроллера клавиатура считывает разряд данных с линии KBData и выдает подтверждение приема переводом из «1» в «0» сигнала на линии KBSync.
Контроллер может сигнализировать о своей неготовности передавать/принимать данные низким уровнем на линии KBSync. Все остальное время, когда нет данных для передачи, обе линии имеют высокий уровень сигнала. Частота следования импульсов линии KBSync составляет около 10-25КГц.
Данные передаются в таком порядке: один стартовый бит – «0», восемь бит данных, бит четности (сумма всех разрядов +1), один стоповый бит – «1». После приема каждого байта данных контроллер выставляет низкий уровень на линии KBSync, сигнализируя тем самым, что занят обработкой принятых данных и не готов принимать следующие. Это можно считать подтверждением приема.
Клавиатура подтверждает каждый байт принимаемой команды выдачей кода 0FAh. При возникновении ошибки при передаче, контроллер может потребовать повторить передачу последнего байта, выдачей команды 0FEh. Клавиатура же ведет себя по-другому – просто игнорирует ошибки. Я не вижу в этом ничего фатального – если ваша система дает частые сбои, то ей не место на рабочем столе.
Скорее всего, мои объяснения были слишком запутаны, поэтому постараюсь проиллюстрировать их несколькими временными диаграммами.
Общий вид передачи данных от клавиатуры (S1 – стартовый бит; S2 – стоповый бит; D0-D7 – данные; P – бит четности; W – обработка принятых данных)
Пример передачи байта 1Ch – клавиша «A»
Пример передачи байта 74h – клавиша «6» на нумпаде. В этом примере при инициации передачи клавиатурой контроллер сигнализирует о своей неготовности принимать данные и клавиатура ожидает освобождения линии KBSync
Аппаратная реализация
Теперь я перейду непосредственно к описанию реализации устройства в «железе».
Устройство включается в разрыв сигналов KBSync и KBData и пропускает через себя сигналы от/к клавиатуре, опрашивает состояние четырех кнопок и выдает соответствующие скан-коды, имитируя тем самым работу клавиатуры.
Основу устройства составляет однокристальный микроконтроллер AT89C2051. Микроконтроллер AT89C2051 фирмы Atmel принадлежит к семейству MCS-51 (отечественный аналог – МК-51). Основное отличие AT89C2051 от i8051 – пониженное энергопотреблениее, сокращенное до 15-ти количество линий ввода-вывода, отсутствие возможности использовать внешнюю память.
Более подробную информацию по AT89C2051 и i8051 можно найти на www.atmel.com и www.intel.com. Вместо AT89C2051 можно использовать AT89C51, i8051 (КР1816ВЕ51) или i8031 (КР1816ВЕ31) с внешним ПЗУ. Но два последних варианта из-за своего повышеного энергопотребления могут привести к перегоранию предохранителя контроллера клавиатуры.
На микроконтроллерах фирмы Atmel после основного обозначения указывается максимальная частота тактового генератора в мегагерцах. Я советую ставить микроконтроллер расчитанный на частоту 24МГц и кварц с частотой повыше – 16-20МГц.
Принципиальная схема. (R1-R4 – 47K; R5 – 10K; C1, C2 – 18пФ; C3 – 1мкФ; D1 – AT89C2051; BQ1 – кварц 12-24МГц)
Линия P1.4 используется как выход разрешения опроса кнопок. Это – задел для будущих расширений, – линии P1.4-P1.7 будут использованы для выдачи адреса строки для опроса нажатых кнопок (до 16-ти строк по 4-ре кнопки). «0» на линии P1.0-P1.3 означает, что нажата соответствующая кнопка.
Элементы C3 и R5 реализовывают схему генерации сигнала сброса при подаче питания.
Линии KBData со стороны клавиатуры и контроллера подаются на входы P3.2 (INT0) и P3.3 (INT1). Таким образом попытка инициировать передачу данных со стороны клавиатуры или контроллера вызывает соответствующее прерывание. Подпрограммы обслуживания этих прерываний просто транслируют сигналы, соответствующие передаче одного байта, через микроконтроллер.
В то время, когда микроконтроллер не занят передачей данных, происходит опрос линий P1.0-P1.4, обработка полученых данных и выдача соответствующих скан-кодов контроллеру. В данной версии приоритет отдается данным, передаваемым самим устройством. Поэтому данные от клавиатуры иногда могут теряться.
Завершая этот раздел, приведу распиновку разъемов AT- и PS/2-клавиатуры.
Сигнал -KBReset – необязательный сигнал. Некоторые контроллеры могут использовать его для сброса клавиатуры.
Текст микропрограммы
Я привожу исходный текст микропрограммы для микроконтроллера AT89C2051 в надежде на то, что пытливый читатель сможет меня поправить или адаптировать программу для работы с другим типом микроконтроллера.
В архиве tools.zip вы найдете две программы: a51.exe – асемблер, hex2bin – конвертер hex-файлов, которые получаются на выходе асемблера, в двоичный формат, пригодный для прошивки ПЗУ микроконтроллера программатором.
Сборка и устранение неполадок
Собрать устройство по приведенной выше схеме можно на макетнице, плате вытравленной в домашних условиях или изготовленной промышленным способом. Под микроконтроллер следует поставить панельку. Лучше всего оставить место на плате под 2-3 16-выводных DIP-корпуса – они будут добавлены в последующих версиях.
Далее, после внесения желаемых изменений, ассемблируется исходный текст микропрограммы – программой a51.exe. Для прошивки программатором полученный hex-файл переводится в двоичный образ программой hex2bin.exe.
Собрав полностью устройство, подключаем его к клавиатуре и компьютеру. Три. Два. Один. Поехали. Правильно собранное из заведомо исправных компонентов устройство должно заработать сразу. Если нет – проверьте правильность монтажа, наличие питания на микроконтроллере.
Осцилографом проверьте, запустился ли тактовый генератор и приходит ли импульс высокого уровня на вход RST при включении питания. При нажатии клавиш на клавиатуре импульсы на линиях P3.3 и P3.5 должны повторять с некоторой задержкой импульсы на линиях P3.2 и P3.4 соответственно. При нажатии/отпускании кнопок устройства на линиях P3.3 и P3.5 должны также появляться ипульсы.
Если это не поможет – багрепорт, указав модель и тип (AT, PS/2) своей клавиатуры, материнской платы/мультикарты, использованого микроконтроллера и частоту использованого кварцевого резонатора. Я постарался протестировать устройство с максимальным числом доступных мне материнских плат и клавиатур – неполадок выявлено не было. В моем случае использован кварц 14.2МГц.
Known bugs
Текущая версия микропрограммы содержит такие недоработки:
- Не отслеживаются двухбайтовые скан-коды. Это приводит к тому, что иногда, при использовании одновременно хатки и клавиатуры, клавиши клавиатуры «зависают» в нажатом состоянии или воспринимаются неверно;
- Иногда неверно передаются данные от контроллера к клавиатуре. Это может выражаться, например, в том, что не меняют свое состояние светодиоды, при нажатии клавиш Num Lock, Caps Lock, Scroll Lock;
- Дребезг контактов кнопок хатки. Пока что это не стало фатальным для меня в играх.
Планы на будущее
Вот краткий список того, что я хотел бы реализовать в последующих версиях:
- Мелкие багфиксы – более корректная обработка сигналов; отслеживание двухбайтовых скан-кодов;
- Подключение матрицы 16×4 – поддержка до 64-х кнопок или двух хаток и до 56-ти кнопок;
- Поддержка до 16-ти различных раскладок скан-кодов, сохраненных в ПЗУ микроконтроллера;
- Подключение микросхемы NVRAM с возможностью сохранения и перепрограммирования «на лету» до 32-х раскладок скан-кодов.
Заключение
Я постарался изложить все данные, необходимые для понимания принципа функционирования моего устройства. Это описание не претендует на стопроцентную техническую точность. Если я в чем-то заблуждаюсь – пожалуйста изложите мне свою версию событий. Если вы сможете внести в мою схему и/или микропрограмму улучшения и дополнения, если у вас есть идеи относительно дальнейшего развития схемы – также сообщите мне об этом. Кроме того, жду информации от умельцев, которые смогли повторить или адаптировать это устройство под другие типы микроконтроллеров.
Владимир «Рашпиль» Климус
Источник: www.joysticks.ru
Программирование клавиатуры
Дополнительные возможности управления клавиатурой реализуются двумя функциями: KeyPressed и ReadKey.
Функция KeyPressed.
Возвращает значение типа Boolean, указывающее состояние буфера клавиатуры: False означает, что буфер пуст, a True — что в буфере есть хотя бы один символ, еще не прочитанный программой.
В MS-DOS реализуется так называемый асинхронный буферизованный ввод с клавиатуры. По мере нажатия на клавиши соответствующие коды помещаются в особый буфер, откуда они могут быть затем прочитаны программой. Стандартная длина буфера рассчитана на хранение до 16 кодов символов.
Если программа достаточно долго не обращается к клавиатуре, а пользователь нажимает клавиши, буфер может оказаться переполненным. В этот момент раздается звуковой сигнал и «лишние» коды теряются. Чтение из буфера обеспечивается процедурами Read/ReadLn и функцией ReadKey. Замечу, что обращение к функции KeyPressed не задерживает исполнения программы: функция немедленно анализирует буфер и возвращает то или иное значение, не дожидаясь нажатия клавиши.
Функция ReadKey.
Возвращает значение типа Char. При обращении к этой функции анализируется буфер клавиатуры: если в нем есть хотя бы один не прочитанный символ, код этого символа берется из буфера и возвращается в качестве значения функции, в противном случае функция будет ожидать нажатия на любую клавишу. Ввод символа с помощью этой функции не сопровождается эхо-повтором и содержимое экрана не меняется.
Пусть, например, в какой-то точке программы необходимо игнорировать все ранее нажатые клавиши, коды которых еще не прочитаны из буфера, т.е. необходимо очистить буфер. Этого можно достичь следующим способом:
while KeyPressed do
При использовании процедуры ReadKey необходимо учесть, что в клавиатурный буфер помещаются так называемые расширенные коды нажатых клавиш. Если нажимается любая алфавитно-цифровая клавиша, расширенный код совпадает с ASCII-кодом соответствующего символа.
Например, если нажимается клавиша с латинской буквой «а» (в нижнем регистре), функция ReadKey возвращает значение chr (97), а если «А» (в верхнем регистре) — значение chr (65). При нажатии функциональных клавиш F1. F10, клавиш управления курсором, клавиш Ins, Home, Del, End, PgUp, PgDn в буфер помещается двухбайтная последовательность: сначала символ #0, а затем расширенный код клавиши. Таким образом, значение #0, возвращаемое функцией ReadKey, используется исключительно для того, чтобы указать программе на генерацию расширенного кода. Получив это значение, программа должна еще раз обратиться к функции, чтобы прочитать расширенный код клавиши.
Т.е. код сканирования клавиши. Этот код определяется порядком, в соответствии с которыммикропроцессор клавиатуры Intel 8042 периодически опрашивает (сканирует) состояниеклавиш.
Следующая простая программа позволит Вам определить расширенный код любой клавиши. Для завершения работы программы нажмите клавишу Esc.
WriteLnCO1 ,ord(ReadKey) :8)
Если Вы воспользуетесь этой программой, то обнаружите, что нажатие на некоторые клавиши игнорируется функцией ReadKey. Это прежде всего так называемые сдвиговые клавиши — Shift, Ctrl, Alt. Сдвиговые клавиши в MS-DOS обычно используются для переключения регистров клавиатуры и нажимаются в сочетании с другими клавишами.
Именно таким способом, например, различается ввод прописных и строчных букв. Кроме того, функция игнорирует переключающие клавиши Caps Lock, Num. Lock, Scroll Lock, а также «лишние» функциональные клавиши F11 и F12 клавиатуры IBM AT, не имеющие аналога на клавиатуре ранних моделей IBMPC/XT (в этих машинах использовалась 84-клавишная клавиатура, в то время как на IBM AT — 101-клавишная).
В табл. 13.1 приводятся расширенные коды клавиш, возвращаемые функцией ord(ReadKey). Для режима ввода кириллицы приводятся коды, соответствующие альтернативному варианту кодировки.
Таблица 13.1Расширенные коды клавиш
Клавиша или комбинация клавиш
Клавиша или комбинация клавиш
Первый байт
Второй байт
Первый байт
Второй байт
Алфавитно-цифровые клавиши
Источник: studfile.net