Мегаобучалка Главная | О нас | Обратная связь


Работа с буфером клавиатуры



2015-12-07 3317 Обсуждений (0)
Работа с буфером клавиатуры 0.00 из 5.00 0 оценок




Работа с буфером клавиатуры в основном сводится к 2 операциям:

1. Очистка буфера.

2. Проверка символов в буфере.

Буфер клавиатуры имеет объем 32 байта. Буфер может накапливать до 15 нажатий на клавишу, независимо от того, являются ли они однобайтными кодами ASCII или двухбайтными расширенными кодами (последнее нажатие, которое может быть максимально 16-м по счету, зарезервировано для клавиши <Enter>, которая разрешает исполнение введенной с клавиатуры команды для командного процессора COMMAND.COM). Таким образом, буфер должен отвести два байта памяти для каждого нажатия на клавишу. Для однобайтных кодов первый байт содержит код ASCII, а второй - скан-код клавиши. Для расширенных кодов первый байт содержит ASCII 0, а второй номер расширенного кода. Этот код обычно совпадает со скан-кодом клавиши, но не всегда, поскольку некоторые клавиши могут комбинироваться с клавишами сдвига для генерации различных кодов.

Буфер устроен как циклическая очередь, которую называют также буфером FIFO (первый вошел - первый ушел). Как и любой буфер, он занимает непрерывную область адресов памяти. Однако не имеется определенной ячейки памяти, в которой находилось бы всегда начало строки в буфере. Вместо этого два указателя хранят позиции головы и хвоста строки символов, находящейся в буфере в текущий момент. Указатель головы указывает на позицию, занятую первым символом в буфере, а указатель хвоста - на позицию, следующую за последним символом (т.е. на первую свободную). Новые нажатия клавиш запасаются в позициях, следующих за хвостом (в старших адресах памяти) и соответственно обновляется указатель хвоста буфера. После того, как израсходовано все буферное пространство, новые символы продолжают вставляться, начиная с самого начала буферной области; поэтому возможны ситуации, когда голова строки в буфере имеет больший адрес, чем хвост. После того как буфер заполнен, новые вводимые символы игнорируются, при этом прерывание клавиатуры выдает гудок через динамик. В этот момент указатель хвоста указывает на ячейку перед головой в циклической очереди буфера (куда можно занести нажатие <Enter>). В то время как указатель на голову установлен на первый введенный символ, указатель на хвост установлен на позицию за последним введенным символом. Когда оба указателя равны, то буфер пуст. Поэтому чтобы очистить буфер клавиатуры, достаточно установить указатели на одно и тоже значение. Чтобы разрешить ввод 15 символов требуется 16-я пустая позиция, 2 байта которой всегда содержат код возврата каретки (ASCII 13) и скан-код клавиши <Enter>, равный 28. Эта пустая позиция непосредственно предшествует голове строки символов. 32 байта буфера начинаются с адреса 0040:001E. Указатели на голову и хвост расположены по адресам 0040:001A и 0040:001C, соответственно. Хотя под указатели отведено 2 байта, используется только младший байт. Значения указателей меняются от 30 до 60, что соответствует позициям в области данных BIOS. Для очистки буфера надо просто установить значение ячейки 0040:001A равным значению ячейки 0040:001C.

Проверка и установка статусов клавиш-переключателей

Два байта, расположенные в ячейках памяти 0040:0017 и 0040:0018 содержат биты, отражающие статус клавиши сдвига и других клавиш-переключателей следующим образом:

Байт Бит Клавиша Значение, когда бит = 1
0040:0017 Insert Режим включен
  CapsLock Режим включен
  NumLock Режим включен
  ScrollLock Режим включен
  Alt Клавиша нажата
  Ctrl Клавиша нажата
  левый Shift Клавиша нажата
  правый Shift Клавиша нажата
0040:0018 Insert Клавиша нажата
  CapsLock Клавиша нажата
  NumLock Клавиша нажата
  ScrollLock Клавиша нажата
  Ctrl-NumLock Режим включен

Остальные биты не используются.

Прерывание клавиатуры немедленно обновляет эти биты статуса, как только будет нажата одна из клавиш-переключателей, даже если не было считано ни одного символа из буфера клавиатуры.

Проверка и установка статуса клавиш-переключателей возможна с помощью использования механизма прерывания или непосредственно при работе с памятью.

Функция 2H прерывания 16H предоставляет доступ к одному, но только одному из байтов статуса. Это байт по адресу 0040:0017, который содержит больше полезной информации. Байт возвращается в AL.

;---проверка статуса клавиши вставки

MOV AH,2 ;номер функции

INT 16H ;получаем байт статуса

TEST AL,10000000B ;проверяем бит 7

JZ INSERT_OFF ;если 0, то INSERT выключен

В следующем примере устанавливается режим вставки, за счет установки бита 7 байта статуса по адресу 0040:0017 (который адресуется как 0000:0417).

SUB AX,AX ;устанавливаем добавочный сегмент на

MOV ES,AX ;начало памяти

MOV AL,10000000B ;готовим бит 7 к установке

OR ES:[417H],AL ;меняем байт статуса


 

Устройство, работа и организация памяти накопителей на магнитных дисках. Их основные технические характеристики. Работа с физическими и логическими секторами. Главная загрузочная запись (MBR), ее структура. Корректировка таблицы разделов. Основные служебные поля жесткого диска FAT32, с их структура, организация и использование.



2015-12-07 3317 Обсуждений (0)
Работа с буфером клавиатуры 0.00 из 5.00 0 оценок









Обсуждение в статье: Работа с буфером клавиатуры

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (3317)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)