Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 6
з курсу „ Системне програмування ”
Тема: Управлiння клавiатурою IBM PC .
Львів – 2004
Мета роботи: Вивчення органiзацiї та принципiв роботи клавiатури, оволодiння навичками управлiння клавiатурою за допомогою системних функцiй.
Короткі теоретичні відомості
Процес взаємодiї системи з клавiатурою
_____
| | Адреса ПОП з вектора
|---------------->| ЦП |<--- переривання 09h (комiрки
|Апаратне |_____| 00:24h та 00:26h)
Вiдпускення/ |переривання |
натискання |типу 09h _____|______ Слово прапорiв клавiатури
клавiшi ____|______ Порт | ПОП int 09h| _______________
__|__|__|_ | Контролер | 60h |____________| | Адреса 40h:17h|
|Клавiатура|-->| клавiатури|------>| + |<--------|_______________|
|__________| |___________| Скен-|____________| | | | | | | | |
код | Розряд:
| 7: Ins
| 6: Caps Lock
| Скен + 5: Num Lock
| ASCII 4: Scroll Lock
Кільцевий | 3: Alt
буфер | 2: Ctrl
вводу | 1: Shift Left
____________ | 0: Shift Right
40h:1eh| | |
|___________ | |
Початок --->|Скен |ASCII | |
40h:1Ah | |_____|______| |
| |Скен |ASCII |<-|
| |_____|______|
| | |<------- Кiнець 40h:1Ch
| |____________|
| |____________| 40h:3Ch
| _____________________
|->| Програма користувача|
| int 16h |
|_____________________|
Клавiатура має три основних типи клавiш:
Символьнi (алфавiтно-цифровi): букви вiд А до Z, цифри вiд 0 до 9, символи !,@,#,$,% i т.iн.
Функцiональнi: <Home>, <End>, <Backspace>, стрiлки, <Return>, <Del>, <Ins>, <PgUp>, <PgDn> i програмно-функцiональнi клавiшi.
Управляючi: <Alt>, <Ctrl>, <Shift>, якi працюють в сукупностi з iншими клавiшами.
Роботою клавiатури управляє спецiальна мiкросхема - контролер клавiатури. В його функцiї входить розпiзнавання натиснутої клавiшi та пересилання закрiпленого за нею коду у свiй вихiдний регiстр (порт), як правило, з номером 60h. Код клавiшi, що поступає в порт, називається скен-кодом. При цьому кожнiй клавiшi присвоєнi два скен-коди, якi вiдрiзняються на 80h (менший код пересилається в порт при натисканнi клавiшi, бiльший - при вiдпусканнi).
Програма обробки переривання вiд клавiатури INT 09H окрiм портiв працює ще з двома областями пам'ятi: кiльцевим буфером вводу (адреси вiд 40h:1Eh до 40h:3Dh), куди врештi решт пересилаються ASCII коди натиснутих клавiш, i словом стану (словом прапорiв) клавiатури (адреса 40h:17h, 40h:18h), в якому фiксується стан управляючих клавiш (<Shift>,<Caps Lock>,<Num Lock> i т.iн). Якщо визначено скен-код клавiшi-перемикача (правий Shift, лiвий <Shift>, <Ctrl>, <Alt>, <Scroll Lock>, <Num Lock>, <Caps Lock> i <Insert>), змiнюється вмiст комiрок слова стану клавiатури. В буфер клавiатури при цьому нiчого не пересилається (виключенням є лише клавiша <Insert>).
Завдання на лабораторну роботу
Створити програму, що реалiзує вказаний викладачем варiант завдання. Програму оформити у виглядi .COM файлу.
Запустити створену програму та задокументувати результати її виконання.
Скласти звiт про виконану роботу.
Варіант 9.
Органiзувати ввiд циклiчний посимвольний ввiд з ехо-вiдображенням (функцiя 01h INT 21H) з клавiатури. Забезпечити переключення мiж режимами вводу/вiдображення символьних i функцiональних/управляючих кодiв натисканням певної комбiнацiї клавiш. Перевiрити реакцiю програми на <Ctrl>/C. Забезпечити можливiсть перенаправлення вводу та виводу.
Вміст .asm-файлу
CODE SEGMENT WORD 'CODE'
ORG 100h
ASSUME cs:CODE, ds:CODE, ss:CODE, es:CODE
begin:
Jmp progbody
ControlCMsg
db 10,13,' * Press any key/combination to view its ASCII/EXT code *'
db 10,13,' * press CTRL+C to exit *$'
KeyMsg db 10,13,'Keypressed echo: $'
CodeMsg db 10,13,'ASCII-code: $'
ExtMsg db 10,13,'Extended-code: $'
KeyCode db 0,0,'$'
LineFeed db 10,13,'$'
progbody:
;*********************************************
mov dx,OFFSET ControlCMsg;
mov ah,09
int 21h
cycle:
mov dx,OFFSET KeyMsg;
mov ah,09
int 21h
mov ah,01h
int 21h
cmp al,0
jz ext
mov bh,0 ; pressed key is ASCII
jmp print
ext: mov bh,1 ; pressed key is functional
mov ah,01h
int 21h ; ѕ extended scan-code
print:
mov dl,al ; put symbol to out register
mov bl,al
;************ ?# digit (first)****************
and al,0f0h
shr al,4
cmp al,09h
jg az01
add al,30h
mov KeyCode,al
jmp next01
az01: add al,37h
mov KeyCode,al
next01:
;************ #? digit (second)***************
mov al,bl
and al,00fh
cmp al,9h
jg az02
add al,30h
mov KeyCode+1,al
jmp next02
az02: add al,37h
mov KeyCode+1,al
next02:
;*********************************************
mov dx,OFFSET CodeMsg
cmp bh,1
jz extprn
jmp asciiprn
extprn:
mov dx,OFFSET ExtMsg
asciiprn:
mov ah,09
int 21h
mov dx,OFFSET KeyCode ;;
mov ah,09 ; print string
int 21h ;;
jmp cycle
;*********************************************
mov ah,4Ch
int 21h
CODE ENDS
END begin
Результат виконання програми
* Press any key/combination to view its ASCII/EXT code *
* press CTRL+C to exit *
Keypressed echo: a ( Натиснуто клавішу “a”
ASCII-code: 61
Keypressed echo: 1 ( Натиснуто клавішу “1”
ASCII-code: 31
Keypressed echo: ← ( Натиснуто клавішу ESC
ASCII-code: 1B
Keypressed echo: ; ( Натиснуто клавішу F1
Extended-code: 3B
Keypressed echo: ^C ( Натиснуто CTRL+C
Виконання програми завершено.
Висновок: Виконуючи дану лабораторну роботу, я вивчив органiзацiю та принципи роботи клавiатури, оволодiв навичками управлiння клавiатурою за допомогою системних функцiй.