Дополнительная клавиатура падонка.

Автор - Pahan
Лауреат Конкурса "Поздравь Кота по-человечески 2009", приз в номинации "Моя родная русский язык".
Опубликовано 02.09.2009.
   Как известно, одной из отличительных черт правильного падонка является способность много и быстро "срать в каментах". С другой стороны, как установили бретанские учоные, словарный запас падонков относительно не велик и сопоставим по размерам со словарным запасом Эллочки-людоедки из известного произведения Ильфа-Пертова. Фразы, используемые в речи падонка, достаточно просты и типизированы. Мысль выражается путем комбинирования в различных вариантах относительно небольшого количества слов или фраз. В виду всего вышесказанного, было решено создать дополнительную клавиатуру, которая помогала бы падонку быстро и без ошибок вводить текст в компьютер путем одномоментного ввода всей фразы целиком, а не по отдельным буквам в случае обычной клавиатуры. В результате была разработана и испытана дополнительная клавиатура, состоящая из 40 кнопок и подключаемая между компьютером и "настоящей" клавиатурой. 39 клавиш дополнительной клавиатуры используются непосредственно для вывода фраз, а одна клавиша для изменения режима выводимых букв (все маленькие; первая буква большая, остальные маленькие; все буквы большие).
   Структурная схема разработанной дополнительной клавиатуры (в дальнейшем девайс) представлена на рисунке 1. Алгоритм работы достаточно прост и понятен из блок-схемы. "Настоящая" клавиатура соединена с компьютером через аналоговые ключи девайса. Питание идет от компьютера. Всё основное время ключи переключены в положение "настоящая" клавиатура-компьютер. Контроллер (МК) девайса постоянно опрашивает свою локальную клавиатуру, состоящую из 40 кнопок и организованную в 8 строк по 5 столбцов, и как только зафиксирован факт нажатия кнопки (с учетом дребезга контактов), происходит вывод фразы. Вначале МК, не разрывая цепи компьютер-клавиатура, подключает на чтение линии clk и data для проверки на них наличия "1" в течение чуть больше 1 периода clk, что является признаком свободной линии (нет передачи данных). Если линия свободна, размыкаются ключи клавиатура-компьютер, выводы МК переключаются на вывод и замыкаются ключи МК-компьютер. После этого происходит передача фразы, соответствующей нажатой кнопке. По окончании передачи восстанавливается исходное положение ключей клавиатура-компьютер. Если же линия клавиатура-компьютер занята и не освобождается в течение некоторого времени, передача фразы не происходит и после аудиовизуального сообщения об ошибке путем мигания красно-зеленым светодиодом и генерации звукового сигнала на пьезодинамик, МК возвращается к опросу своей клавиатуры. Питание "настоящей" клавиатуры во время отключения линий данных не прерывается, что позволяет сохранить переданные в неё данные от компьютера (состояние индикаторов, длительность автоповтора и др.).
   Рис. 1.   Блок-схема дополнительной клавиатуры    (линии clk и data от ключей к МК для упрощения показаны однонаправленными, т.к. другое направление служит только для проверки свободной линии, а не для передачи данных)  
   Подробное описание протокола обмена данными клавиатуры с компьютером можно найти на сайте http://www.beyondlogic.org/keyboard/keybrd.htm. В нашем случае нужен только вариант передачи от клавиатуры к компьютеру. Для обмена данными служат две линии – Data и Clk. При передаче данных клавиатура выставляет очередной разряд данных на линию Data и подтверждает передачу задним фронтом ("1" в "0") на линии Clk. Передача одного байта состоит из 11-ти бит. Один стартовый бит (всегда "0"), 8 бит данных (D0-D7), бит чётности и один стоповый бит (всегда "1"). Бит чётности равен "1", если в байте данных чётное количество бит, иначе "0".
   При нажатии на клавишу клавиатура передает скан-код этой клавиши, состоящий из одного или нескольких байт, а при отпускании – сначала префикс 0F0h, а потом скан-код отпущенной клавиши. С точки зрения клавиатуры, все клавиши, включая системные (типа Caps Lock, Pause, Control и др.), ничем не различаются. Каждая клавиша имеет только один скан-код, поэтому режимы типа Caps Lock, Num Lock, русских букв и другие обрабатываются программно уже в компьютере. Таблицу скан-кодов можно посмотреть на рис. 2, а пример передачи данных при нажатии клавиши "D" (или, если хотите, - "d", "В" или "в") на рис.3. Режим автоповтора заключается в том, что если клавиша не отпущена, через определенные интервалы времени клавиатура повторно посылает скан-код нажатой клавиши.
   Рис. 2.   Скан-коды клавиш
 
   Рис. 3.   Пример передачи скан-кода 023h  
   Частота следования импульсов на линии Clk по разным источникам находится в пределах 10-30 кГц. Однако реально, на мой взгляд, этот диапазон намного шире. При экспериментах с передачей данных все отлично работало даже при 6 кГц. В моей "настоящей" клавиатуре частота clk была около 11,5 кГц. Также абсолютно не критично время между 2 посылками скан-кодов и на практике его можно взять где-то в районе 10 Гц (передача 10 скан-кодов в секунду). Однако слишком сильно уменьшать время не следует, так как компьютер может не успеть обработать нажатия клавиш и будет издавать динамиком писк переполнения буфера (наверняка вы все его слышали, например, если на подвисшем компе долго жать клавиши).
   С теорией покончено, перейдем к практике. Схему девайса можно увидеть на рисунке 4. Т.к. протокол обмена не критичен к точным временнЫм интервалам, можно обойтись без кварца, использовав внутренний генератор и освободив 2 ноги контроллера для других нужд. Перемычки JP1-JP3 нужны для внутрисхемного программирования. При программировании их надо снять, освободив тем самым разъем ICSP для подключения программатора. В гнездо XS1 типа "мама" подключается "настоящая" клавиатура, а XS2 - "папа", втыкается в компьютер (я взял кабель от ненужной клавиатуры).
   Рис. 4.   Принципиальная схема девайса   (кликните мышкой для увеличения)  
   В кружочках на схеме подключаются кнопки, образующие клавиатуру падонка. Кнопки, подписанные цифрами 01-39, служат для набора фраз, а кнопка "Mode" является местным (локальным) аналогом "Caps Lock" и имеет 3 состояния. Tекущее состояние клавиатуры индицируется двухцветным светодиодом HL1 (можно взять 2 отдельных светодиода). Когда светодиод погашен - все буквы фразы выводятся маленькими буквами. Если он светится красным - первая буква выводится заглавной, остальные маленькие. При зеленом цвете вся фраза целиком пишется заглавными буквами. Кнопка "Mode" переключает эти режимы по кругу. Светодиод HL1 также служит для визуальной индикации ошибки "Линия занята", при этом во время писка динамика он мигает зелено-красным цветом, а потом возвращается в состояние, соответствующее текущему режиму вывода. Надо признать, что при реальной работе спровоцировать ошибку "Линия занята" мне так и не удалось. Даже когда при максимальной скорости автоповтора с "настоящей" клавиатуры, нажать кнопку падонкафской, она всегда корректно вклинивалась между автоповтором и передавала свою фразу. Для проверки пришлось тупо посадить линию clk и/или data на землю.
   Рис. 5.   Собранная клавиатура. Монтаж реального падонка. Ну а хуле :)  
   Поскольку конкурс РадиоКота как всегда нагрянул неожиданно, как очередная зима для комунальщиков, времени на разработку платы и изготовление корпуса не осталось. Клавиатура была спаяна воздушно-проводным методом в стиле настоящего падонка и сиё творение вы можете лицезреть на рисунке 5 (кликните мышкой для загрузки большой картинки с поясняющими надписями). Как видно из фотки, из 40 кнопок клавиатуры пока используется 10 (вы тоже можете распаять столько кнопок, сколько нужно). Но при отладке, естественно, были проверены на работоспособность абсолютно все кнопки.
   Теперь немного о деталях. Обратите внимание, что на приципиальной схеме показан ПИК с 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) выглядит следующим образом:
 
get_phrase04_cur_char
 movlw   HIGH $
 movwf   PCLATH
 movf    phrase_currcnt, W
 addwf   PCL, F
 retlw   .len    ;кол-во символов + 1
 retlw   0x__    ;первая буква
 retlw   0x__    ;вторая буква
 ........
 retlw   0x__    ;последняя буква

 
В первом возвращаемом retlw значении (len) задается количество символов (букв) в фразе + 1. Далее идут скан-коды символов (букв), составляющих фразу. Определить какой скан-код надо вписать, можно так. Если буква русская, смотрим на клавишу "настоящей" клавиатуры, где она находится и запоминаем английскую букву, которая нарисована на этой же клавише. Далее определяем скан-код клавиши по рис.2 и вписываем его в подпрограмму. Длина одной фразы не может быть больше 250 символов. К тому же надо учитывать, что объем памяти, отведенный под все фразы, составляет чуть меньше 1К. Также следует проверить после компиляции (в сгенерённом листинге), что ни одна подпрограмма не попала на границу страниц программной памяти (адреса кратные 256) и не находится на разных страницах. В принципе, в исходнике я эту ситуацию разрулил директивами org, но иметь это в виду не помешает. Также нельзя использовать знаки, скан-коды которых состоят из более чем одного байта (например, "/" на дополнительной клавиатуре). Список фраз в моем исходнике и их соответствие кнопкам падонкафской клавиатуры приведен в таблице.
KeyФраза 01   абасрацца 02   абассацца 03   аффтар 04   выпей йаду 05   пеши исчо 06   убей сибя ап стену 07   спасиба падрачил 08   ахуеть дайте две 09   аццкий сотона 10   беспесды 11   ф дисятке 12   жывотное 13   жжош сцуко 14   ф топку 15   ф газенваген 16   зачот 17   низачот 18   ниибёт 19   ниибаццо 20   кросафчег 21   ниасилил патамушта многабукафф 22   отжыг 23   пелотка 24   пацтулом 25   пацталом 26   упалпацтол 27   валялсо пацтулом 28   ржунимагу 29   парвало моск нах 30   слиф зощитан 31   тема сисег раскрыта 32   тема сисег нираскрыта 33   ужоснах 34   фигасе 35   плюс пицот 36   криатифф 37   учи олбанский 38   риальный падонаг 39   йа креведко    Как писалось выше, каждая клавиша имеет только один скан-код, поэтому изменение регистра букв происходит путем посылки скан-кода клавиши "Shift". Например, [Shift] первая буква фразы [F0h] [Shift] остальные буквы фразы. Или [Shift] все буквы фразы [F0h] [Shift]. При этом надо учитывать состояние Caps Lock на "настоящей" клавиатуре. Если он включен, эффект от Shift'а будет как раз обратный. Гляньте табличку возможных вариантов написания фразы в зависимости от состояния Caps Lock.
HL1 на клаве падонкаCaps Lock выключенCaps Lock включен не светитсяпримерПРИМЕР красныйПримерпРИМЕР зелёныйПРИМЕРпример    Использование Shift для изменения регистра букв накладывает еще одну особенность на подбор фразы. Если используются не буквенные клавиши, а цифры или клавиши со знаками препинания или скобками, то при нажатом Shift'е они изменят значение на другое. Например цифра 5 после посылки скан-кода [Shift] становится знаком "%". Поэтому такие символы лучше не использовать или смириться с тем, что при некоторых режимах они будут отображаться по другому.
   Клавиатура падонка тестировалась на различных компьютерах, начиная с Pentium IV и AMD AthlonXP 2600+, до довольно древних PIII и нотика Compaq Armada 1500c, и ни на одном из них не было выявлено каких-либо проблем с работой девайса. Однако вполне может случиться, что на каком-нибудь компе она не заработает. Скорее всего дело будет во временнЫх интервалах между посылками скан-кодов. В исходнике есть несколько подпрограмм для генерации различных задержек. Изменяя их в разумных пределах, скорее всего можно будет добиться нормальной работы девайса. Итак, перечислю их в порядке важности (начинать подбор рекомендую с первой):
 
 •  delay_key_out - длительность между отсылкой скан-кодов
 •  delay_F0 - длительность между отсылкой префикса F0h и скан-кода
 •  delay_kbclk - задаёт длительность 1/2 периода clk

   И напоследок, раскрою тайный смысл двух ячеек EEPROM. Первая имеет адрес 01 и там записана переменная, отвечающая за добавление пробела в начало и/или в конец фразы. Если бит 0 равен "1", то пробел добавляется в начале фразы. Если бит 1 равен "1", то пробел добавляется в конце фразы. Если какой-нибудь из этих битов равен "0", то пробел не добавляется в соответствующей позиции. Ячейка по адресу 03 отвечает за начальную инициализацию кнопки "Mode". Если там записан 0 - при включении устанавливается режим маленьких букв, 1 - режим "первая большая, остальные маленькие" и 3 - режим больших букв. Если записано любое другое число, оно приравнивается к 0. Изменить эти ячейки можно или в исходнике с последующей перекомпиляцией, или прямо в программе-прошивальщике в области данных EEPROM (например, см. рисунок 6 для WinPic800).
   Рис. 6.   Изменение ячеек EEPROM в программе WinPic800  
   При прошивке контроллера никаких фьюзов вручную выставлять не надо, все нужные данные находятся внутри HEX-файла. Достаточно просто открыть HEX и сразу запустить программирование. А тем, кто решит повторить сей девайс - удачной сборки и эксплуатации... Да, и не забывайте перед использованием клавиатуры падонка переключаться на русский язык.
Файлы:
Исходник на asm.
Готовый HEX (можно заливать без изменений как в 628-й, так и в 648-й ПИКи).
Вопросы, как обычно, складываем тут.






Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.