Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Исследование клавиатуры (Программирование клавиатуры) - файл TZKIT_1.doc


Исследование клавиатуры (Программирование клавиатуры)
скачать (40.5 kb.)

Доступные файлы (21):

A1.ASM
B1.ASM
B2.ASM
C1.ASM
C2.ASM
D1.ASM
D2.ASM
E1.ASM
E2.ASM
KBD.ASM
OUTPROCS.ASM
ZA1.BAT
ZB1.BAT
ZB2.BAT
ZC1.BAT
ZC2.BAT
ZD1.BAT
ZD2.BAT
ZE1.BAT
ZE2.BAT
TZKIT_1.doc221kb.20.12.2010 23:27скачать

содержание
Загрузка...

TZKIT_1.doc

Реклама MarketGid:
Загрузка...
Министерство образования Украины

Национальный Технический Университет Украины

“Киевский Политехнический Институт”

Кафедра систем автоматизированного проектирования


ОТЧЕТ О ВЫПОЛНЕНИИ

ЛАБОРАТОРНОЙ РАБОТЫ № 1

ИССЛЕДОВАНИЕ КЛАВИАТУРЫ




по курсу

ТЕХНИЧЕСКИЕ СРЕДСТВА КОМПЬЮТЕРНЫХ

ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ“




Подготовил: Принял:


студент группы ДА-XX Зинченко В.Я.

XXXXX


2000

Задание


1.Аппаратные и программные средства ввода информации с клавиатуры.

Привести краткий обзор по следующим вопросам:

а) аппаратные средства персонального компьютера для ввода информации с клавиатуры,

б) анализ и преобразование скэн-кода;

в) ввод информации средствами MSDOS.

2.Спроектировать и реализовать в виде отдельных модулей следующие функции:

а) получение скэн-кодов нажатой и отжатых клавиш,

б) используя обращение к портам контролера, реализовать управлением задержки и частоты повторением имитации нажатой клавиши;

в) получить расширенный скэн-код клавиатуры при непосредственном обращении к буферу клавиатуры;

г) определить состояние клавиатуры, используя порты 0040:0017 и 0040:0018;

д) используя непосредственное обращение к буферу клавиатур, реализовать функцию имитирующую работу клавиатуры.

3.Используя средства BIOS, реализовать функции перечисленные в пунктах б), в), г) и д).

Провести сравнительную характеристику полученных реализаций.

4.Отчет должен содержать:

а) краткий обзор, тематика которого определена в пункте №1;

б) описание спроектированных модулей;

в) листинги разработанных программ,

г) выводы по работе.

ПРИМЕЧАНИЕ:

Все программные модули должны быть написаны на языке ASSEMBLER в режиме MASM. Передача параметров и возврат результатов должны соответствовать соглашениям, принятыми для языка С модели SMALL.


1.Аппаратные и программные средства

ввода информации с клавиатуры.


а) аппаратные средства персонального компьютера для ввода информации с клавиатуры показаны на рис.1.

  • расположенная внутри клавиатуры однокристальная микроЭВМ Intel 8048;

  • адаптер клавиатуры;

  • системная шина и контроллер прерываний.


Адаптер клавиатуры включает схему программируемого параллельного интерфейса 8255, а также другие элементы, назначение которых - преобразование последовательного кода, поступающего от клавиатуры, в параллельный код. Результат хранится в порту A ППИ 8255 (адрес 60h). После записи информации в этот порт схема выдаёт сигнал на линию прерывания

IRQ1 контроллера прерываний. Он в свою очередь выдаёт прерывание int 9h, обработчик которого находится в BIOS.


Рис.1 Схема взаимодействия аппаратных средств ПК для ввода информации с клавиатуры.





б) анализ и преобразование скэн-кода.

Скэн-код, сгенерированный микроЭВМ клавиатуры 8048 через адаптер клавиатуры поступает в порт 60h. При этом коды нажатой и отжатой клавиш отличаются между собой значением старшего бита: 0 для нажатой и 1 для отжатой клавиши. Когда скэн-код записан в порт 60h, адаптер клавиатуры выдает сигнал подтверждения, уведомляя процессор клавиатуры о принятии кода. Далее вызывается обработчик прерывания 9h. Дальнейшая обработка зависит от типа нажатых клавиш. Shift-клавиши (Shift, Alt, Ctrl) и триггерные клавиши определяют состояние клавиатуры и соответствующим образом изменяют содержимое регистров состояния клавиатуры 0000:0417 и 0000:0418. Большинство же клавиш и их комбинации с Shift-клавишами - это клавиши с буферизацией расширенного кода. При их нажатии в специальный кольцевой буфер клавиатуры в памяти помещается двухбайтовый код или BIOS-код клавиши (комбинация ASCII-код - скэн-код). Аналогичные действия происходят и при нажатии т.н. функциональных клавиш. Так как им не соответствуют ASCII-символы, то в кольцевой буфер клавиатуры помещается комбинация вида (0 или т.н. префикс -- скэн-код ).

Особым образом обрабатывается нажатие некоторых других клавиш или их комбинаций:

PrintScreen - вызывается прерывание 5h;

Ctrl-Alt-Del - вызывается программа начальной загрузки;

Ctrl-Break - устанавливается флаг, сигнализирующий о желании пользователя прервать выполнение текущей программы.

Специальным образом обрабатывается также Alt-<ввод>.

Рассмотрим кратко структуру кольцевого буфера клавиатуры. Этот буфер занимает адресное пространство от 40:1Eh до 40:3Dh включительно. По адресу 40:1Ah находится указатель головы буфера, т.е. ячейки, с которой начинается заполнение буфера. По адресу 40:1Ch находится указатель хвоста буфера, который указывает на ячейку, в которую будет записан код нажатой клавиши. При заполнении буфера перемещается указатель хвоста. Буфер пуст, если указатели головы и хвоста равны. Для очистки буфера необходимо просто приравнять указатели головы и хвоста. С адреса 40:1Eh начинается непосредственно буфер. Именно в это адресное пространство записываются коды нажатых клавиш.

в) ввод информации средствами MS-DOS.

Для вызова функций MS-DOS используется прерывание INT 21h. Это прерывание служит главным входом большинства функций DOS. Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H. Существуют следующие функции для ввода символьной информации:

^ 01H - ввод с клавиатуры с эхом и ожиданием и с проверкой на

Ctrl-Break;

08H - ввод с клавиатуры без эха с ожиданием и с проверкой на

Ctrl-Break;

07H - ввод с клавиатуры без эха c ожиданием и без проверки на

Ctrl-Break

06H - ввод с клавиатуры без эха без ожидания и без проверки на

Ctrl-Break

0bH - дать статус ввода – была ли нажата клавиша - (и обработать

ждущий Ctrl-Break)

0cH - очистить буфер клавиатуры и ждать ввода

0aH - буферизованный ввод с клавиатуры (ввод строки)


2.Описание спроектированных модулей.


Все программные модули написаны на языке ASSEMBLER. Передача параметров и возврат результатов соответствуют соглашениям, принятым для языка С модели SMALL. Где это необходимо по смыслу задания, пользователю предлагается осуществить выбор из меню, предварительно выведенного на экран, необходимой опции путем ввода ее порядкового номера.

Процедуры для вывода на экран, многократно используемые при выполнении работы, собраны в модуле outprocs.asm (см. Листинг 1.).

Процедуры, реализующие требуемые в задании функции работы с клавиатурой, собраны в модуле kbd.asm (см. Листинг 2).

В остальных модулях, соответствующих каждому пункту задания, содержатся основные части программ, в частности организация интерфейса пользователя.

В тексте модулей даны соответствующие комментарии, поясняющие их назначение, а также назначение всех процедур.


3. Листинги разработанных программ.


Листинг 1. Модуль, содержащий процедуры вывода на экран (outprocs.asm).

masm

model small,c

.stack 100h

.data

digit_sym db ?

.code

public outhex

public outbyte

public initvideo

public clrscr

public outtextxy

public outtext

public outstring


outhex proc c near x:word ;вывод hex-тетрады

mov ax,x ;в текущей позиции

and ax,000Fh

cmp al,10

jae abcdef ; if al>=10

add al,30h ; для 0123456789

jmp short write;

abcdef:

add al,55 ; для ABCDEF

write:

mov digit_sym,al

call outtext c,offset digit_sym,1

ret

outhex endp


outbyte proc c near x:word ;вывод байта в виде hex

mov ax,x ;в текущей позиции

shr ax,4

call outhex c,ax ;вывод старшей тетрады

mov ax,x

call outhex c,ax ;вывод младшей тетрады

ret

outbyte endp


initvideo proc c near ;установка видеорежима

mov ax,0003h ; color 80x25

int 10h ;установка активной страницы

mov ax,0500h

int 10h

ret

initvideo endp


clrscr proc c near ;очистка экрана

mov ax,0600h

mov bh,07h

mov cx,0000h

mov dx,184Fh

int 10h

ret

clrscr endp


;вывод текста в заданную позицию

outtextxy proc c near x:word,y:word,text:word,len:word

push ds

pop es

mov ah,13h

mov al,01h

mov bh,00h

mov bl,0Ah

mov dh,byte ptr y

mov dl,byte ptr x

mov cx,len

push bp

mov bp,text

int 10h

pop bp

ret

outtextxy endp

;вывод текста в текущую позицию

outtext proc c near text:word,len:word

mov ah,03h ;чтение положения курсора

mov bh,00h

int 10h

mov cl,dh ;строка

call outtextxy c,dx,cx,text,len

ret

outtext endp

;вывод строки текста в текущую позицию

outstring proc c near s:word;

mov ah,09h

mov dx,s

int 21h

ret

outstring endp

end

^ Листинг 2. Модуль, содержащий процедуры, реализующие требуемые функции работы с клавиатурой (kbd.asm).

masm

model small,c

.stack 100h

.code

public getcharfromport

public setkbdparameters

public getcharfrombuf

public getstatus

public putcharinbuf

public clearbuf

public BIOSsetkbdparameters

public BIOSgetchar

public BIOSgetstatus

public BIOSputcharinbuf


;получение скан-кода из порта клавиатуры

getcharfromport proc c near

in al,60h

ret

getcharfromport endp


;задание времени задержки и скорости повтора

setkbdparameters proc c near parametr:word

mov al,0f3h ;запись управляющего кода в al

out 60h,al

mov cx,8000h

kbd_delay: loop kbd_delay

mov al,byte ptr parametr ;запись параметров в al

out 60h,al

ret

setkbdparameters endp


;получение расширенного скэн-кода клавиши путем

;непосредственного обращения к буферу клавиатуры

getcharfrombuf proc c near

mov ax,0040h

mov es,ax

mov bx,es:001Ah ;чтение ук.головы bx:=head

waitkey:

cmp bx,es:001Ch ;head==tail ?

je waitkey ;да - в буфере нет кода

mov ax,es:[bx] ;ax:=[head] чтение кода из буфера

cmp bx,003Ch ;если head указывает на конец буфера

je rewind ;установить head на начало буфера

add bx,2 ;head:=head+2

jmp savehead

rewind:

mov bx,001Eh ;голова на начало буфера

savehead:

mov es:001Ah,bx ;установить head

ret

getcharfrombuf endp


;чтение регистров состояния клавиатуры

; AL 0417h

; AH 0418h

getstatus proc c near

mov ax,0000h

mov es,ax

mov ax,es:0417h

ret

getstatus endp


;запись символа в буфер клавиатуры

putcharinbuf proc c near symb:word

mov ax,0040h

mov es,ax

mov bx,es:001Ch ;bx:=tail

mov ax,symb

mov es:[bx],ax ;код в буфер

add bx,0002h ;tail:=tail+2

cmp bx,003Eh ;if tail==end_of_buf

jne quit_proc ;tail:=beg_of_buf

mov bx,001Eh

quit_proc:

mov es:001Ch,bx ;tail:=bx

ret

putcharinbuf endp


clearbuf proc c near ;очистка буфера клавиатуры

push ax

push es

mov ax,0040h

mov es,ax

cli

mov ax,es:001Ch ;head:=tail

mov es:001Ah,ax

sti

pop es

pop ax

ret

clearbuf endp


;задание времени задержки и скорости повтора через BIOS

; BH repeat delay 0,1,2,3

; BL typematic rate 00..1F

BIOSsetkbdparameters proc c near parametr:word

mov ah,03h

mov al,05h

mov bx,parametr

int 16h

ret

BIOSsetkbdparameters endp


;получение расширенного скэн-кода через BIOS

BIOSgetchar proc c near

mov ah,10h

int 16h

ret

BIOSgetchar endp


;чтение регистров состояния клавиатуры через BIOS

; AL 0417h

; AH 0418h

BIOSgetstatus proc c near

mov ah,12h

int 16h

ret

BIOSgetstatus endp


;запись символа в буфер клавиатуры через прерывание BIOS

BIOSputcharinbuf proc c near symb:word

mov ah,05h

mov cx,symb

int 16h

ret

BIOSputcharinbuf endp

end


^ Листинг 3. Получение скэн-кодов нажатых и отжатых клавиш.

masm

model small,c

.stack 100h

.data

start_msg db 'Получение скэн-кодов нажатой и отпущенной клавиш (ESC выход) '

down_msg db 'Код нажатой клавиши '

up_msg db 'Код отпущенной клавиши '

cur_60 db 0

.code

extrn outbyte :near

extrn clearbuf :near

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn getcharfromport : near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call outtextxy c,0,0,offset start_msg,62

cyckle:

call getcharfromport c

cmp al,01h

jne go ;ESC выход

mov ax,4c00h

int 21h

go:

call clearbuf c

cmp al,cur_60

je cyckle ; если значение изменилось

mov cur_60,al ; вывести код

cmp al,80h

jae keyup ;if al>=128 goto keyup

call outtextxy c,00h,02h,offset down_msg,24

jmp short show

keyup: call outtextxy c,00h,02h,offset up_msg,24

show: mov al,cur_60

call outbyte c,ax

jmp cyckle

end start


^ Листинг 4.Управление временем задержки и частотой повтора имитации нажатой клавиши непосредственно через порт контроллера.

masm

model small,c

.stack 100h

.data

param dw 0

start_msg db 'Настройка времени задержки и частоты повтора символов'

cr equ 10

lf equ 13

tab equ 9

menu_msg_freq db cr,lf,cr,lf,tab,'Выберите частоту повторения :'

db cr,lf,tab,tab,'1 - 30,0 Гц'

db cr,lf,tab,tab,'2 - 26,7 Гц'

db cr,lf,tab,tab,'3 - 24,0 Гц'

db cr,lf,tab,tab,'4 - 20,0 Гц'

db cr,lf,tab,tab,'5 - 15,0 Гц'

db cr,lf,tab,tab,'6 - 10,0 Гц'

db cr,lf,tab,tab,'7 - 9,2 Гц'

db cr,lf,tab,tab,'8 - 7,5 Гц'

db cr,lf,tab,tab,'9 - 5,0 Гц'

db cr,lf,tab,tab,'0 - 2,0 Гц'

db cr,lf,tab,tab,'ESC выход $'

menu_msg_delay db cr,lf,cr,lf,tab,'Выберите время задержки :'

db cr,lf,tab,tab,'F1 - 250 мсек'

db cr,lf,tab,tab,'F2 - 500 мсек'

db cr,lf,tab,tab,'F3 - 750 мсек'

db cr,lf,tab,tab,'F4 - 1000 мсек'

db cr,lf,tab,tab,'ESC выход $'

.code

extrn clearbuf :near

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn outstring :near

extrn getcharfromport:near

extrn setkbdparameters:near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call outtextxy c,0,0,offset start_msg,53

call outstring c,offset menu_msg_freq

menu_loop1:

call getcharfromport c

call clearbuf c

cmp al,02 ;1

je fr1

cmp al,03 ;2

je fr2

cmp al,04 ;3

je fr3

cmp al,05 ;4

je fr4

cmp al,06 ;5

je fr5

cmp al,07 ;6

je fr6

cmp al,08 ;7

je fr7

cmp al,09 ;8

je fr8

cmp al,0Ah ;9

je fr9

cmp al,0Bh ;0

je fr0

cmp al,01h ;ESC - выход

jne menu_loop1

mov ax,4c00h

int 21h

fr1: mov param,00h

jmp menu2

fr2: mov param,01h

jmp menu2

fr3: mov param,02h

jmp menu2

fr4: mov param,04h

jmp menu2

fr5: mov param,08h

jmp menu2

fr6: mov param,0Ch

jmp menu2

fr7: mov param,0Dh

jmp menu2

fr8: mov param,10h

jmp menu2

fr9: mov param,14h

jmp menu2

fr0: mov param,1Fh

menu2: call outstring c,offset menu_msg_delay

menu_loop2:

call getcharfromport c

call clearbuf c

cmp al,3Bh ; F1

je execute

cmp al,3Ch ; F2

je d2

cmp al,3Dh ; F3

je d3

cmp al,3Eh ; F4

je d4

cmp al,01h ;ESC - выход

jne menu_loop2

mov ax,4c00h

int 21h

d2: add param,20h

jmp execute

d3: add param,40h

jmp execute

d4: add param,60h

execute:

call setkbdparameters c,param

mov ax,4c00h

int 21h

end start


^ Листинг 5.Получение расширенного скэн-кода клавиатуры при непосредственном обращении к буферу клавиатуры

masm

model small,c

.stack 100h

.data

start_msg db 'Получение расширенных скэн-кодов из буфера клавиатуры(ESC выход)'

lo_msg db ' ASCII-код или префикс ' ;al

hi_msg db ' Скэн-код ' ;ah

scancod dw 0

.code

extrn outbyte :near

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn getcharfrombuf:near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call outtextxy c,0,0,offset start_msg,64

cyckle:

call getcharfrombuf c

mov scancod,ax

call outtextxy c,0,1,offset lo_msg,24

mov ax,scancod

call outbyte c,ax

call outtextxy c,0,2,offset hi_msg,10

mov al,byte ptr scancod + 1

call outbyte c,ax

mov ax,scancod

cmp al,1Bh ; ASCII-код клавиши ESC

je quit

jmp cyckle

quit: mov ax,4c00h

int 21h

end start


Листинг 6. Определение состояния клавиатуры путем чтения регистров состояния клавиатуры 0000:0417 и 0000:0418.

masm

model small,c

.stack 100h

.data

status dw 0FFFFh

msg_on db ' Да '

msg_off db ' Нет'

cr EQU 13

lf EQU 10

table_msg db 'Состояние клавиатуры ( ESC выход)'

db cr,lf,' 0 Right Shift нажат'

db cr,lf,' 1 Left Shift нажат'

db cr,lf,' 2 Ctrl нажат'

db cr,lf,' 3 Alt нажат'

db cr,lf,' 4 Scroll Lock включен'

db cr,lf,' 5 Num Lock включен'

db cr,lf,' 6 Caps Lock включен'

db cr,lf,' 7 Insert включен'

db cr,lf,' 0 Left Ctrl нажат'

db cr,lf,' 1 Left Alt нажат'

db cr,lf,' 2 Right Ctrl нажат'

db cr,lf,' 3 Right Alt нажат'

db cr,lf,' 4 Scroll Lock нажат'

db cr,lf,' 5 Num Lock нажат'

db cr,lf,' 6 Caps Lock нажат'

db cr,lf,' 7 Insert нажат','$'

.code

extrn clearbuf :near

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn outstring :near

extrn getcharfromport :near

extrn getstatus :near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call outstring c,offset table_msg

cyckle:

call getcharfromport c

cmp al,01h

je quit ;esc for quit

call clearbuf c

call getstatus c

cmp status,ax

je cyckle

mov status,ax

mov cx,16

bit_loop:

push cx

rol status,1

test status,0001h

jz zero

call outtextxy c,30,cx,offset msg_on,4

jmp next

zero:

call outtextxy c,30,cx,offset msg_off,4

next:

pop cx

loop bit_loop

jmp cyckle

quit:

call clearbuf c

call clrscr c

mov ax,4c00h

int 21h

end start


Листинг 7. Имитация работы клавиатуры путем непосредственного обращения к буферу клавиатуры.

masm

model small,c

.stack 100h

.data

start_msg db 'Имитация работы клавиатуры напрямую через буфер '

start_msg2 db 'Программа заносит в буфер клавиатуры команду dir '

char_d dw 2064h

char_i dw 1769h

char_r dw 1372h

char_enter dw 1C0Dh

.code

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn clearbuf :near

extrn putcharinbuf :near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call clearbuf c

call outtextxy c,0,0,offset start_msg,50

call outtextxy c,0,1,offset start_msg2,50

call putcharinbuf c,char_d

call putcharinbuf c,char_i

call putcharinbuf c,char_r

; call putcharinbuf c,char_enter

mov ax,4c00h

int 21h

end start

^ Листинг 8.Управление временем задержки и частотой повтора имитации нажатой клавиши через BIOS.

masm

model small,c

.stack 100h

.data

param dw 0

start_msg db 'Настройка времени задержки и частоты повтора символов через BIOS'

cr equ 10

lf equ 13

tab equ 9

menu_msg_freq db cr,lf,cr,lf,tab,'Выберите частоту повторения :'

db cr,lf,tab,tab,'1 - 30,0 Гц'

db cr,lf,tab,tab,'2 - 26,7 Гц'

db cr,lf,tab,tab,'3 - 24,0 Гц'

db cr,lf,tab,tab,'4 - 20,0 Гц'

db cr,lf,tab,tab,'5 - 15,0 Гц'

db cr,lf,tab,tab,'6 - 10,0 Гц'

db cr,lf,tab,tab,'7 - 9,2 Гц'

db cr,lf,tab,tab,'8 - 7,5 Гц'

db cr,lf,tab,tab,'9 - 5,0 Гц'

db cr,lf,tab,tab,'0 - 2,0 Гц'

db cr,lf,tab,tab,'ESC выход $'

menu_msg_delay db cr,lf,cr,lf,tab,'Выберите время задержки :'

db cr,lf,tab,tab,'F1 - 250 мсек'

db cr,lf,tab,tab,'F2 - 500 мсек'

db cr,lf,tab,tab,'F3 - 750 мсек'

db cr,lf,tab,tab,'F4 - 1000 мсек'

db cr,lf,tab,tab,'ESC выход $'

.code

extrn clearbuf :near

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn outstring :near

extrn getcharfromport :near

extrn BIOSsetkbdparameters :near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call outtextxy c,0,0,offset start_msg,64

call outstring c,offset menu_msg_freq

menu_loop1:

call getcharfromport c

call clearbuf c

cmp al,02 ;1

je fr1

cmp al,03 ;2

je fr2

cmp al,04 ;3

je fr3

cmp al,05 ;4

je fr4

cmp al,06 ;5

je fr5

cmp al,07 ;6

je fr6

cmp al,08 ;7

je fr7

cmp al,09 ;8

je fr8

cmp al,0Ah ;9

je fr9

cmp al,0Bh ;0

je fr0

cmp al,01h ;ESC - выход

jne menu_loop1

mov ax,4c00h

int 21h

fr1: mov param,00h

jmp menu2

fr2: mov param,01h

jmp menu2

fr3: mov param,02h

jmp menu2

fr4: mov param,04h

jmp menu2

fr5: mov param,08h

jmp menu2

fr6: mov param,0Ch

jmp menu2

fr7: mov param,0Dh

jmp menu2

fr8: mov param,10h

jmp menu2

fr9: mov param,14h

jmp menu2

fr0: mov param,1Fh

menu2: call outstring c,offset menu_msg_delay

menu_loop2:

call getcharfromport c

call clearbuf c

cmp al,3Bh ; F1

je execute

cmp al,3Ch ; F2

je d2

cmp al,3Dh ; F3

je d3

cmp al,3Eh ; F4

je d4

cmp al,01h ;ESC - выход

jne menu_loop2

mov ax,4c00h

int 21h

d2: add param,0100h

jmp execute

d3: add param,0200h

jmp execute

d4: add param,0300h

execute:

call BIOSsetkbdparameters c,param

mov ax,4c00h

int 21h

end start

^ Листинг 9.Получение расширенного скэн-кода клавиатуры через BIOS.

masm

model small,c

.stack 100h

.data

start_msg db 'Получение расширенных скэн-кодов через BIOS(ESC выход) '

lo_msg db ' ASCII-код или префикс ' ;al

hi_msg db ' Скэн-код ' ;ah

scancod dw 0

.code

extrn outbyte :near

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn BIOSgetchar :near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call outtextxy c,0,0,offset start_msg,55

cyckle:

call BIOSgetchar c

mov scancod,ax

call outtextxy c,0,1,offset lo_msg,24

mov ax,scancod

call outbyte c,ax

call outtextxy c,0,2,offset hi_msg,10

mov al,byte ptr scancod + 1

call outbyte c,ax

mov ax,scancod

cmp al,1Bh ; ASCII-код клавиши ESC

je quit

jmp cyckle

quit: mov ax,4c00h

int 21h

end start

Листинг 10. Определение состояния клавиатуры через BIOS.

masm

model small,c

.stack 100h

.data

status dw 0FFFFh

msg_on db ' Да '

msg_off db ' Нет'

cr EQU 13

lf EQU 10

table_msg db 'Состояние клавиатуры, полученное через BIOS( ESC выход)'

db cr,lf,' 0 Right Shift нажат'

db cr,lf,' 1 Left Shift нажат'

db cr,lf,' 2 Ctrl нажат'

db cr,lf,' 3 Alt нажат'

db cr,lf,' 4 Scroll Lock включен'

db cr,lf,' 5 Num Lock включен'

db cr,lf,' 6 Caps Lock включен'

db cr,lf,' 7 Insert включен'

db cr,lf,' 0 Left Ctrl нажат'

db cr,lf,' 1 Left Alt нажат'

db cr,lf,' 2 Right Ctrl нажат'

db cr,lf,' 3 Right Alt нажат'

db cr,lf,' 4 Scroll Lock нажат'

db cr,lf,' 5 Num Lock нажат'

db cr,lf,' 6 Caps Lock нажат'

db cr,lf,' 7 SysRq нажат','$'

.code

extrn clearbuf :near

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn outstring :near

extrn getcharfromport :near

extrn BIOSgetstatus :near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call outstring c,offset table_msg

cyckle:

call getcharfromport c

cmp al,01h

je quit ;esc for quit

call clearbuf c

call BIOSgetstatus c

cmp status,ax

je cyckle

mov status,ax

mov cx,16

bit_loop:

push cx

rol status,1

test status,0001h

jz zero

call outtextxy c,30,cx,offset msg_on,4

jmp next

zero: call outtextxy c,30,cx,offset msg_off,4

next: pop cx

loop bit_loop

jmp cyckle

quit: call clearbuf c

call clrscr c

mov ax,4c00h

int 21h

end start

Листинг 11. Имитация работы клавиатуры путем обращения к буферу клавиатуры через BIOS.

masm

model small,c

.stack 100h

.data

start_msg db 'Имитация работы клавиатуры напрямую через буфер '

start_msg2 db 'Программа заносит в буфер клавиатуры команду dir '

char_d dw 2064h

char_i dw 1769h

char_r dw 1372h

char_enter dw 1C0Dh

.code

extrn initvideo :near

extrn clrscr :near

extrn outtextxy :near

extrn clearbuf :near

extrn BIOSputcharinbuf:near

start:

mov ax,@data

mov ds,ax

call initvideo c

call clrscr c

call clearbuf c

call outtextxy c,0,0,offset start_msg,50

call outtextxy c,0,1,offset start_msg2,50

call BIOSputcharinbuf c,char_d

call BIOSputcharinbuf c,char_i

call BIOSputcharinbuf c,char_r

; call BIOSputcharinbuf c,char_enter

mov ax,4c00h

int 21h

end start

4.Выводы по работе.


В результате выполнения лабораторной работы были реализованы функции работы с клавиатурой, указанные в задании. Эти функции реализованы как путем непосредственного обращения к аппаратной части ПК (регистрам, портам, памяти и т.д.), так и с использованием функций работы с клавиатурой BIOS. В результате сравнения полученных реализаций можно сделать вывод о том, программирование работы с клавиатурой на уровне аппаратных средств гораздо сложнее программирования аналогичных действий с помощью BIOS, т.к. требует от программиста знания деталей аппаратной реализации соответствующих устройств и принципов их функционирования. Кроме того, полученная программная реализация жестко привязана к соответствующему аппаратному обеспечению. Программирование с помощъю BIOS свободно от указанного недостатка, т.к. по существу, программисту предлагается стандартизованный набор функций (интерфейс более высокого уровня). Таким образом, программа, ориентированная на работу с клавиатурой через BIOS является независимой от конкретной аппаратной реализации. Преимуществом использования BIOS является также более простая и более компактная реализация программы. BIOS предоставляет достаточно широкий набор функций для работы с клавиатурой, поэтому использование прямого программирования аппаратных средств может быть целесообразным только в случае, если необходимая функция не реализуется BIOS или не удовлетворяет предъявляемым к программе требованиям (например, по быстродействию).


Скачать файл (40.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации