Как узнать скан коды клавиш. К вопросу оценки пэмин цифровых сигналов

  1. В верхней части окна Google Play есть поисковая строка. Именно ею мы и воспользуемся. Активируем и пишем название нашего приложения. Вводить его до конца необязательно. Как только в поисковой выдаче появится обозначенный на скриншоте объект, просто тапайте по нему.
  1. Мы будем переадресованы на домашнюю страничку программы. Тут есть большая зеленая кнопка с надписью «УСТАНОВИТЬ». Нажмите ее.
  1. Дожидаемся окончания скачивания приложения. Так как оно «весит» немногим менее 5 МБ, процесс не займет много времени.
  1. Готово. После того как автоматическая инсталляция будет окончена, мы сможем запустить программу прямо отсюда.
  1. Также на домашнем экране (если активировано в настройках) появится ярлык запуска.

На этом установка программы завершена, и мы можем переходить к обзору работы с нею.

На скриншоте ниже вы видите программный интерфейс. Тут он поделен на 3 основные вкладки. Также есть иконка настроек, выполненная в виде шестеренки. На главной вкладке «SCAN» находятся 4 основных инструмента:

  • Scan Barcode. Это и есть сканер QR, который работает посредством камеры;
  • Manual Key-in. Функция ручного ввода данных о коде;
  • Decode from File. Декодирование из файла. Отсюда можно открыть ранее загруженный QR-код и считать его;
  • Decode from Url. Сканирование по ссылке.

Внизу находятся несколько кнопок, не несущих полезного функционала. На них обращать внимание не следует.

Рассмотрим настройки программы. Их тут довольно много. На ваших экранах будут скриншоты разных областей конфигурации, мы же просто озвучим некоторые самые интересные моменты.

Например, на первом экране можно включить или отключить звук программы. То же самое получится сделать и с виброоткликом. Можно задать режим работы, когда программа начнет запускаться сразу со сканера, минуя главное меню. Еще одной важной особенностью является автоматическое копирование данных в буфер обмена.

Как только мы захотим начать сканирование и запустим сам сканер, программа запросит доступ к нужным системным ресурсам. Естественно, его нужно разрешить. Жмем кнопку, отмеченную на скриншоте.

Далее, наводим рамку сканера так, чтобы горизонтальная полоска попала прямо на QR. Старайтесь чтобы ваши руки не дрожали и в то же время следите за фокусировкой. Без нормальной резкости сканирование не удастся.

Для работы QR BARCODE SCANNER в условиях недостаточной освещенности присутствует подсветка.

Как только код будет распознан, вы увидите информацию, приведенную на скриншоте ниже.

Кроме сканирования QR тут можно также создавать их. Для этого переходим в третью вкладку. Мы отметили ее на скриншоте. В виде списка приведены все типы данных, которые можно зашифровать. Поддерживается следующее:

  • контакт телефонной книги;
  • номер телефона;
  • URL-адрес;
  • Email;
  • приложение;
  • местоположение;
  • любой текст;
  • закладка;
  • событие календаря.

Выглядит все это следующим образом:

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

Давайте попробуем зашифровать также произвольный текст. Для этого выбираем нужный пункт.

Вводим фразу в обозначенное поле и жмем кнопку «Encode».

Результат выглядит прекрасно. Давайте еще поменяем его цвет. Жмем кнопку, предназначенную для этого.

Выбираем нужный оттенок из палитры.

И любуемся полученным QR.

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

QR Droid Code Scanner

Еще одно приложение, найти которое можно в Google Play. Также вы можете скачать его по прямой ссылке на сайте Google . Мы же пока рассмотрим саму программу.

Так выглядит ярлык запуска QR Droid Code Scanner – жмем по нему.

Данное приложение, в отличие от предыдущего, выполнено на русском языке и, как только оно запустится, нам понадобится нажать на кнопку с надписью: «НАЧАЛО РАБОТЫ».

Сразу же виден сканер, но для начала давайте разберемся с его настройками. Тапаем по кнопке, расположенной в верхнем правом углу.

В главном меню видны 6 плиток-кнопок, которые переадресуют пользователя в нужный раздел. Вот они:

Итак, для того чтобы воспользоваться сканером, нужно активировать его в главном меню и, наведя на QR-код, нажать кнопку «Считать».

Тут выбирается стартовый экран, задается адрес для резервного копирования и настраивается язык программного интерфейса.

Далее мы можем установить механизм сканирования. Используется один из фирменных алгоритмов: Zapper или ZXing. Ниже получится включить или отключить перекрестие, настроить автоматическое действие после сканирования и включить отображение подсказок или копирование ссылки в буфер обмена.

В данном разделе настраивается звуковое сопровождение, включается и выключается вибро. Также конфигурируется процесс записи действий в журнал и взаимодействие с умными часами Android Wear.

Затем у нас получится экспортировать или импортировать резервную копию или установить дату.

Разрешить отправку анонимных данных (лучше отключить), активировать проверку получаемой при сканировании ссылки на безопасность или настроить пакетное сканирование. Ниже доступны такие функции, как масштабирование или подсветка.

Но на этом наши настройки не заканчиваются. Кроме приведенных выше функций, мы имеем следующее:

  • настройка ориентации экрана;
  • работа с фронтальной камерой;
  • парсинг ссылок;
  • показ магазинов.
  • функция расширенного описка;
  • запрет некоторых спецсимволов;
  • активация WEB-предпросмотра;
  • поиск сохраненных изображений.

Последний экран настроек содержит такие интересные функции, как: настройка максимального количества позиций, конфигурация пользовательских CSV, встряхивание «умных» часов и сохранение повторяющихся позиций.

Кроме настроек в меню QR Droid Code Scanner присутствует пункт под названием «Еще». Рассмотрим его функционал.

Тут имеются такие возможности:

Рассмотрим последнее, но от этого не менее функциональное, приложение в нашем списке.

NeoReader QR & Barcode Scanner

Данную программу, как и другие, вы можете скачать и установить через Google play либо по прямой ссылке . Когда это будет сделано, можно переходить непосредственно к работе с нею.

При первом запуске нам потребуется удовлетворить запрос доступа. Жмем «РАЗРЕШИТЬ».

Затем появится окно с настройками. Тут получится выбрать язык, указать свои страну, пол и возраст. Две галочки, размещенные ниже, позволяют включить или отключить доступ программы к геоданным.

Можно, собственно, приступать к сканированию. Наведите камеру на QR-код и NeoReader QR & Barcode Scanner автоматически распознает его содержимое.

Мы думаем, что этих трех программ полностью хватит для любого человека. Выберите наиболее удобную для вас и используйте на свое усмотрение. Мы же поговорим о некоторых особенностях китайских девайсов.

Стандартный функционал

В некоторых смартфонах и планшетах (в зависимости от марки) есть функционал сканирования QR-кодов в штатном исполнении и сделать все можно без приложения. Не будем перечислять их все, затронем лишь модель от Xiaomi.

Подводим итоги

В результате мы с вами узнали, как сканировать QR-код на Андроид разными способами. Надеемся статья оказалась для вас полезной. Если вопросы все же остались, задавайте их в комментариях. Мы постараемся помочь каждому.

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

Видеоинструкция

Большинство современных клавиатур снабжено мультимедийными клавишами, да и мышки уже имеют от трех до семи кнопок. На диске, идущем в комплекте, и на сайте производителя доступны драйверы и всяческие полезные программы только для Windows. Всем известно, что Linux славится своей возможностью настроить систему под себя, если, конечно, знать, где и что настраивать. Наша задача - научить пингвина работать с дополнительными батонами.

Определение скан-кода клавиш

Что бы ты там не нажимал на своей клавиатуре, X-серверу и ядру, в общем-то, все равно, что на ней написано или нарисовано. Их интересуют исключительно скан-код кнопки, причем сначала иксы считывают таблицу кодов клавиш ядра, а затем уже код клавиши привязывается к собственной таблице кодов. Если в Windows проблемы настройки мультимедийных клавиш в консоли как таковой не существует, то в Linux приходится отдельно настраивать реакцию на нажатие кнопок в консоли и в X-Window.

Чтобы узнать код клавиши, следует использовать утилиту xev, входящую в состав Х-сервера. После ее запуска появляется окно Event Tester, теперь последовательно нажимаем клавиши, запоминая выдаваемый код:

$ xev
...
KeyRelease event, serial 31, synthetic NO, window 0x3e00001,
root 0x67, subw 0x0, time 279734676, (311,611), root:(1104,687),
state 0x2000, keycode 236 (keysym 0x1008ff19, XF86Mail), same_screen YES,

XFilterEvent returns: False
KeyRelease event, serial 31, synthetic NO, window 0x2600001,
root 0x67, subw 0x0, time 265877259, (883,334), root:(886,358),
state 0x0, keycode 161 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

Вывод может быть огромен, так как отслеживается каждое движение мышки при проходе над окном Event Tester. Клавишу описывает блок KeyRelease, в частности, значение keycode как раз и является скан-кодом, который мы хотим узнать. В приведенном примере нажаты две клавиши. Клавише с кодом 236 соответствует код клавиши для X-сервера, указанный в keysym, а также действие XF86Mail, которое в KDE запускает используемый по умолчанию почтовый клиент. Для клавиши с номером 161 код и действие не определены.

Возможна ситуация, когда клавиша нажимается, но ее скан-код не выдается. Это означает, что ядро не может найти соответствующее значение. В выводе dmesg должна быть такая строка:

Use "setkeycodes 0xec " to make it known.

То есть тебе предлагают установить скан-код клавиши самостоятельно при помощи setkeycodes, при этом значение keycode выбрать очень просто. Переведи полученную цифру в десятичное число (большинство калькуляторов это умеют) и прибавь 128. В данном примере 0xec=236, то есть получаем скан-код 364. Если есть сомнения, список задействованных и незадействованных скан-кодов можно просмотреть, запустив в консоли утилиту getkeycodes или dumpkeys. Например, если вывод «getkeycodes | grep <код клавиши>» ничего не дал, значит этот код можно смело использовать.

Помочь определить скан-код способна и утилита ХKeycaps (www.jwz.org/xkeycaps), которая является графическим фронт-эндом к Xmodmap.

В консоли программа xev, разумеется, не работает. Чтобы узнать скан-код, выдаваемый ядром, следует использовать утилиту showkey или getkeycodes:

$ showkey
клавиатура была в режиме UNICODE
нажмите любую клавишу (программа завершится через 10 сек после последнего нажатия)...
0xe0 0x6c 0xe0 0xec

Первые две цифры соответствуют нажатой клавише, вторые – отсутствию нажатия.

Настройка привязки скан-кодов в X-Window

Итак, скан-коды теперь у нас есть, нужно указать Х-серверу, что он, собственно, должен делать при нажатии этой клавиши, то есть присвоить ей символьное имя. Список символьных имен приведен в файле заголовков XF86keysym.h. По умолчанию заголовочные файлы Х-сервера в современных дистрибутивах не устанавливаются. Чтобы увидеть его в Ubuntu, нужно установить пакет x11proto-core-dev, после чего этот файл будет лежать в каталоге /usr/include/X11. Как вариант - можно обратиться к CVS-серверу X.Org . Смотрим:

$ cat /usr/include/X11/XF86keysym.h
/*
* Keys found on some "Internet" keyboards.
*/
#define XF86XK_Standby 0x1008FF10
#define XF86XK_AudioLowerVolume 0x1008FF11
#define XF86XK_AudioRaiseVolume 0x1008FF13
#define XF86XK_AudioPlay 0x1008FF14
#define XF86XK_AudioStop 0x1008FF15
#define XF86XK_Mail 0x1008FF19

Если мы сравним последнюю строку с выводом xev, то увидим, что значения совпадают с клавишей с keycode 236 - keysym 0x1008ff19, XF86Mail (без суффикса XK_). Список всех доступных значений в том виде, в каком они должны использоваться, ты найдешь в /usr/share/X11/XKeysymDB.

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

$ mcedit ~/. Xmodmap

keycode 161 XF86Calculator
keycode 174 XF86AudioLowerVolume
keycode 176 XF86AudioRaiseVolume
keycode 162 XF86AudioPause

И так далее, принцип, думаю, ясен. Причем код клавиш можно заносить как в десятичном, так и шестнадцатеричном виде. По моим наблюдениям, коды большинства клавиш стандартизированы. Поэтому, если ты один раз настроишь реакцию на нажатие клавиши и перенесешь файл на другой комп, есть вероятность, что на другой клаве реакция на нажатие также подписанной клавиши будет аналогичная. Пользователи рабочего стола Gnome с GDM могут прописать все эти строки в общесистемный файл /etc/X11/Xmodmap.

В других случаях нам еще нужно указать X-серверу, чтобы он использовал созданный файл. В разных дистрибутивах это реализовано по-разному, основная идея состоит в запуске команды /usr/bin/xmodmap $HOME/.Xmodmap при входе пользователя в систему или при старте Х. Тут уже каждый танцует, как хочет. На форумах предлагают использовать файл $HOME/.xsession (в некоторых дистрибутивах он может называться.Xsession), .xprofile или системный /etc/X11/Xsession. И боюсь, что это далеко не все возможные варианты. Давай посмотрим, как сделано в KUbuntu:

$ sudo grep -iR xmodmap /etc

В результате находим прелюбопытнейший файл /etc/X11/Xsession.d/80ubuntu-xmodmap такого содержания:

$ cat /etc/X11/Xsession.d/80ubuntu-xmodmap

/usr/bin/xmodmap /usr/share/apps/kxkb/ubuntu.xmodmap || true

USRMODMAP="$HOME/.Xmodmap"

if [ -x /usr/bin/xmodmap ]; then
if [ -f "$USRMODMAP" ]; then
/usr/bin/xmodmap "$USRMODMAP" || true
fi
fi

То есть загружается содержимое файла ubuntu.xmodmap и пользовательский.Xmodmap, если он существует. Открыв в редакторе ubuntu.xmodmap, ты обнаружишь список keycode и сопоставленные символьные имена. Отсюда можно сделать вывод: если разработчик сообщает о том, что его дистрибутив поддерживает мультимедийные клавиатуры, то с большой долей вероятности можно найти подобный файл. В других дистрибутивах присутствует аналогичная система запуска пользовательских xmodmap-файлов.

Теперь, когда символьные имена клавишам присвоены, можно назначать им желаемые действия. Некоторые оконные среды вроде KDE умеют отрабатывать действия по символьным именам. Так, при нажатии кнопки с XF86AudioPlay (ВОПРОС) начинает воспроизведение плеер, используемый по умолчанию. Чтобы установить нужную комбинацию, достаточно зайти в «Центр управления KDE -> Региональные и специальные возможности -> Комбинации клавиш» (в KUbuntu ищи в «System Setting -> Keyboard & Mouse»). Аналогичный пункт меню есть и в Gnome (можно просто вызвать gnome-keyboard-bindings), и в XFce. Плюс некоторые программы вроде Amarok, Konqueror, MPD также умеют обрабатывать нажатия клавиш. В других средах, не имеющих
графических средств настройки, скорее всего, потребуется ручное вмешательство в конфигурационные файлы. Например, чтобы в IceWM по нажатии клавиши с символьным именем XF86AudioPlay запускался проигрыватель XMMS, а при повторном нажатии он становился на паузу, в файл ~/.icewm, появляющийся после первого запуска, следует добавить строку:

$ mcedit ~/.icewm

key XF86AudioPlay xmms --play-pause

В Fluxbox строка для запуска проигрывателя будет выглядеть так:

$ mcedit ~/.fluxbox/keys

None XF86AudioPlay:ExecCommand xmms --play-pause

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

Настройка реакции в консоли

В консоли порядок действий несколько иной. Как ты помнишь, вывод dmesg рекомендовал назначить клавишные коды с помощью команды setkeycodes. Но здесь есть отличия - клавишных команд в консоли не может быть больше 128, следует выбирать значения от 0 до 127:

$ setkeycodes 0xec 118

Посмотреть свободные значения можно в файле текущей клавиатурной раскладки. В Ubuntu и всех дистрибутивах, базирующихся на Debian, это обычно /etc/console-setup/boottime.kmap.gz. Если после запуска проблем с клавишами нет, заносим эту строку в один из стартовых скриптов, например в /etc/init.d/rc.local.

Теперь осталось задать соответствие клавиши и выполняемого действия. Здесь простор для творчества даже больше, чем в иксах. В keymaps(5) процедура установки соответствия keycode выглядит следующим образом:

{ plain | } keycode keynumber = keysym

# Переключение консоли на одну назад при нажатии на клавишу с кодом 105
keycode 105 = Decr_Console
# Переключение консоли на одну вперед при нажатии на и клавишу с кодом 106
alt keycode 106 = Incr_Console

Но можно создавать и свои варианты, указывая команду в переменных:

keycode 120 = F100
string F100 = "/sbin/shutdown -h now\n"

Другими словами, по нажатии клавиши с кодом 120 будет выполнено действие, указанное в переменной F100; в нашем случае задано выключение компьютера. Вместо F100, естественно, можно использовать любое другое имя.

Теперь не менее важная часть - куда все это записывать. В документации и в многочисленных советах предлагается использовать текущий файл консольной раскладки (в моем случае - boottime.kmap.gz). Кстати, это единственный файл описания раскладок, доступный после установки KUbuntu; чтобы увидеть остальные варианты, следует установить пакет console-data. После этого в /usr/share/keymaps/i386/ можно обнаружить несколько подкаталогов с файлами внутри. Но если тебе понадобится перейти на другую раскладку (в Ubuntu и некоторых других дистрибутивах для этих целей используется файл /etc/default/console-setup или ~/.console-setup), все настройки нужно будет перенести в другой файл, что несколько
неудобно. Если ты все-таки решишься на этот шаг, используй имеющиеся записи как шаблон, ничего не записывая на первую позицию, а в конце не забудь оставить пустую строку.

Немного о ноутбуке

Пока мне не попадался ноутбук, скан-коды клавиш которого определить не удалось бы. Поэтому настройки здесь ничем не отличаются от описанных выше. Хотя есть один прием, о котором хотелось бы рассказать. Я считаю очень удобным в использовании режим гибернации, когда, включив компьютер, обнаруживаешь все на своих местах. Современные дистрибутивы, как правило, его поддерживают, хотя настройка, в общем-то, несложна - достаточно установить пакет hibernate и переопределить необходимые параметры в конфигурационном файле. Единственное, каждый раз для перехода в этот режим нужно запускать скрипт /usr/sbin/hibernate, что не всегда удобно. Хочется просто закрыть крышку ноутбука, а вновь включив
питание, обнаружить все на своих местах.

Это очень просто сделать, используя демон acpid, который представляет собой нечто вроде пользовательского интерфейса, позволяющего управлять любыми событиями ACPI, доступными через /proc/acpi/event. При этом acpid читает набор конфигурационных файлов из каталога /etc/acpi/events/. Если пакет с демоном в дистрибутиве отсутствует, устанавливаем его из репозитария; последнюю версию можно взять с сайта phobos.fs.tum.de/acpi . После установки необходимо в каталоге /etc/acpi/events создать два файла: lid и power. Первый описывает реакцию на закрытие крышки, второй - на нажатие кнопки включения питания.

$ sudo mcedit /etc/acpi/events/lid

event=button/lid.*
action=/usr/sbin/hibernate

$ sudo mcedit /etc/acpi/events/power

event=button/power.*
action=/sbin/shutdown -h now

Это несколько упрощенные варианты, в KUbuntu ты найдешь более сложные скрипты. После этого требуется перезапуск демона acpid:

$ sudo /etc/init.d/acpid restart

Теперь при закрытии крышки ноутбука система будет впадать в спячку с выключенным питанием, а при нажатии на кнопку питания - выключаться. Просто и удобно.

Программы настройки

Если тебе не по душе возня с конфигурационными файлами, предлагаю несколько программ, которые помогут настроить работу мультимедийных клавиш. Например, первоначальное назначение программы Sven (sven.linux.kiev.ua) - настройка дополнительных клавиш на мультимедийной клавиатуре, но, начиная с версии 0.4, она умеет исправлять ошибки при наборе текста и изменять клавиатурную раскладку. Более того, даже если у тебя обычная клава, с ее помощью ты сможешь эмулировать мультимедиа-клавиши, использовав вместо них клавиатурные сочетания. Также можно назначить действия на определенные кнопки мыши. Она понимает приблизительно 10 000 русских слов и 9 500 английских. Если программа не переключилась
сама, то раскладку можно изменить и вручную, при помощи специально заданной клавиши (по умолчанию Break). Отдельной клавишей (Scroll Lock) можно изменять регистр слов (верхний, нижний, первая буква - верхний, остальные - нижний). Индикатор-переключатель раскладки клавиатуры запоминает свое состояние для каждого окна, поэтому, часто переключаясь между приложениями, тебе уже не нужно будет дополнительно изменять и раскладку. Программа имеет большие возможности, и я бы советовал на нее взглянуть. Все настройки производятся при помощи графической программы, построенной на библиотеках GTK+. Sven тестировался в Linux, но в принципе должен работать и на *BSD-системах. Используемый оконный менеджер
не имеет значения.

Возможности KeyTouch (keytouch.sf.net) несколько скромнее, эта утилита применяется исключительно для настройки мультимедийных клавиш. Хотя с ее помощью любой клавише можно назначить свое действие, отличающееся от установок по умолчанию. На сайте программы, кроме исходных текстов и пакетов для некоторых дистрибутивов, можно найти готовые настройки для мультимедийных клавиатур большинства известных производителей.

Еще одно интересное решение - xbindkeys (hocwp.free.fr/xbindkeys/xbindkeys.html) - позволяет присваивать любой кнопке клавиатуры и мышки любые команды, в том числе и команды оболочки. Все настройки производятся в конфигурационном файле, который имеет простой и понятный формат.

Следующим типовым устройством ПЭВМ, вроде бы и несложным, но доставляющим, порою, хлопоты исследователю, является клавиатура.

В общем-то устройство несложное. Особенно ноне уже устаревшие модели, подключаемые к порту PS/2. Как показывают многочисленные экспериментальные данные микросхема управления «клавы» сканирует нажатия клавиш и передаёт в последовательном коде в порт. Тактовая частота этой передачи кратна (в подавляющем числе случаев) » 6,3 или 10 кГц. Хотя автору попались в самые последние года пара экземпляров, тактовая частота которых лежала в районе 20 кГц.

Все клавиатуры при нажатии и удерживании любой клавиши начинают (после некоторой паузы) повторять передачу кода клавиши «до бесконечности». В обычном режиме это, как правило, через несколько секунд приводит к переполнению буфера контроллера и нарушению работы. Появляется звуковой сигнал системного «динамика» - «писк». Суть тест-режима (самого общепринятого) заключается в блокировании команды переполнения буфера, что позволяет, при нажатой клавише, обеспечить бесконечную передачу по кабелю «клавы» выбранного символа.

Как и всегда, для правильного последующего расчёта результата, необходимо создать постоянное чередование импульсов в кодовом пакете. Для кодов клавиатуры таких комбинаций может существовать две:

10101010 (55) клавиша « +; = »

01010101 (АА) в типовых таблицах - не применяется

Общая таблица скан-кодов приведена в таблице 14.1

Таблица 14.1 - Скан-коды клавиатуры

Клавиша

Скан-код

Клавиша

Скан-код

Клавиша

Скан-код

Клавиша

Скан-код

Таким образом, при реализации тест-режима и, например, положенном на клавишу «+» грузике в кабеле «клавы» будет присутствовать бесконечная последовательность пакетов импульсов. При этом период следования импульсов в пакете (то есть тактовая частота), будет равна 6,10 или 20 кГц, а частота следования пакетов будет много ниже. Формат данных приведён на рисунке 14.1

Для обмена данными в кабеле клавиатуры служат две линии – KBData и KBSync. При передаче скан-кодов клавиатура выставляет очередной разряд данных на линии KBData и подтверждает передачу переводом из «1» в «0» сигнала на линии KBSync.

Контроллер может сигнализировать о своей неготовности передавать/принимать данные низким уровнем на линии KBSync. Все остальное время, когда нет данных для передачи, обе линии имеют высокий уровень сигнала.



Как следует из вышеприведённого, в спектре ПЭМИН кабеля клавиатуры следует ожидать частотных составляющих с тактовой частотой 1/76,04·10 -6 =13,15 кГц. Причём из-за наличия двух, сдвинутых по фазе, сигналов с разными (но кратными!) периодами, чётные и нечётные частотные составляющие будут отличаться по амплитуде.

Как и следует ожидать, ПЭМИН линии синхроданных неинформативен, в принципе. Но отличить один ПЭМИН от другого совсем непросто. Кабель один, сигналы синхронны…

Практически единственный способ – подобрать скан-код с минимальным числом логических «1» в посылке. Таковыми являются клавиши «F3» и F9» (03 и 01 в hex-коде). Код «00» не используется.

Осциллограмма скан-кода «F3» приведена ниже.


Строго «по энергетике», если измерить все частотные составляющие ПЭМИН с кодом «=» и, например, кодом «F9», то разность в показаниях приёмника на КАЖДОЙ из частотных составляющих и есть истинно информационная часть энергии ПЭМИН. Причём это максимум максиморум. Работа достаточно сложная и утомительная, если нет возможности поручить её «автомату». Сами-то составляющие ПЭМИН для столь низких частот выявляются не без труда. Так ещё и разности «ловить»…



В практике СИ, в подавляющем числе случаев, просто измеряют уровни ПЭМИН (ничего не вычитая) и считают параметр защищённости. Можно и так, «с запасом», но знать истинное положение дел специалист обязан.

В заключение рассмотрения - «распиновка» разъемов AT- и PS/2-клавиатуры.


«Картинки» на приёмнике выглядит далеко не так «классически», однако и он вполне узнаваем. Вот примеры



На спектре хорошо видно возрастание амплитуды компонент с уменьшением частоты.

Есть ещё особенности измерений «клавы» в этой частотной области (от десятков кГц и далее). Дело в том, что клавиатура, в обычном размещении, находится неподалеку от системного блока. А в верхней части СБ находится импульсный блок питания – мощнейший источник ПЭМИН и по «Е», и по «Н» компонентам. В «свете» такого театрального софита, тускловатый «свет» клавиатуры узреть – особое искусство! Поэтому предлагаю следующий приём. Отодвиньте «клаву» от СБ как можно дальше. Лучше – на удлинителе PS/2. Эдак метра на 2-2,5.

Разместите антенну так, чтобы на неё наводилось как можно меньше от СБ (сигнал, при полосе приёмника больше 10 кГц – сплошной спектр). И вот около так сориентированной, неподвижной антенны, начинайте крутить «клаву» и её кабель (не наоборот!). Тогда у Вас будет много больше шансов обнаружить сигналы ПЭМИН именно клавиатуры, увидеть компоненты ПЭМИН на экране анализатора воочую.

Всё вышеизложенное относилось к клавиатуре с интерфейсом PS/2. Но сейчас их массово заменяют клавиатуры с интерфейсом USB.

Вообще этот интерфейс достаточно подробно рассматривался совместно с принтерами. Однако будет нелишним дать некоторое «целеуказание» и относительно клавиатуры.

Вспомним построение пакетов для интерфейса USB, учитывая, что клавиатура подключается, строго, с low-speed (то есть, фактически по интерфейсу USB 1.0).

Максимальный размер полезной нагрузки DATA (payload) для low-speed устройств составляет 8 байт. То есть это, как раз, то, что требует скан-код клавиатуры.

Увидеть сигнал (именно данные) в линии USB оказалось не такой уж простой задачей. Тем не менее – вот что выявилось именно в кабеле типовой USB «клавы» модели GENIUS KB-06XE, конкретно в линии (проводе) «data +» (рисунок 14.10)


Эти две осциллограммы меняют друг друга с неустановленной (хаотической) периодичностью, причём «картинки» сигналов не зависят от нажатой клавиши клавиатуры (или ненажатой никакой). Никаких иных изменений в «переменной» части пакета (фрейма) выявить не удалось.

Периодичность следования этих пакетов жёстко стабилизирована (рис. 14.11), а длительность каждого составляет (видно на осциллограммах) около 34 ±1 мкс.


Пакеты следуют каждые 4 мс. Однако необходимо отметить, что окончание каждого пакета всё время «дрожит», причём заметно, классический «джиттер». Поэтому спектральная картинка несколько размыта и становится чёткой лишь при достаточно длительном усреднении.


Кроме того, следует учитывать, что из-за разных периодов следования импульсов и разной их длительности спектр носит характер некоторой смеси из спектра сплошного и линейчаатого. Тем не менее лепестковый характер спектра, естественный для бесконечной последовательности пакетов и кратный в своих «лепестках» средней длительности пакета, сохраняется весьма наглядно. Только «нули» функции сглажены джиттером и неременным периодом следования отдельных импульсов. Однако сама картинка вполне характерна. При более тонком частотном разрешении спектр начинает разрешаться на «линии», обусловленные частотой следования пакетов (250 Гц) (рис. 14.13)Таким образом, при простейшем и незасинхронизованном с истинной передачей скан-кода просмотре осциллограмм, выявить и визуализовать участки фрейма (пакета), отвечающий за передачу данных, не удалось. Тем не менее, можно утверждать, что ПЭМИН кабеля клавиатуры всё равно будет вот такой и никакой другой. Понятно, на каких частотах его искать, понятно, что он будет носить характер сплошного (во всяком случае, при частотном разрешении приёмника более 0,3 кГц). И понятно, какую величину подставлять при расчётах в качестве тактовой (минимальный период импульсов в пакете в эксперименте составил 1,322 мкс). Измерить это, при любых СИ, имея осциллограф, хотя бы с 200 МГц полосой – задача тривиальная. Тест-режим, по сути – любой, можно нажимать клавиши (любые), можно не нажимать ничего. Пакеты по интерфейсу передаются всё равно. И, в первом приближении, считаем их информативными (пока не доказано обратное).

Приведённые осциллограммы и спектры получены с помощью осциллографа АКИП-4108/2, подключённому к тому же компьютеру, на котором выполнялись измерения (надо заметить – весьма функциональный повтор разработки фирмы «PICO Technology» нашими. Не хуже китайцев:)) .

Спектр явно уходит далеко за 1 МГц (больше не позволил осциллограф, а подключать анализатор большого смысла не было). Остальное обусловлено уже кабелем, как случайной антенной и степенью его экранирования.

Для иных режимов интерфейса USB нужен уже осциллограф с полосою в многие ГГц.

Как именно считать сплошной спектр и, при этом, остаться в рамках действующих НМД – разговор отдельный и не для открытого обсуждения, увы… Однако в последующих публикациях придётся к нему вернуться, деваться некуда. Попытаюсь «остаться в рамках дозволенного»…

Скорее всего на вашем телефоне уже установлен по умолчанию сканер QR-кода, вы можете легко с его помощью просканировать первый QR-код. Сделать это очень легко. Просто следуйте нашей инструкции.

1. Откройте устройство чтения QR-кода на своем телефоне.

2. Держите устройство над QR-кодом так, чтобы он был хорошо виден на экране вашего смартфона.

Если вы правильно держите смартфон над QR-кодом, то в таком случае произойдет следующее:

  • Телефон автоматически сканирует код.
  • В некоторых приложениях для сканирования кода вы должны нажать на изображение, а не на кнопку как для создания фото на вашем смартфоне.

3. Нажмите указанную кнопку, если потребуется.

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

Вы начнете видеть QR-коды повсюду. Они используются для обучения, информирования, объяснения и для многих других вещей. Находите их и сканируете! QR-коды сэкономят вам много времени и усилий.

Как сканировать QR-коды на Android

А теперь мы расскажем вам, как использовать приложение сканирования для QR-кодов на Android.

Кратко:
1. Откройте Play Маркет .
2. Поиск считывателя QR-кода .
3. Выберите QR Code Reader (через Scan).
4. Нажмите «Установить» .
5. Откройте программу чтения QR-кода .
7. Направьте камеру на QR-код.
8. Нажмите «ОК» .

Шаг 1 . Откройте Play Маркет на Android. Это значок в приложении или на главном экране.

Шаг 2. Введите считыватель QR-кода в поисковике. Появится список приложений для чтения QR-кода.

  • Эта статья объясняет, как использовать QR-код Reader, но вы можете выбрать то, приложение, которое вам понравится. Просто не забудьте прочитать о приложении перед загрузкой.
  • Шаги должны быть одинаковыми для всех приложений чтения QR-кода.

Шаг 3. Нажмите QR Code Reader, разработанный Scan. Имя разработчика указано ниже каждого приложения. Возможно, вам придется прокрутить страницу вниз, чтобы найти приложение, сделанное Scan.

Шаг 4. Нажмите « Установить» . Появится всплывающее окно с просьбой предоставить разрешение для доступа к информации на вашем Android.

Шаг 5. Нажмите «Принять» . QR-код Reader теперь будет установлен на вашем Android-устройстве.

    • Когда приложение будет загружено, кнопка «Установить» смениться на «Открыть», и у вас появится новый значок в приложении.

Шаг 6. Откройте QR Code Reader. Это значок, который похож на QR-код в приложении. Откроется приложение, которое выглядит как стандартный экран камеры.

Шаг 7. Выровняйте QR-код в кадре камеры. Немного похоже на то, как вы делаете фотографии, за исключением того, что вам не нужно нажимать какие-либо кнопки. Когда сканер штрих кодов прочитает код, появится всплывающее окно с URL-адресом в коде.


Шаг 8. Нажмите «ОК», чтобы открыть веб-сайт. Это запускает ваш веб-браузер по умолчанию и перемещается по URL-адресу в QR-коде.

Заняться устройством подобного рода меня побудил тот факт, что большая часть простых для повторения геймортовских устройств не позволяла реализовать достаточное количество кнопок управления. Игровой порт PC изначально вообще расчитан максимум на четыре кнопки. Всевозможные расширения также не обладают желаемой гибкостью. К примеру, популярное среди самодельщиков расширение CH Flightstick Pro позволяет реализовать до 14-ти кнопок, но при этом одновременно нельзя использовать две любые кнопки - о полетах на таких устройствах в играх, в которых приходится постоянно «крутить головой» - в тех же птичках, можно забыть. Некоторые расширения используют исключительно цифровой интерфейс - данные о нажатых кнопках и отклонении ручки передаются по цифровым линиям геймпорта, которые изначально предназначались для передачи данных о четырех «стандартных» кнопках. Я даже считаю такие расширения в чем-то избыточными. Да и преобразование аналоговых данных в цифровые усложняет конструкцию джойстика. Кроме того, не всякая игра захочет понять что за монстр к ней «присосался». А клава - вот она, во всей своей 102-х клавишной красе! Кроме того, масла в огонь подливали подписчики RU.GAME.FLIGHT, время от времени вопрошавшие «а как бы мне клаву приручить и с джоем скрестить?» и уходившие ни с чем.

Короче говоря, задача устройства - «сидеть» на шине между клавиатурой и PC и имитировать нажатие клавиш на клавиатуре, в соответствии с нажатыми кнопками устройства.

Итак, я засел за разработку. До этого у меня был опыт работы с различными микропроцессорами и микроконтроллерами. В общем - пальцы от уха до уха. И я наивно полагал, что вот, сейчас я возьму доки, сделаю RTFM и через неделю буду на белом коне. Вся загвоздка оказалась в том, что документации о протоколе передачи данных между клавиатурой и контроллером я не смог найти ни в Интернете, ни в соответствующих конференциях Фидо. Пришлось брать осцилограф и несколько недель заниматься разбором времянок и попытками их повторить. Поэтому большая часть изложенной ниже информации является результатом моих умозаключений и не подтверждена документально. Если я в чем-то заблуждаюсь - рад буду выслушать комментарии по адресу rashpil at ukr dot net .

Основные принципы передачи данных

Все нижеследующее справедливо для PS/2 и AT-клавиатур, которые отличаются только исполнением разъема (могут подключаться через переходник).

Между клавиатурой и контроллером, расположенным на материнской плате компьютера (далее - просто «контроллером»), осуществляется двусторонний обмен данными. Контроллер передает различные команды (например - изменение состояния светодиодов или скорости автоповтора). Клавиатура передает скан-коды нажатых клавиш (скан-код - условное обозначение клавиши, не стоит путать с ASCII-кодами).

Скан-коды

Клавиша Скан-код Клавиша Скан-код Клавиша Скан-код Клавиша Скан-код
1 16 2 1E 3 26 4 25
5 2E 6 36 7 3D 8 3E
9 46 0 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 * 7C Num Lock 77
7 6C 8 75 9 7D - 7B
4 6B 5 73 6 74 + 5A
1 69 2 72 3 7A 0 70
. 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 E0-5A / 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 - обработка принятых данных)

Пример передачи байта 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 в надежде на то, что пытливый читатель сможет меня поправить или адаптировать программу для работы с другим типом микроконтроллера.

Org 0 sjmp start org 3 jmp from_keyboard ; INT0 org 13h jmp to_keyboard ; INT1 start mov a,#5 ; установка типа прерываний mov tcon,a ; INT0 и INT1 по фронту - mov a,#0 ; переход из "1" в "0" mov ip,a mov a,#85h mov ie,a mov a,#0ffh ; по адресу 06h хранится последний mov 6,a ; обработанный код clr p1.4 ; разрешение опроса loop mov a,p1 ; считывается состояние кнопок anl a,#15 ; - младшие четыре разряда порта P1 ; D0 - вверх; D1 - вправо; D2 - вниз; D3 - влево mov dptr,#hat_table ; считанные данные о четырех кнопках movc a,@a+dptr ; расширяются до восьми направлений; D0 - вверх; D1 - вправо; D2 - вниз; D3 - влево; D4 - вправо-вверх; D5 - вправо-вниз; D6 - влево-вниз; D7 - влево-вверх mov r2,a ; сохранение данных mov r0,a xrl a,6 ; если новые данные не отличаются от jz loop ; полученных в предыдущем цикле - повторяем опрос mov r1,#8 ; цикл для восьми разрядов loop3 jnb acc.7,loop2 ; "1" - было изменение push acc mov a,r1 mov dptr,#key_table-1 ; извлекаем соответствующий скан-код movc a,@a+dptr push acc mov a,r0 ; ресистр R0 - признак нажатия/отпускания rlc a ; эмулируемой клавиши mov r0,a ; "1" - "клавиша" была отпущена pop acc mov acc.7,c ; если D7=1 - скан-коду будет предшествовать 0f0h acall send_key ; выдача скан-кода pop acc sjmp loop2a loop2 push acc mov a,r0 rlc a mov r0,a pop acc loop2a rl a djnz 1,loop3 mov 6,r2 sjmp loop send_key mov ie,#80h ; прерывания запрещены acall send2comp ; посылка скан-кода mov ie,#85h ; прерывания разрешены ret send2comp jnb acc.7,send ; при необходимости первым выдается 0f0h push acc mov a,#0f0h acall send pop acc clr acc.7 mov b,#200 l9 nop djnz b,l9 send push 1 push 0 clr p3.3 ; P3.3 - KBData mov b,#6 ; выдача стартового бита l10 nop djnz b,l10 clr p3.5 mov b,#15 l2 nop djnz b,l2 setb p3.5 mov b,#6 l3 nop djnz b,l3 mov r0,#8 ; выдача восьми бит данных и подсчет четности mov r1,#1 byte_loop xrl 1h,a rrc a mov p3.3,c mov b,#6 l6 nop djnz b,l6 clr p3.5 mov b,#15 l4 nop djnz b,l4 setb p3.5 mov b,#6 l5 nop djnz b,l5 djnz r0,byte_loop mov a,r1 mov c,acc.0 mov p3.3,c ; выдача разряда четности mov b,#6 l8 nop djnz b,l8 clr p3.5 mov b,#15 l12 nop djnz b,l12 setb p3.5 mov b,#6 l13 nop djnz b,l13 setb p3.3 ; выдача стопового бита mov b,#6 l7 nop djnz b,l7 clr p3.5 mov b,#15 l11 nop djnz b,l11 setb p3.5 mov b,#200 l14 nop djnz b,l14 setb p3.5 pop 0 pop 1 ret from_keyboard ; передача одного байта к контроллеру mov ie,#80h push psw push acc push b mov b,#2 in6 jnb p3.4,in8 djnz b,in6 sjmp in7 in8 mov b,#10 in1 mov a,p3 rl a orl a,#11010111b mov p3,a jnb p3.4,in1 in2 mov a,p3 rl a orl a,#11010111b mov p3,a jb p3.4,in2 djnz b,in1 in3 mov a,p3 rl a orl a,#11010111b mov p3,a jnb p3.4,in3 mov p3,#0ffh in4 jb p3.5,in4 in5 jnb p3.3,in7 clr p3.4 jnb p3.5,in5 in7 mov p3,#0ffh pop b pop acc pop psw mov tcon,#5 mov ie,#85h reti to_keyboard ; передача одного байта к клавиатуре mov ie,#80h push psw push acc push b mov b,#5 out61 jb p3.5,out7 djnz b,out61 setb p3.4 setb p3.2 out62 jnb p3.5,out62 out6 mov c,p3.4 mov p3.5,c mov c,p3.3 mov p3.2,c jb p3.4,out6 out8 mov b,#10 out1 mov c,p3.4 mov p3.5,c mov c,p3.3 mov p3.2,c jnb p3.4,out1 out2 mov c,p3.4 mov p3.5,c mov c,p3.3 mov p3.2,c jb p3.4,out2 djnz b,out1 out3 mov c,p3.4 mov p3.5,c mov c,p3.2 mov p3.3,c jnb p3.2,out3 out7 mov p3,#0ffh pop b pop acc pop psw mov tcon,#5 mov ie,#85h reti hat_table ; таблица для расширения данных считанных с порта P1 ; индекс в таблице - четырехразрядный двоичный код; данные - состояние восьми эмулируемых клавиш; "0" - клавиша нажата db 0ffh ; влево+вправо+вверх+вниз=запрещенная комбинация db 0ffh ; влево+вправо+вниз=запрещенная комбинация db 0ffh ; влево+вверх+вниз=запрещенная комбинация db 0bfh ; влево+вниз=влево-вниз db 0ffh ; влево+вправо+вверх=запрещенная комбинация db 0ffh ; влево+вправо=запрещенная комбинация db 07fh ; влево+вверх=влево-вверх db 0f7h ; влево db 0ffh ; вправо+вверх+вниз=запрещенная комбинация db 0dfh ; вниз+вправо=вниз-вправо db 0ffh ; вверх+вниз=запрещенная комбинация db 0fbh ; вниз db 0efh ; вправо+вверх=вправо-вверх db 0fdh ; вправо db 0feh ; вверх db 0ffh ; нет нажатых кнопок key_table ; таблица скан-кодов db 75h ; numpad 8 db 74h ; numpad 6 db 72h ; numpad 2 db 6bh ; numpad 4 db 7dh ; numpad 9 db 7ah ; numpad 3 db 69h ; numpad 1 db 6ch ; numpad 7

В архиве 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 должны также появляться ипульсы. Если это не поможет - напишите мне (rashpil at aport dot ru ) багрепорт, указав модель и тип (AT, PS/2) своей клавиатуры, материнской платы/мультикарты, использованого микроконтроллера и частоту использованого кварцевого резонатора. Я постарался протестировать устройство с максимальным числом доступных мне материнских плат и клавиатур - неполадок выявлено не было. В моем случае использован кварц 14.2МГц.

Known bugs

Текущая версия микропрограммы содержит такие недоработки:

  • Не отслеживаются двухбайтовые скан-коды. Это приводит к тому, что иногда, при использовании одновременно хатки и клавиатуры, клавиши клавиатуры «зависают» в нажатом состоянии или воспринимаются неверно;
  • Иногда неверно передаются данные от контроллера к клавиатуре. Это может выражаться, например, в том, что не меняют свое состояние светодиоды, при нажатии клавиш Num Lock, Caps Lock, Scroll Lock;
  • Дребезг контактов кнопок хатки. Пока что это не стало фатальным для меня в играх.

Планы на будущее

Вот краткий список того, что я хотел бы реализовать в последующих версиях:

  • Мелкие багфиксы - более корректная обработка сигналов; отслеживание двухбайтовых скан-кодов;
  • Подключение матрицы 16x4 - поддержка до 64-х кнопок или двух хаток и до 56-ти кнопок;
  • Поддержка до 16-ти различных раскладок скан-кодов, сохраненных в ПЗУ микроконтроллера;
  • Подключение микросхемы NVRAM с возможностью сохранения и перепрограммирования «на лету» до 32-х раскладок скан-кодов.

Заключение

Я постарался изложить все данные, необходимые для понимания принципа функционирования моего устройства. Это описание не претендует на стопроцентную техническую точность. Если я в чем-то заблуждаюсь - пожалуйста изложите мне свою версию событий. Если вы сможете внести в мою схему и/или микропрограмму улучшения и дополнения, если у вас есть идеи относительно дальнейшего развития схемы - также сообщите мне об этом. Кроме того, жду информации от умельцев, которые смогли повторить или адаптировать это устройство под другие типы микроконтроллеров.

Владимир "Рашпиль" Климус (rashpil at ukr dot net )