Да нет! Все норимально! Просто Сергей, слету, не придумал алгоритм. Я ему подскажу. Это алгоритм для одной кнопки, поэтому будем иметь ввиду, что разговор идет об одном и том же символе.
И так, после нажатия символьной клавиши, входим в прерывание и выдаем символ и по таймеру 50гц. запускаем счетчик на 2-3сек. При обработке очередного прерывания таймера, проверяем не появился ли ноль (клавиша отпущена?) и уменьшаем счетчик. Если счетчик отсчитал 2-3 сек и клавиша не отпущена, то выдается снова символ. Если счетчик не досчитал, а появился ноль, то сбрасываем счетчик и заканчиваем процедуру вывода символа.
Продолжим: счетчик отсчитал 2-3 сек (через вычитание - так проще программно обрабатывать) и клавиша не отжата - выдаем следующий символ, и запускаем новый счетчик по таймеру 0,5 сек (понятно, что это программные счетчики). И вот мы каждые 0,5 сек теперь проверяем отпущена ли клавиша (не забываем перезапустить счетчик на следующие 0,5сек!), и если нет, то снова выводим символ. Если при очередном прерывании (0,5 сек) таймера окажется, что клавиша отжата (в порту - ноль), то сбрасываем все счетчики, ячейки и т.д., и ждем следующего нажатия новой клавиши, и - прерывания от PS/2. Примерно, так!
Конечно плохо, что нет аппаратного таймера (я предлагал!), хотя бы 8-разрядного. Если брать (округленно) 20 мл.сек х 256=5сек! Он очень упростил бы весь алгоритм драйвера - достаточно было бы запихивать в него константу и ждать прерывание. А так придется использовать прерывание 50гц (20 млсек). и крутить программные счетчики (3-4!). Придется помудохаться и с манипуляцией счетчиками!
P.S. Наверное раз 20 переделывал этот текст, чтобы было по-понятней. Не знаю - удалось? Если что-то не понятно - спрашивайте.





Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
