Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 может не спасти
мне пришлось цикл делать, чтобы процессор затормозить
Код

    mov ecx, 0100000h
@@:
    dec ecx
    jnz @B

Автор: Dude03 30.3.2007, 07:43
Цитата(MAKCim @  29.3.2007,  23:39 Найти цитируемый пост)

mov ecx, 0100000h
@@:
    dec ecx
    jnz @B


И меньше, и быстрее smile :
Код

       mov ecx, 0100000h
@@:
      loop @B

Автор: MAKCim 30.3.2007, 12:38
Цитата(Dude03 @  30.3.2007,  07:43 Найти цитируемый пост)
И меньше, и быстрее

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,
                ;а он перешлёт его в клавиатуру.

Всё вроде правильно, но это работает не на всех клавиатурах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)