![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Дополнительная клавиатура падонка.
Автор: Pahan Как известно, одной из отличительных черт правильного падонка является способность много и быстро "срать в каментах". С другой стороны, как установили бретанские учоные, словарный запас падонков относительно не велик и сопоставим по размерам со словарным запасом Эллочки-людоедки из известного произведения Ильфа-Пертова. Фразы, используемые в речи падонка, достаточно просты и типизированы. Мысль выражается путем комбинирования в различных вариантах относительно небольшого количества слов или фраз. В виду всего вышесказанного, было решено создать дополнительную клавиатуру, которая помогала бы падонку быстро и без ошибок вводить текст в компьютер путем одномоментного ввода всей фразы целиком, а не по отдельным буквам в случае обычной клавиатуры. В результате была разработана и испытана дополнительная клавиатура, состоящая из 40 кнопок и подключаемая между компьютером и "настоящей" клавиатурой. 39 клавиш дополнительной клавиатуры используются непосредственно для вывода фраз, а одна клавиша для изменения режима выводимых букв (все маленькие; первая буква большая, остальные маленькие; все буквы большие). Структурная схема разработанной дополнительной клавиатуры (в дальнейшем девайс) представлена на рисунке 1. Алгоритм работы достаточно прост и понятен из блок-схемы. "Настоящая" клавиатура соединена с компьютером через аналоговые ключи девайса. Питание идет от компьютера. Всё основное время ключи переключены в положение "настоящая" клавиатура-компьютер. Контроллер (МК) девайса постоянно опрашивает свою локальную клавиатуру, состоящую из 40 кнопок и организованную в 8 строк по 5 столбцов, и как только зафиксирован факт нажатия кнопки (с учетом дребезга контактов), происходит вывод фразы. Вначале МК, не разрывая цепи компьютер-клавиатура, подключает на чтение линии clk и data для проверки на них наличия "1" в течение чуть больше 1 периода clk, что является признаком свободной линии (нет передачи данных). Если линия свободна, размыкаются ключи клавиатура-компьютер, выводы МК переключаются на вывод и замыкаются ключи МК-компьютер. После этого происходит передача фразы, соответствующей нажатой кнопке. По окончании передачи восстанавливается исходное положение ключей клавиатура-компьютер. Если же линия клавиатура-компьютер занята и не освобождается в течение некоторого времени, передача фразы не происходит и после аудиовизуального сообщения об ошибке путем мигания красно-зеленым светодиодом и генерации звукового сигнала на пьезодинамик, МК возвращается к опросу своей клавиатуры. Питание "настоящей" клавиатуры во время отключения линий данных не прерывается, что позволяет сохранить переданные в неё данные от компьютера (состояние индикаторов, длительность автоповтора и др.).
При нажатии на клавишу клавиатура передает скан-код этой клавиши, состоящий из одного или нескольких байт, а при отпускании – сначала префикс 0F0h, а потом скан-код отпущенной клавиши. С точки зрения клавиатуры, все клавиши, включая системные (типа Caps Lock, Pause, Control и др.), ничем не различаются. Каждая клавиша имеет только один скан-код, поэтому режимы типа Caps Lock, Num Lock, русских букв и другие обрабатываются программно уже в компьютере. Таблицу скан-кодов можно посмотреть на рис. 2, а пример передачи данных при нажатии клавиши "D" (или, если хотите, - "d", "В" или "в") на рис.3. Режим автоповтора заключается в том, что если клавиша не отпущена, через определенные интервалы времени клавиатура повторно посылает скан-код нажатой клавиши.
С теорией покончено, перейдем к практике. Схему девайса можно увидеть на рисунке 4. Т.к. протокол обмена не критичен к точным временнЫм интервалам, можно обойтись без кварца, использовав внутренний генератор и освободив 2 ноги контроллера для других нужд. Перемычки JP1-JP3 нужны для внутрисхемного программирования. При программировании их надо снять, освободив тем самым разъем ICSP для подключения программатора. В гнездо XS1 типа "мама" подключается "настоящая" клавиатура, а XS2 - "папа", втыкается в компьютер (я взял кабель от ненужной клавиатуры).
Теперь немного о деталях. Обратите внимание, что на приципиальной схеме показан ПИК с 20-ю ногами в корпусе SSOP. Корпуса DIP и SOIC имеют 18 ног, поэтому при их использовании сверьтесь с даташитом. Также, если быть совсем честным, я в реальной схеме использовал не 628-й ПИК, а 648. Просто потому, что он уже был распаян на макетке. Но т.к. это полностью совместимые ПИКи, с той лишь разницей, что у 648 на 2К памяти больше, проблем быть не должно. Программа писалась в расчете на 2 кило памяти и полностью влезает в 628-й. Более того, прошивка без всяких изменений может быть залита в оба ПИКа. В схеме указан 628-й только потому, что при повторении схемы, если вы детали покупаете в магазине, он более дешевый. Ключ 74HCT4066 можно заменить на 40166 или 4066, но я это не проверял. Как писалось выше, двухцветный светодиод можно заменить на два отдельных. Цвет свечения выбирайте какой больше нравится. Динамик BF1 - обычная пьезо пищалка (он также используется для коротенького писка при нажатиях на кнопки). Диоды любые, можно КД522. Остальное по вкусу :) Программа для контроллера была написана на ассемблере в среде MPLAB IDE. Исходник прилагается в конце статьи и при желании вы можете его изменить под свои нужды. Если вы захотите изменить фразу, заданную на какую-нибудь кнопку, необходимо изменить подпрограмму get_phrasexx_cur_char, где xx - номер кнопки по принципиальной схеме. Сама подпрограмма (в данном случае для кнопки 04) выглядит следующим образом:
Как писалось выше, каждая клавиша имеет только один скан-код, поэтому изменение регистра букв происходит путем посылки скан-кода клавиши "Shift". Например, [Shift] первая буква фразы [F0h] [Shift] остальные буквы фразы. Или [Shift] все буквы фразы [F0h] [Shift]. При этом надо учитывать состояние Caps Lock на "настоящей" клавиатуре. Если он включен, эффект от Shift"а будет как раз обратный. Гляньте табличку возможных вариантов написания фразы в зависимости от состояния Caps Lock.
Использование Shift для изменения регистра букв накладывает еще одну особенность на подбор фразы. Если используются не буквенные клавиши, а цифры или клавиши со знаками препинания или скобками, то при нажатом Shift"е они изменят значение на другое. Например цифра 5 после посылки скан-кода [Shift] становится знаком "%". Поэтому такие символы лучше не использовать или смириться с тем, что при некоторых режимах они будут отображаться по другому. Клавиатура падонка тестировалась на различных компьютерах, начиная с Pentium IV и AMD AthlonXP 2600+, до довольно древних PIII и нотика Compaq Armada 1500c, и ни на одном из них не было выявлено каких-либо проблем с работой девайса. Однако вполне может случиться, что на каком-нибудь компе она не заработает. Скорее всего дело будет во временнЫх интервалах между посылками скан-кодов. В исходнике есть несколько подпрограмм для генерации различных задержек. Изменяя их в разумных пределах, скорее всего можно будет добиться нормальной работы девайса. Итак, перечислю их в порядке важности (начинать подбор рекомендую с первой): И напоследок, раскрою тайный смысл двух ячеек EEPROM. Первая имеет адрес 01 и там записана переменная, отвечающая за добавление пробела в начало и/или в конец фразы. Если бит 0 равен "1", то пробел добавляется в начале фразы. Если бит 1 равен "1", то пробел добавляется в конце фразы. Если какой-нибудь из этих битов равен "0", то пробел не добавляется в соответствующей позиции. Ячейка по адресу 03 отвечает за начальную инициализацию кнопки "Mode". Если там записан 0 - при включении устанавливается режим маленьких букв, 1 - режим "первая большая, остальные маленькие" и 3 - режим больших букв. Если записано любое другое число, оно приравнивается к 0. Изменить эти ячейки можно или в исходнике с последующей перекомпиляцией, или прямо в программе-прошивальщике в области данных EEPROM (например, см. рисунок 6 для WinPic800).
Файлы: Вопросы, как обычно, складываем тут.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |