Ну на самом деле сложности в преобразовании сканкодов тоже нет.
Идея такова:
1. Составляете таблицу соответсвтия образа клавиши компьютера и сканкода. Образ представляет собой закодированную комбинацию из номера линии сканирования и номера бита который сбрасывается или устананавливается в зависимости от того, как реализовано сканирование. Так например для клавиши "Z" спековского контроллера при матрицы 8x5 будет соотвествовать коду 0x1D на линии сканирования A8. Т.е. при упаковки в образ получится код 0x02, где биты
2...0 - это номер бита(для нашего случая 1) +1
5...3 - это номер сканирования(для нашего случая 0)
6 и 7 служебные, в основном для реализации совместного нажатия, опятьже в спеке 6 бит будет отвечать за нажатие совместно с SymbShift, 7 совместно с CapsShift. Еще есть комбинация - оба бита установлены - это в основном реализация клавиш знаков типа запятых, т.е. когда надо нажать несколько клавиш.
2. Анализ пришедшего сканкода и соотвествующего его табличного значения и заполнение соотвествующеми масками образов сканирующих линий. Для нашего случая 8x5 - есть 8 байтов соответсвующие 8-ми линиям сканирования, т.е. мы запишем код 0x1D в 1 байт линии сканирования.
3. Анализ линий сканирования и установка(сброс) необходимого бита при активности сканирующей линии. После этого выдача байта на шину данных(линию отвечающую за прием данных от клавы)
4. Как известно клавы наших компьютеров несколько отличаются от PC хотябы по русским буквам. Для удобства нужно при нажатом регистре Рус/Лат. дополнительно подменять коды клавиш, чтобы комп не заметил разницы. А именно при нажатии на PC клаве русской "С" не вылезло типа клавиши "Ц".
Надеюсь принцип вам понятен. Между прочим по такому принципу(в общем случаее, не затрагивая конкретную реализацию) сделал Caro свою обработку клавы. Очень удобно - я тоже по такому принципу сделал (сперва идею подсмотрев у Камиля) обработку в своем Спековском клоне(ZXM-777 256кб DRAM).





Ответить с цитированием