Сообщение от
ILoveSpeccy
* если одновременно нажато 2 или более кнопки, каким образом это проще распознать?
Судя по описаниям контроллеров клавиатур (я имею ввиду встроенных в клавиатуры),
они допускают обработку не более 6 одновременно нажатых клавиш.
Поэтому в памяти внешнего контроллера организуется буфер на 6 скан-кодов.
Каждая нажатая клавиша вызывает выдачу в интерфейс своего скан-кода (некоторые больше одного).
Даже если нажато одновременно несколько клавиш, их скан-коды будут выданы в линию один за другим,
в порядке опроса матрицы клавиатуры встроенным контроллером.
Принятые скан-коды помещаются в буфер внешнего контроллера.
При отпускании клавиши, в начале выдается служебный байт (0xF0) - признак отпускания, затем сам скан-код этой клавиши.
При этом из буфера удаляется код отпущенной клавиши.
Сообщение от
ILoveSpeccy
* что делать с автоповтором, который в РС-клавиатуре? Как он работает? Просто передает несколько раз код нажатия клавиши и только при отпускании передает код, что кнопка отпущена?
При удержании клавиши начинается цикл автоповтора, при котором в линию передается один и тот же код нажатой клавиши.
Принятый код надо просто сравнить с тем что уже лежит в буфере, и при совпадении просто игнорировать.
Есть правда еще один вариант и лично я им пользуюсь.
Надо переключить клавиатуру в режим scan code 3, при котором каждой нажатой клавише соответсвует один уникальный скан-код, а также установить режим работы Make/Break запрещающий автоповтор кода:
Код:
ldi data,0xf0 ;Select Alt_Scan
rcall trans_ack ;передать
ldi data,0x03 ;Alt_Scan = 3
rcall trans_ack ;передать
;
ldi data,0xf8 ;Select All Make/Break
rcall trans_ack ;передать