| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Клавиатура |
| Автор: ABCD 29.3.2007, 19:51 |
| Здравствуйте уважаемые программисты! Имеется самодельное микропроцессорное устройство. К нему подключена IBM совместимая клавиатура с использованием клавиатурного контроллера i8042. Клавиатура прекрасно передаёт скан-коды в систему, но возникла небольшая проблемка. При исследовании стандартных команд управления клавиатурой (описанных в популярной литературе, популярными авторами) оказалось что из всех команд работает только команда сброса и самотестирования клавиатуры -FFh. Такая интересная команда как EDh – управление светодиодными индикаторами работает только на двух из семи проверенных мной клавиатур разных производителей. Все клавиатуры исправные. Что ли у разных клавиатур разные команды управления? Может кто сталкивался с такой проблемой, помогите пожалуйста разобраться. Подскажите, где найти систему команд управления клавиатурой. С уважением Михаил |
| Автор: Dude03 29.3.2007, 21:50 |
| Проблема в том, что контроллер клавы медленная штука. И чтобы дождатся ответа, надо подождать чуток=). Например так: jmp $+2 jmp $+2 вроде хватало всегда. Может причина и не в этом=) |
| Автор: MAKCim 29.3.2007, 23:39 | ||
| у меня вот была проблема: IRQ1 генерировался по 4 раза на каждое нажатие/отпускание клавиши дело в том, что контроллер клавиатуры медленнее чем ядро процессора работает и пока до него доходил EOI (что дескать обработка прерывания завершилась) он (контроллер) еще 3 раза успевал послать сигнал по IRQ1 даже jmp, который предложил Dude03 может не спасти мне пришлось цикл делать, чтобы процессор затормозить
|
| Автор: Dude03 30.3.2007, 07:43 | ||
И меньше, и быстрее
|
| Автор: MAKCim 30.3.2007, 12:38 |
loop - 4 микрооперации (декодирование за такт не всегда получится даже при наличие свободного декодера) dec, jnz - по 1-ой микрооперации |
| Автор: CALL 30.3.2007, 20:25 |
| Расскажу немного как я пытаюсь программно управлять клавиатурой. Скажем мне необходимо в определённый момент времени Включить один из тёх индикаторов на клавиатуре, например CapsLock Пишу следующую последовательность команд: KBD1: IN AL,61h ;В моём устройстве регистр состояния клавиатуры ;находится по адресу 61h (не как у IBM AT 64h), так проще ;было сделать дешифратор адреса. AND AL,02h ;Проверяем состояние входного буфера если ещё JNZ KBD1 ;не освободился , ждём и проверяем готовность. MOV AL,0EDh ;Если готов к принятию следующей команды OUT 60h,AL ;отправляем её во входной буфер контроллера 8042 KBD2: IN AL,61h ;Проверяю разряд 1, если 0 значит контроллер 8042 AND AL,02h ;заглотил отправленную команду и ели она предназначалась ;клавиатуре, переслал её по назначению и готов к принятию ;следующей команды или байта данных. JNZ KBD2 ;Если ещё не готов, ждём и проверяем готовность. MOV AL,4h ;Если готов к принятию второго байта команды OUT 60h,AL ;отправляем его так же во входной буфер 8042, ;а он перешлёт его в клавиатуру. Всё вроде правильно, но это работает не на всех клавиатурах. |