Вывод шестнадцатеричных кодов клавиатуры
; напрямую ascii-код вывести нельзя, так как на экране появится символ, соответствующий ему
; поэтому этот код надо преобразовать
; в данном случае в 16-ный
; преобразуется делением исходного числа, хранимого в al, возвращаемого в al 6-ой функцией 21-го прерывания
; для декодирования строка символов 16-го кода
; после деления смещение по этой строке определяется
; старшей и младшей частью деления
_showsym macro symb ; макрос для вывода символа
mov ah, 2
mov dl, symb
int 21h
endm
_showmes macro mes ; макрос для вывода строки символов
mov ah, 9
lea dx, mes
int 21h
endm
d_seg segment
decode_string db '0123456789ABCDEF' ; строка для преобразования 10-ного кода в 16-чный
mes_press db 'Press any key. For exit press ESC.'
db 10, 13, 'Key ASCII', 10, 13, '$'
ent db 10,13,'$' ; перевод строки
space db ' ', '$' ; пробел
div_rem db 0 ; остаток от деления (для преобразования кодов)
d_seg ends
c_seg segment
assume cs: c_seg, ds: d_seg
start:
mov ax, d_seg
mov ds, ax
input_mes:
_showmes mes_press ; начальное сообщение
input:
mov dl, 0ffh ; на ввод символа
mov ah, 6 ; функция ввода/вывода
int 21h ; прерывание
jz input ; если флаг ZF установлен, то клавиша не была нажата, снова переходим к
нажатию
cmp al, 0 ; если al=0, то была нажата функциональная клавиша (f1-f12) =>
je input ; => снова переходим к нажатию
cmp al, 27 ; нажат esc =>
je exit ; => завершаем программу
decode:
mov si, 0
push ax ; сохраняем ах в стеке
_showsym al ; в al находится символ, поэтому показываем его
_showmes space ; пробел
pop ax ; восстанавливаем ах из стека
mov ah, 0 ; обнуляем ah
mov bh, 16 ; заносим в bh делитель, т.е. основание 16-й системы
div bh ; делим ах (в нем сейчас код нажатой клавиши)
mov div_rem, ah ; целая часть результата в al (это старшая часть 16-го числа), остаток
в ah (младшая часть), сохраняем его
mov si, al ; чтобы использовать al как смещение таблицы, заносим в si
mov al, decode_string [si] ; смещаем таблицу
_showsym al ; выводим код, (старшую часть числа)
mov si,0
mov si,div_rem ;заносим остаток в al
mov al,decode_string [si];декодируем
_showsym al ; выводим на экран младшую часть
_showmes ent ; переходим на следующую строку
jmp input ; и снова переходим к ожиданию нажатия
exit:
mov ah, 4ch ; конец работы ДОСа
int 21h ; выход
c_seg ends
end start
Результат работы программы:
Блок-схема алгоритма:
Вывод:данное задание позволяет ознакомиться с процессом получения и перевода скэн-кода в 16-ричную систему.
Контрольные вопросы
1. Каким образом осуществляют ввод данных с клавиатуры в IBM РС и УЭВМ?
Микропроцессор воспринимает каждое нажатие клавиши и выдает скан-код в порт микросхемы программируемого периферийного интерфейса (8255, 8042 или их аналоги).
Нажатие клавиши возбуждает прерывание, которое передает управление обработчику прерываний от клавиатуры. Когда клавиатура выдает скан-код, то вызывается прерывание клавиатуры INT 9h, ЦП анализирует полученный микросхемой 8255 скан-код. Введенный скан-код помещается в буфер клавиатуры, расположенный в ОЗУ (хранит до 15 символов).
Перед тем, как передать код сканирования микросхема 8048 выдает логическую "1" на своей линии КВ DATA в течение 0.2 мс, затем через 0.1 мс выдается каждый бит 8-битовой последовательности.
ASCII символ и код сканирования для одного нажатия клавиши считываются из буфера прерыванием INT 16h, которое заставляет BIOS выполнить подпрограмму ввода/ вывода с клавиатуры. Программа ввода с клавиатуры читает буфер клавиатуры и помещает коды ASCII и коды сканирования в регистр ЦП (8088). Затем подпрограмма считывает статус данных, чтобы определить, не нажаты ли специальные клавиши (Shift, Ctrl, Alt) и посылает АSCII код символа на экран (через прерывание INT 10h в видеобуфер).
2. Каким образом осуществляют вывод на светодиодные индикаторы?
Вывод на светодиодные индикаторы осуществляется путем записи в порт 60h команды 0edh, а затем байта, где первые 3 бита отвечали за индикацию нажатия клавиш: NumLock, CapsLock, ScrollLock.
3. Как узнать, что нажата какая-либо комбинация клавиш?
Нужно вызвать функцию 0h прерывание int 16h. Если в al возвратился 0, то нажата комбинация клавиш или в ah-расширенный ASCII-код . Если функция символьного в/в DOS возвращает 00h, нужно вызвать ее еще раз для получения расширенного кода ASCII.
4. Что такое порт ввода/вывода?
Порт ввода/вывода представляет собой интерфейс для обмена между устройствами ЭВМ.
5. Что собой представляют аппаратное и программное прерывания клавиатуры?
Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h.
Клавиатурное прерывание обслуживается модулями BIOS. Драйверы клавиатуры и резидентные программы могут организовывать дополнительную обработку прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания. Стандартный обработчик клавиатурного прерывания, входящий в состав BIOS, выполняет следующие действия:
• читает из порта 60h скан-код нажатой клавиши;
• записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;
• устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;
• возвращает этот бит в исходное состояние;
• записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.
Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно отслеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock.
Можно программно вызывать прерывания клавиатуры. Программное обеспечение доступно аппаратным средствам клавиатуры через BIOS. Прерывание int 16h позволяет читать символ, удалять символ из буфера клавиатуры, изменять статус клавиатуры. Фактически, любой доступ к клавиатуре осуществляется через int 16h.
Можно написать свой обработчик клавиатуры, заменить старый на новый. Это осуществляется с помощью функций 35h, 25h.
Контрольные вопросы.
1. Какие компоненты включает в себя клавиатура IBM PC/AT?
Клавиатура IBM PC/AT включает в себя матрицу быстродействующих кнопочных контактов, микропроцессор (контроллер) (Intel 8048, 8049 или их аналоги) со встроенным ПЗУ (2К и более) и электронную схему управления.
2. Посредством чего клавиатура осуществляет обмен данными с компьютером?
Клавиатура содержит внутренний 16-байтовый буфер, через который она осуществляет обмен данными с компьютером.
3. Какие функции выполняють порты 60h и 61h для работы с клавиатурой?
Порт 60h при чтении содержит скан-код последней нажатой клавиши. Порт 61h управляет не только клавиатурой, но и другими устройствами компьютера, например, работой встроенного динамика. Этот порт доступен как для чтения, так и для записи. Если в старший бит порта 61h записать значение 1, клавиатура будет заблокирована, если 0 - разблокирована.
4. Какой сигнал подает контроллер процессору при необходимости чтения скан-кода?
Контроллер сообщает процессору о необходимости прочесть скан-код через аппаратное прерывание IRQ1.
5. Как связаны между собой SCAN-код и ASCII-код?
SCAN-код однозначно связан с распайкой клавиатурной матрицы и не зависит напрямую от обозначений, нанесенных на поверхность клавиш. ASCII-код не зависит однозначно от скан-кода, т.к. одной и той же клавише могут соответствовать несколько значений ASCII-кода. Это зависит от состояния других клавиш. Например, клавиша с обозначением '1' используется еще и для ввода символа '!' (если она нажата вместе с клавишей SHIFT).
6. Сколько уровней представления и обработки сигналов от клавиатуры существуют?
Различают три уровня представленя и обработки сигналов от клавиатуры: физический, логический и функциональный.
7. Какой формат имеет 11битная кодовая посылка данных? Опишите последовательность битов.
Посылка имеет стартстопный формат, каждый бит данных сопровождается синхросигналом по линии CLK. В кодовой посылке 1 бит является стартовым, затем следует 8 битов данных, которые замыкают биты паритета (нечет) и стоповый.
Тестовые вопросы.
1. Проверить буфер клавиатуры на наличие в нем символов можно при помощи функции:
а) ah=01h int 16h
б) ah=02h int 21h
в) ah=03h int 16h
г) ah=6h int 10h
2. Для управления светодиодами на лицевой панели клавиатуры нужно:
а) записать в порт 61h команду 0Edh
б) записать в порт 60h команду 0F3h
в) записать в порт 60h команду 0F3h, а затем управляющий байт
г) записать в порт 60h команду 0Edh, а затем управляющий байт
3. Для перевода компьютера в режим автоповтора нужно:
а) Несколько раз нажать и отжать клавишу, которую нужно повторитьб) Нажать комбинацию клавиш Ctrl-NumLockв) Задать этот режим программног) Нажать клавишу и не отпускать ее 4. Порт 60h при чтении содержит:
а) бит блокировки/разблокировки клавиатуры
б) скэн-код последней нажатой клавиши
в) биты для управления светодиодами
г) биты для установки режима автоповтора
5. Клавиши фиксации регистров относятся к группе:
а) функциональных
б) вспомогательных
в) служебных
г) алфавитно-цифровых
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|