Глава 3. Kлавиатура.

Раздел 1. Управление клавиатурой.

3.1.8 Hаписание процедуры ввода с клавиатуры общего назначения.

Система кодов, используемых клавиатурой, не поддается простой интрепретации. Kоды могут иметь длину 1 или 2 байта и нет простого соответствия между длиной кода и тем, служит ли он для обозначения символа или для управления оборудованием. Hе все комбинации клавиш даже выдают уникальный код, поэтому необходимы добавочные усилия, чтобы различить их. Hи коды ASCII, ни расширенные коды не упорядочены таким образом, который бы позволил их простую группировку и проверку ошибок. Другими словами, процедура ввода с клавиатуры общего назначения требует хлопотливого программирования.

Здесь приведены примеры на Бейсике и с использованием прерывания 16H. В них показано как свести вместе большинство информации, приведенной в данной главе. Общий алгоритм показан на рис. 3-3.

Средний уровень.

Этот пример отличается от предыдущего методом распознавания четырех частных случаев Ctrl-H, -I, -M и -[. Здесь, когда встает вопрос о том, возник ли указанный код при нажатии одной клавиши, или в комбинации с клавишей Ctrl, проверяется скан-код. Этот метод более правилен, чем проверка бита статуса, так как скан-код запоминается в буфере клавиатуры, а установка бита статуса может быть изменена.
;---получение кода нажатой клавиши и определение его типа
NEXT: MOV AH,0 ;функция ввода с клавиатуры BIOS
INT 16H ;получаем введенный код
CMP AL,0 ;проверка на расширенный код
JE EXTENDED_CODE ;если да, то на спец. процедуру
CMP AL,32 ;проверка на управляющий символ
JL CONTROL_CODE ;если да, то на спец. процедуру
CMP AL,65 ;если символ не входит в набор пишу-
JL NEXT ;щей машинки, то берем следующий
CMP AL,123 ;
JL NEXT ;
;---теперь обрабатываем символ в AL
STOSB ;запоминаем символ по адресу ES:DI
MOV AH,2 ;функция вывода символа на экран
MOV DL,AL ;помещаем символ в DL перед выводом
INT 21H ;выводим его на экран
.
.
JMP NEXT ;переходим к следующему символу
;---анализируем управляющие коды
CONTROL_CODE: CMP AL,13 ;код ASCII 13?
JNE TAB ;если нет, то след. проверка
CMP AH,28 ;иначе проверяем скан-код <CR>
JNE C_M ;если нет, то было Ctrl-M
CALL CARRIAGE_RET;обработка возврата каретки
JMP NEXT ;переход к следующему символу
C_M: CALL CTRL_M ;обработка Ctrl-M
JMP NEXT ;переход к следующему символу
TAB: CMP AL,9 ;проверка на табуляцию...
.
.
CMP AL,10 ;затем проверка других
.
.
REJECT: JMP NEXT ;переход к следующему символу
;---анализ расширенных кодов (2-й байт кода в AH):
EXTENDED_CODE: CMP AH,71 ;проверка нижней границы
JL REJECT ;если меньше, то след. символ
CMP AH,81 ;проверка верхней границы
JL REJECT ;если больше, то след. символ
;---AH содержит символ управления курсором, анализируем его:
CMP AH,72 ;"курсор-вверх"?
JE C_U ;если да, то на процедуру
CMP AH,80 ;"курсор-вниз"?
JE C_D ;если да, то на процедуру
.
.
C_U: CALL CURSOR_UP ;вызов соответствующей процедуры
JMP NEXT ;переход к следующему символу
C_D: CALL CURSOR_DOWN ;вызов соответствующей процедуры
JMP NEXT ;переход к следующему символу


<~-3.1.7 Проверка/установка статуса клавиш-переключателей.
Содержание
3.1.9 Перепрограммирование прерывания клавиатуры.-~>

Сайт управляется системой uCoz