Введение

Наби­рая текст на кла­ви­а­ту­ре мы не заду­мы­ва­ем­ся как она рабо­та­ет, пока не столк­нем­ся с той или иной про­бле­мой, для реше­ния кото­рой уже нуж­но пони­ма­ние внут­рен­не­го устрой­ства. Часто поль­зо­ва­те­ли и гей­ме­ры стал­ки­ва­ют­ся с про­бле­ма­ми свя­зан­ны­ми с одно­вре­мен­ным нажа­ти­ем несколь­ких кла­виш. В неко­то­рых ситу­а­ци­ях это непри­ят­но, а ино­гда даже кри­тич­но. Давай­те раз­би­рать­ся, что такое KRO, #KRO, 6KRO, NKRO и Ghosting.

Рас­шиф­ру­ем эти аббревиатуры:

KRO (Key Rollover) Коли­че­ство одно­вре­мен­ных нажа­тий клавиш.

#KRO – сим­вол # – это мак­си­маль­ное коли­че­ство кла­виш, кото­рые мож­но нажать одно­вре­мен­но и не сомне­вать­ся, что сиг­нал будет пра­виль­но обра­бо­тан и пере­дан ком­пью­те­ру. Боль­шин­ство мем­бран­ных кла­ви­а­тур выпус­ка­ет­ся в клас­сах 2KRO или 3KRO. Сре­ди меха­ни­че­ских встре­ча­ют­ся и кла­ви­а­ту­ры клас­са 20KRO.

6KRO – (6‑Key Rollover) 6 одно­вре­мен­ных нажа­тий клавиш.

NKRO – неогра­ни­чен­ное коли­че­ство одно­вре­мен­ных нажа­тий клавиш.

Ghosting – «фан­том­ное нажа­тие». Пода­ча сиг­на­ла с кла­ви­ши, кото­рой вы не касались.

Раз­бе­рем­ся как фик­си­ру­ют­ся и пере­да­ют­ся нажа­тия кла­виш в раз­лич­ных кла­ви­а­ту­рах и как это устроено.

Пол­но­раз­мер­ная кла­ви­а­ту­ра содер­жит 104/105 кла­виш. Для реги­стра­ции нажа­тия со сто­про­цент­ной точ­но­стью тре­бу­ет­ся про­ве­сти от каж­дой кноп­ки до кон­трол­ле­ра про­вод и один общий на все — зем­лю. При­мер­но по такой схеме:

Логич­но, что дан­ная реа­ли­за­ция слож­ная и доро­га в про­из­вод­стве, виной тому, в основ­ном, физи­че­ские огра­ни­че­ния мик­ро­кон­трол­ле­ров, на базе кото­рых стро­ят­ся кла­ви­а­ту­ры. Дело в том, что с уве­ли­че­ни­ем коли­че­ства выво­дов у мик­ро­кон­трол­ле­ров и про­грам­ми­ру­е­мых логи­че­ских мик­ро­схем рас­тёт и их раз­мер, что, в свою оче­редь, вле­чёт за собой рост энер­го­по­треб­ле­ния, воз­мож­но­стей, но глав­ное — цены. В ито­ге, вы може­те выбрать либо дешё­вый чип с неболь­шой про­из­во­ди­тель­но­стью, но с малым коли­че­ством вхо­дов и выхо­дов, либо более мощ­ную мик­ро­схе­му, про­из­во­ди­тель­ность кото­рой, одна­ко, силь­но пре­вы­ша­ет ваши тре­бо­ва­ния. Но толь­ко этот мощ­ный чип будет обла­дать доста­точ­ным коли­че­ством выво­дов, что­бы под­клю­чить каж­дую кноп­ку клавиатуры.

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

В слу­чае, если вы нажи­ма­е­те, S + H и захо­ти­те нажать тре­тью кла­ви­шу в дру­гом ряду, кон­трол­лер уже не может ска­зать, какая из линий была замкну­та и в луч­шем слу­чае не обна­ру­жит одно из трёх нажа­тий, а в худ­шем, из-за осо­бен­но­стей раз­вод­ки, опре­де­лит ещё какое нибудь лиш­нее, кото­рое вы не совершали. 

Давай­те посмот­рим, что слу­чит­ся, если нажать несколь­ко кно­пок, нахо­дя­щих­ся одно­вре­мен­но в одной стро­ке и в одном столбце.

При­мер фан­том­но­го нажатия

На рисун­ке три кноп­ки нажа­ты одно­вре­мен­но. Две из них нахо­дят­ся в столб­це «C2», и две — в стро­ке «Rm». Это зна­чит, что одна из нажа­тых кно­пок делит стро­ку с дру­гой нажа­той кноп­кой, а стол­бец — с тре­тьей нажа­той кноп­кой. Имен­но в такой ситу­а­ции и про­ис­хо­дит фан­том­ное нажа­тие. Пред­ставь­те, что в дан­ный момент мы опра­ши­ва­ем стол­бец «C1» (то есть, он при­дав­лен к зем­ле — нахо­дит­ся в состо­я­нии «0»). Такой харак­тер­ный аккорд нажа­тых кно­пок при­во­дит к сле­ду­ю­ще­му: даже несмот­ря на то, что левая верх­няя кноп­ка не нажа­та, стро­ка «R2» нахо­дит­ся в состо­я­нии «0», пото­му что она при­дав­ле­на к зем­ле столб­цом «C1» (нахо­дя­щем­ся в «0») через три нажа­тые кноп­ки. В резуль­та­те кла­ви­а­тур­ный кон­трол­лер счи­ты­ва­ет левую верх­нюю кноп­ку, как «нажа­тую», вне зави­си­мо­сти от того, нажа­та она на самом деле или нет. Опи­сан­ная ситу­а­ция назы­ва­ет­ся фан­том­ным нажа­ти­ем (ghosting), пото­му что неко­то­рые ком­би­на­ции одно­вре­мен­но нажа­тых кно­пок вызы­ва­ют фан­том­ное сра­ба­ты­ва­ние дру­гих кно­пок (ghost keypresses), хотя физи­че­ски эти дру­гие кноп­ки и не нажаты.

Мож­но пой­мать момент воз­ник­но­ве­ния фан­том­но­го нажа­тия и забло­ки­ро­вать его. Обыч­ный чело­век не в состо­я­нии одно­вре­мен­но нажать или отпу­стить две кла­ви­ши с иде­аль­ной точ­но­стью. Поэто­му, ска­ни­руя мат­ри­цу доста­точ­но быст­ро, мы можем пред­по­ло­жить, что меж­ду дву­мя про­хо­да­ми по мат­ри­це изме­нить своё состо­я­ние может не боль­ше одной кноп­ки. В таком слу­чае, кон­трол­лер при­ни­ма­ет оди­ноч­ные нажа­тия и сле­дит за воз­ник­но­ве­ни­ем ситу­а­ций, когда меж­ду про­хо­да­ми мат­ри­цы ока­зы­ва­ют­ся нажа­ты­ми две кноп­ки или более. Учи­ты­вая, что ска­ни­ро­ва­ние мат­ри­цы про­ис­хо­дит со ско­ро­стью, при кото­рой штат­ное воз­ник­но­ве­ние таких ситу­а­ций крайне мало­ве­ро­ят­но, мож­но заклю­чить, что одна из толь­ко что нажа­тых кно­пок — при­зрак. Поэто­му кон­трол­лер дол­жен про­игно­ри­ро­вать все эти нажа­тия. Кро­ме того, без­опас­нее сра­зу не сооб­щать ком­пью­те­ру об изме­не­ни­ях ста­ту­са кла­ви­а­ту­ры — сна­ча­ла име­ет смысл подо­ждать, пока все эти сра­ба­ты­ва­ния не пропадут.

Есть и дру­гой под­ход. Мож­но выявить ситу­а­цию, когда сра­ба­ты­ва­ет «тре­тья» кноп­ка, и забло­ки­ро­вать как это нажа­тие, так и все после­ду­ю­щие. Бло­ки­ров­ку не сни­мать до тех пор, пока фан­том­ное сра­ба­ты­ва­ние не про­па­дёт, и ситу­а­ция опять не ста­нет нор­маль­ной. Для реа­ли­за­ции это­го под­хо­да про­грам­ма долж­на пом­нить, какие имен­но кноп­ки сей­час нажа­ты (а обыч­но она это пом­нит и так), что­бы откло­нять после­ду­ю­щие сра­ба­ты­ва­ния кно­пок, в стро­ках и в столб­цах кото­рых уже зафик­си­ро­ва­ны одно­вре­мен­ные нажа­тия. Если напи­сать про­грам­му с умом, то бло­ки­ро­вать­ся будут толь­ко про­блем­ные сра­ба­ты­ва­ния, а все после­ду­ю­щие будут при­ни­мать­ся как обыч­но — кро­ме тех, что сно­ва нару­шат пра­ви­ла. Раз кон­трол­лер отвер­га­ет нажа­тие каж­дой кноп­ки, уже име­ю­щей одно­вре­мен­ные сра­ба­ты­ва­ния в сво­ей стро­ке и столб­це, то выхо­дит, что в зави­си­мо­сти от ста­ту­са одних кно­пок, дру­гие могут не реги­стри­ро­вать­ся вооб­ще. Эта ситу­а­ция широ­ко извест­на как бло­ки­ро­ва­ние (jamming). То есть кноп­ки, кото­рые пре­пят­ству­ют одно­вре­мен­ным сра­ба­ты­ва­ни­ям дру­гих кно­пок, полу­ча­ет­ся, «бло­ки­ру­ют» часть клавиатуры.

С точ­ки зре­ния поль­зо­ва­те­ля, мож­но одно­вре­мен­но нажать все кноп­ки из одно­го столб­ца (не нажи­мая кно­пок из дру­го­го), но одно­вре­мен­но нажать все кноп­ки из одной стро­ки мож­но толь­ко в том слу­чае, если в столб­це у каж­дой из этих кно­пок зафик­си­ро­ва­но не более одно­го сра­ба­ты­ва­ния. То же самое отно­сит­ся и к нажа­тию кно­пок из одно­го столб­ца — допол­ни­тель­ные сра­ба­ты­ва­ния фик­си­ру­ют­ся толь­ко в том слу­чае, если кноп­ки нахо­дят­ся в стро­ках, кото­рые «не заняты».

Люди часто пута­ют «фан­том­ное сра­ба­ты­ва­ние» и «бло­ки­ро­ва­ние сра­ба­ты­ва­ния» («ghosting» и «jamming»)

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

Реша­ет­ся подоб­ное пове­де­ние раз­лич­ны­ми хит­ро­стя­ми в обла­сти раз­вод­ки: наи­бо­лее попу­ляр­ные соче­та­ния раз­ме­ща­ют­ся на раз­ных лини­ях, функ­ци­о­наль­ным кла­ви­шам, кото­рые часто явля­ют­ся эле­мен­та­ми хот­ке­ев, назна­ча­ют­ся отдель­ные линии. Раз­вод­ка оста­ет­ся доста­точ­но про­стой, но в недо­ро­гих кла­ви­а­ту­рах ред­ко встре­ча­ет­ся 5+KRO — обыч­но дело огра­ни­чи­ва­ет­ся 3–4 одно­вре­мен­но зажа­ты­ми клавишами. 

Сей­час эта дешё­вая систе­ма почти пол­но­стью вытес­не­на более слож­ной, «откры­той» мат­ри­цей, одна­ко, экзем­пля­ры до сих пор встречаются.

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

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

Но мик­ро­кон­трол­лер рабо­та­ет с такой ско­ро­стью, что успе­ва­ет посчи­тать эти всплес­ки как устой­чи­вые состо­я­ния. Решить эту про­бле­му мож­но аппа­рат­но, с помо­щью RS триг­ге­ра, так и про­грамм­но — вне­ся неболь­шую задерж­ку перед сле­ду­ю­щим опро­сом кноп­ки. Задерж­ка под­би­ра­ет­ся такой, что­бы дре­безг успел пре­кра­тить­ся к ее окончанию.

Про PS/2 или что было до USB

Самым рас­про­стра­нен­ным разъ­емом для под­клю­че­ния мыши и кла­ви­а­ту­ры до USB был PS/2. Впер­вые он появил­ся в 1987 году на ком­пью­те­рах IBM PS/2. Ско­рость пере­да­чи дан­ных — от 80 до 300 Кб/с и зави­сит от про­из­во­ди­тель­но­сти под­клю­чен­но­го устрой­ства и про­грамм­но­го драйвера.

Сире­не­вый — кла­ви­а­ту­ра, зелё­ный — мышь

Из шести кон­так­тов в разъ­ёме исполь­зу­ет­ся четы­ре: так­то­вые импуль­сы, дан­ные, пита­ние, общий.

  • Pin 4 — Пита­ние, +5 В. Исполь­зу­ет­ся для пода­чи пита­ния на под­клю­ча­е­мое устройство.
  • Pin 3 — Земля/Корпус. Общий вывод для питания.
  • Pin 5 — CLK — син­хро­ни­за­ция (Clock). Вклю­ча­ет­ся при пере­да­че дан­ных мышью.
  • Pin 1 — Data, пере­да­ва­е­мые данные.

В насто­я­щее вре­мя подав­ля­ю­щее боль­шин­ство изго­тав­ли­ва­е­мых ком­пью­тер­ных мышей и кла­ви­а­тур име­ют разъ­ем USB, совре­мен­ные мате­рин­ские пла­ты не име­ют разъ­ёма PS/2 или име­ют толь­ко один разъ­ём, хоть ещё и мож­но встре­тить мате­рин­ские пла­ты с этим разъ­емом, это ско­рее уже ред­кость. Совре­мен­ные ноут­бу­ки и ультра­бу­ки вовсе не име­ют внеш­них разъ­емов PS/2. Так­же у PS/2 наблю­да­ет­ся ряд недо­стат­ков таких как про­бле­мы с Plug’n’Play и неудоб­ство само­го разъема.

Сами устрой­ства вво­да гене­ри­ро­ва­ли пре­ры­ва­ние и отправ­ля­ли инфор­ма­цию о нажа­тых кноп­ках или пере­ме­ще­нии кур­со­ра. И тут хоть сту­чи по кла­ви­а­ту­ре пал­кой, если всё раз­ве­де­но гра­мот­но, и rollover не упи­ра­ет­ся в аппа­рат­ные воз­мож­но­сти кла­ви­а­ту­ры — кла­ви­а­ту­ра отпра­вит всё, что про­чи­та­ет контроллер.

NKRO на USB

И так мы разо­бра­лись, что PS/2 разъ­ем прак­ти­че­ски вышел из упо­треб­ле­ния, давай­те посмот­рим как обсто­ят дела с попу­ляр­ным USB.

Для рабо­ты кла­ви­а­тур через USB до загруз­ки систе­мы (BIOS / UEFI) исполь­зу­ет­ся стан­дарт­ный HID-драй­вер (human interface device), кото­рый был раз­ра­бо­тан для мак­си­маль­но широ­кой под­держ­ки кла­ви­а­тур и USB-хостов. Класс USB HID опи­сы­ва­ет устрой­ства таким обра­зом, что­бы стан­дарт­ная реа­ли­за­ция USB-хоста и USB-устрой­ства мог­ли вза­и­мо­дей­ство­вать без уста­нов­ки спе­ци­аль­ных драйверов.

Обыч­ная кла­ви­а­ту­ра (с под­держ­кой USB HID) исполь­зу­ет выход­ной (исхо­дя­щий от USB-хоста) поток дан­ных (endpoint USB-сте­ка) для полу­че­ния инфор­ма­ции о состо­я­нии инди­ка­то­ров (Num / Caps / Scroll Lock), и вход­ной поток (исхо­дя­щий от кла­ви­а­ту­ры, «вхо­дя­щий» для USB-хоста) для отправ­ки инфор­ма­ции о нажа­тых клавишах.

Если сле­до­вать наи­бо­лее стро­гой спе­ци­фи­ка­ции USB HID v1.11, кото­рая под­дер­жи­ва­ет режим USB Boot (и поз­во­ля­ет исполь­зо­вать USB-кла­ви­а­ту­ру для вхо­да в BIOS и рабо­ты в нём), то кла­ви­а­ту­ра будет отправ­лять пре­ры­ва­ния на CPU каж­дый раз, как USB-хост будет опра­ши­вать её, вне зави­си­мо­сти от того, изме­ни­лось её состо­я­ние или нет. Таким обра­зом «эму­ли­ру­ет­ся» рабо­та PS/2 кла­ви­а­тур мини­маль­ны­ми издержками.

В дан­ном слу­чае кла­ви­а­ту­ра рабо­та­ет по стан­дар­ту USB 1.1 (ино­гда 2.0) Low-speed, а часто­та опро­са пор­та состав­ля­ет 100 Гц. В дан­ном режи­ме мак­си­маль­ная дли­на паке­та на USB рав­на 8 бай­там, а отправ­ля­ют­ся они раз в 10 мс. Один из бай­тов заре­зер­ви­ро­ван, так что на рабо­ту кла­ви­а­ту­ры оста­ёт­ся 7 байт, т.е. коли­че­ство доста­точ­ное, что­бы зако­ди­ро­вать нажа­тие любой кла­ви­ши-моди­фи­ка­то­ра и еще шести других.

Полу­чит­ся, кто кла­ви­а­ту­ра рабо­та­ет в режи­ме 6‑KRO, и он явля­ет­ся стан­дарт­ным для боль­шин­ства USB-кла­ви­а­тур. Сде­лать мень­ше — мож­но, боль­ше — толь­ко с нару­ше­ни­ем спе­ци­фи­ка­ции USB HID. Уже после загруз­ки систе­ма может уве­ли­чить часто­ту опро­са USB-пор­та, загру­зить драй­вер, кото­рый поз­во­лит рабо­тать с муль­ти­ме­дий­ны­ми кла­ви­ша­ми и макросам.

Обхо­ды огра­ни­че­ний USB HID, соб­ствен­но, встре­ча­ют­ся двух видов. В пер­вом слу­чае кла­ви­а­ту­ра обна­ру­жи­ва­ет­ся фир­мен­ным ПО, пере­во­дит­ся в какой-нибудь спе­ци­аль­ный режим и отправ­ля­ет дан­ные с кон­трол­ле­ра напря­мую в драй­вер, а тот уже обща­ет­ся с систе­мой. Минус тако­го реше­ния — уве­ли­чи­ва­ет­ся т.н. input lag: задерж­ка ввода.

Вто­рое реше­ние под­ку­па­ет сво­ей про­сто­той и бес­хит­рост­но­стью, но по сути явля­ет­ся костылём:

Кла­ви­а­ту­ра про­сто пред­став­ля­ет­ся в систе­ме несколь­ки­ми HID-устрой­ства­ми, каж­дое из кото­рых име­ет свои 6KRO. Таким мето­дом поль­зу­ют­ся попу­ляр­ные про­из­во­ди­те­ли пери­фе­рии такие как Logitech, A4tech, Cougar и SteelSeries.

Кардинальное решение матричных проблем

Если вы еще раз взгля­не­те на кар­тин­ку про фан­том­ные нажа­тия, то смо­же­те заме­тить, что во всём вино­ва­та пра­вая ниж­няя кнопка.

А ведь эта кноп­ка — един­ствен­ная, через кото­рую ток в дан­ной ситу­а­ции течёт «вверх». Так что, если мы не хотим, что­бы теку­щие «вверх» токи меша­ли нам нор­маль­но счи­ты­вать мат­ри­цу, то давай­те вве­дем дио­ды, что­бы ток мог идти по столб­цам стро­го свер­ху вниз, вте­кая в выхо­ды микроконтроллера.

К сожа­ле­нию, сэко­но­мить тут не полу­чит­ся — при­дёт­ся ста­вить по дио­ду на каж­дую кноп­ку. Если же гово­рить о поляр­но­сти, то вы уже долж­ны были разо­брать­ся, что в дан­ном кон­крет­ном слу­чае дио­ды долж­ны про­пус­кать ток «свер­ху вниз», то есть их като­ды («кон­чи­ки стре­лок») долж­ны смот­реть на выхо­ды мик­ро­кон­трол­ле­ра (столб­цы), тогда как ано­ды долж­ны быть обра­ще­ны ко вхо­дам (стро­кам).

Ито­го­вая матрица

Не име­ет зна­че­ния, с какой сто­ро­ны кноп­ки рас­по­ла­гать диод; глав­ное — соблю­сти вер­ную поляр­ность. Про­сто запом­ни­те, что в дан­ном слу­чае ток все­гда будет течь от вхо­дов к выхо­дам. К сло­ву, если вхо­ды под­тя­ну­ты к пита­нию, а выхо­ды — в режи­ме ОС, то так про­ис­хо­дить будет всегда.

При дан­ном под­хо­де полу­ча­ет­ся, что ток все­гда будет течь «впра­во вниз», и это исклю­ча­ет появ­ле­ние замкну­тых токо­вых кон­ту­ров при одно­вре­мен­ном нажа­тии несколь­ких кно­пок. Кро­ме того, эта кон­струк­ция — един­ствен­ная, кото­рая может обес­пе­чить кла­ви­а­ту­ре пол­ный NKRO. Вдо­ба­вок, нелиш­ним будет упо­мя­нуть (хотя это и кажет­ся оче­вид­ным), что про­бле­ма отсут­ствия у выхо­дов мик­ро­кон­трол­ле­ра режи­ма ОС реша­ет­ся теперь авто­ма­ти­че­ски. Дио­ды, уста­нов­лен­ные после­до­ва­тель­но с каж­дой кноп­кой, избав­ля­ют выхо­ды от замыкания.

Суще­ству­ют моды про­де­лан­ные энту­зи­а­ста­ми по уста­нов­ке дио­дов в меха­ни­че­ские клавиатуры:

Итоги

Полу­ча­ет­ся все про­из­во­ди­те­ли выбра­ли исполь­зо­вать хит­рость, что соб­ствен­но не созда­ет поль­зо­ва­те­лю осо­бых про­блем и он полу­ча­ет вполне рабо­чий NKRO по USB. Но имей­те в виду, что NKRO мат­ри­цы и NKRO кла­ви­а­ту­ры — это две боль­шие разницы.

Про­бле­му мат­ри­цы пол­но­стью реша­ют дио­ды вклю­чен­ные после­до­ва­тель­но с каж­дой кноп­кой. Тогда мож­но обес­пе­чить ска­ни­ро­ва­ние любых ком­би­на­ций. Что­бы не иметь про­блем с NKRO жела­тель­но быть обла­да­те­лем каче­ствен­ной меха­ни­че­ской клавиатуры.

Лите­ра­ту­ра:
http://blog.komar.be/how-to-make-a-keyboard-the-matrix/
https://deskthority.net/viewtopic.php?f=7&t=6050&start=
https://geekhack.org/index.php?topic=20898.0
https://habr.com/ru/company/ulmart/blog/384797/
https://fantech.com.ua/articles/noob-vs-pro-4-fantomnye-nazhatiya-nkro-i-anti-ghosting/
https://ru.computersm.com/simple-questions-what-is-nkro-technology#menu‑1
https://geekboards.ru/page/termin
https://habr.com/ru/post/394585/
https://www.digitalcitizen.life/what-is-nkro-6kro-keyboards/
http://easyelectronics.ru/matrichnaya-klaviatura.html