close

Вход

Забыли?

вход по аккаунту

?

Лаба5

код для вставкиСкачать
Министерство образования и науки, молодежи и спорта Украины
Севастопольский национальный технический университет
Кафедра Кибернетики и Вычислительной техники
Отчет
по лабораторной работе №4
"Клавиатура. Скан - коды"
Выполнил: ст. гр. М-42д
Чижевский В.В.
Проверил: Иванченко О.В.
Севастополь
2013
Тема:Клавиатура. Скан-коды.
Цель:Научиться производить обращение к клавиатуре через порты ввода/вывода.
Постановка задачи:
Написать программу, позволяющую определить расширенные ASCII- коды, которые доступны только через функции 10h- 12h INT 16h.
Ход работы:
Клавиатура выполнена, как правило, в виде отдельного устройства, подключаемого к компьютеру тонким кабелем. Малогабаритные блокнотные компьютеры содержат встроенную клавиатуру. Номер клавиши, посылаемый клавиатурным процессором, однозначно зависит от схемы клавиатурной матрицы, но не от обозначений, нанесенных на поверхность клавиш. Этот номер называется скан-кодом (Scan Code). Слово scan ("сканирование"), подчеркивает тот факт, что клавиатурный компьютер сканирует клавиатуру для поиска нажатой клавиши.
Обычно программе нужен не порядковый номер нажатой клавиши, а код, соответствующий обозначению на этой клавише (код ASCII). Код ASCII не связан напрямую со скан-кодом, так как одной и той же клавише могут соответствовать несколько значений кода ASCII в зависимости от состояния других клавиш. Например, клавиша с обозначением "1" используется еще и для ввода символа "!" (если она была нажата вместе с клавишей <Shift>). Поэтому все преобразования скан-кода в код ASCII выполняются программно. Как правило, в операционной системе MS-DOS эти преобразования выполняют модули BIOS. Для использования символов кириллицы эти модули расширяются клавиатурными драйверами, как входящими в состав локализованных версий MS-DOS, так и созданными в виде отдельных программ.
Программно вызываемое прерывание BIOS INT 16h представляет интерфейс прикладного уровня для клавиатуры. Его основное назначение- извлечение слов из клавиатурного буфера. Функция задается в регистре АН при вызове:
* AH=00h-чтение (с ожиданием готовности) и выборка слова из буфера;
* AH=01h-проверка готовности, чтение без выбора;
* AH=02h-чтение состояния флагов;
* AH=03h-установка задержки и скорости автоповтора;
* AH=05h-запись слова из буфера.
Функции с АН=10h, 11h, 12h аналогичны 00h, 01h, 02h, но предназначены специально для 101/102- клавишных клавиатур. Младший байт считанного слова содержит ASCII- символ, старший - скан- код. Символы, полученные нестандартным способом, сопровождаются нулевым скан- кодом.
Функция 00h выполняет чтение кода символа из буфера клавиатуры, если он там есть. Если буфер клавиатуры пуст, программа переводится в состояние ожидания до тех пор, пока не будет нажата какая-нибудь клавиша. Скан-код и код ASCII нажатой клавиши передаются программе. Приведем формат вызова функции: Регистры на входе: AH = 00h Регистры на выходе: AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа;
AH = скан-код или расширенный код ASCII символа, если AL=0
Текст программы:
#include<iostream.h>
#include<conio.h>
#include<dos.h>
#include<stdio.h>
int main (void)
{
union REGS R;
clrscr();
cout<<"Scan and ASCII-codes of pressed key (press ESC to exit):\n";
cout<<"char Scan ASCII\n\n";
for(;;)
{
R.h.ah = 0x10;
int86(0x16, &R, &R);
cout<<R.h.al<<" ";
printf("%05.2x %05.2x ",R.h.ah,R.h.al);
cout<<endl;
if(R.h.ah == 1) break;
}
return 0;
}
Результаты работы программы:
При запуске программы, как видно, она выводит скан-код нажатой клавиши и ASCII-код соответствующего символа. Можно заметить, что два этих кода не имеют особых закономерных связей между собой.
Соответствие всех кодов, как скан, так и ASCII, можно проверить по таблицам (Приложение А) - они совпадают с реальными.
В данном примере показано, что клавише, естественно, с одним и тем же скан-кодом, могут соответствовать различные ASCII-коды, в зависимости от нажатой клавиши <Shift> или <CapsLock>. Например: клавише <1/!> со скан-кодом 0х02 соответствуют два ASCII-кода: 31 - "1", 21 - "!". Или клавиша "A" (скан-код - 0х1Е): 61 - "а", 41 - "А".
Последние 5 нажатые клавиши в данном примере имеют скан-код, но имеют ASCII, равный 0х00. Это связано с тем, что это специальные клавиши и для них нет соответствующих символов ASCII. Нестандартных клавиш, имеющих нулевой скан-код, найдено не было.
Выводы: В ходе лабораторной работы была разработана программа, позволяющая определить расширенные ASCII- коды, которые доступны через функцию10h прерывания INT 16h.
Приложение А
КлавишаSet#1Set#2Set#3КлавишаSet#1Set#2Set#3
1!021616A1E1C1C2@031E1ES1F1B1B3#042626D2023234$052525F212B2B5%062E2EG2234346^073636H2333337&083D3DJ243B3B8*093E3EK2542429(0A4646L264B4B0 )0B4545; :274C4C- _0C4E4E, "285252= +0D5555' ~29OEOEBackspace0E6666Shift(L)2A1212Tab0F0D0D\ |2B6113Q101515Z2C1A1AW111D1DX2D2222E122424C2E2121R132D2DV2F2A2AT142C2CB303232Y153535N313131U163C3CM323A3AI174343,<334141O184444.>344949P194D4D/?354A4A[{1A5454Shift (R)365959]}1B5B5BAlt (L)381119Enter1C5A5A(Space bar)392929Ctrl(L)1D1411Caps Lock3A5814
КлавишаSet#1Set#2Set#3ПримечаниеEsc017608-F13B0507-F23C060F-F33D0417-F43E0C1F-F53F0327-F6400B2F-F7418337-F8420A3F-F9430147-F1044094F-F11577856101/102F1258075E101/102Scroll Lock467E5F-Sys Rq54--AT-84**Prt Sc37--XT,AT-84*(Keypad)377C7E101/102Num Lock457776-Home[7]476C6C-[8]487575-PgUp[9]497D7D--(Keypad)4A7B84-[4]4B6B6B-[5]4C7373-[6]4D7474-+(Keypad)4EE0-5A7C-End[1]4F6969-[2]507272-PgDn[3]517A72-Ins[0]527070-Del[.]537171-
Документ
Категория
Рефераты
Просмотров
33
Размер файла
65 Кб
Теги
лаба
1/--страниц
Пожаловаться на содержимое документа