Сделай Сам Свою Работу на 5

Вывод шестнадцатеричных кодов клавиатуры





; напрямую 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 Все материалы защищены законодательством РФ.