МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Лабораторна робота № 9
“ АРИФМЕТИЧНІ ОПЕРАЦІЇ МІКРОПРОЦЕСОРА Intel 8086(80286) ”
Виконав
Ст..гр. КН – 3
ЛЬВІВ 2008
1. МЕТА РОБОТИ
Вивчити основні шляхи програмування портів клавіатури на ЕОМ з мікропроцесором Intel 8086(80286).
2. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ.
Одним з найважливіших пристроїв персонального комп’ютера є клавіатура, яка призначена для інтерфейсу між користувачем та комп’ютером. На даний час існує три основні типи клавіатур. Це клавіатура для комп’ютерів ІВМ РС/ХТ, яка містить 84 клавіші та 101-клавішна клавіатура для ІВМ РС/АТ. Деякі клавіатури містять переми-
_ EMBED PBrush ___
кач режиму роботи (ХТ/АТ). В якості контролера виступає процесор Intel 8042, який призначений для обміну між клавіатурою та CPU.
Всі горизонтальні лінії матриці підключені через резистор до джерела живлення +5В. Контролер клавіатури містить два порти - вхідний і вихідний. Вхідний порт підключений до горизонтальних ліній матриці (Х0-Х4), а вихідний - до вертикальних (Y0-Y4)
Принцип роботи даного пристрою полягає в наступному. Контролер почергово на вертикальних лініях встановлює значення логічного нуля. Потім він почергово опитує горизонтальні лінії. У випадку, коли натиснутих клавіш не має, рівень напруги на всіх горизонтальних лініях буде відповідати логічній 1 (всі ці лінії підключені ло джерела живлення +5V через резистори). У випадку, коли натиснута клавіша - на відповідній горизотальній лінії буде логічний нуль. На наступному кроці визначається ASCII- код натиснутої клавіші.
Для роботи з клавіатурою використовують порти з адресами 60Н та 61Н. Порт 60Н, при читанні, містить сканкод останньої натисненої клавіші.
IN AL, 60H
При використанні порта 60Н на запис програма додатково отримує наступні можливості:
-встановлення затримки перед переходом клавіатури в режимі автоповтору;
-встановлення періоду генерації скан-коду в режимі автоповтору;
-керування світлодіодами для клавіш -Scroll Lock, Num Lock, Caps Lock.
Для встановлення характеристик автоповтору в порт 60Н необхідно записати код команди 0F3Н, потім байт, що визначає характеристики режиму:
біти значення 0-4 5-6
7 Період автоповтору
0-30.0; 0АН - 10.0;
1-26.7; 0DH - 9.2;
2-24.0; 19H - 7.5;
4-20.0; 14H - 5.0;
8-15.0; 1FH -2.0.
Затримка включення режиму автоповтору:
00 - 250
01 - 500
10 - 750
11 -1000
Зарезервоване (має бути рівне 0)
Період автоповтору визначає кількість посилок скан-коду, генерованих процесором клавіатури за одну секунду. Можна використовувати не лише ті значення, які приведені в таблиці, але й проміжні (наприклад 9 або 16Н).
При керуванні світлодіодама використовують команду OEDH. Потім в порт 60Н необхідно записати байт, що має наступний формат:
біти значення 0
1
2
3-7 1 - включити світодіод Scroll Lock
1 - включити світодіод Num Lock
1 - включити світодіод Caps Lock
не використовується
Використання портів при роботі з клавіатурою є дуже громіздкою роботою для програміста, тому більш зручно використати вже готові процедури і функції BIOS(Basic Input/Output System- Базова Система Вводу/Виводу), які розміщені в постійному запам’ятовуючому пристрої комп’ютера.
Для вводу з клавіатури використовують переривання BIOS INT 16H та перевання DOS INT 21H.
MOV AH, номер функції
INT 16h
Функція 00h - означає чекати до того часу, поки користувач не натисне клавішу. В результаті, у регістрі AL, отримаємо код ASCII символа, а якщо в AL нуль, то в AH - розширений код ASCII.
Функція 01h - перевіряє готовність символа на ввід та виводить його, якщо він готовий. Контроль організований по значенню прапорця нуля, якщо клавішу натиснули, то ZF=0. В іншому випадку -ZF=1, тобто клавішу не натискали і черга пуста (ця функція не забирає символ з черги, а тільки перевіряє його наявність )
Функція 02h - читає статус Shift-клавіш. У результаті, в регістрі Al міститься статус клавіатури.
Коли користувач натискає клавішу, то автоматично викликається апаратне переривання BIOS. Далі клавіша розпізнається і її код записується в так звану чергу (буфер клавіатури). Буфер клавіатури - спеціальна ділянка пам’яті відведена під збереження кодів натиснених клавіш. Саме з буфера клавіатури (по черзі) зчитуються ASCII-коди клавіш, коли ми викликаємо функцію BIOS INT 16h (АН=00h). Прочитаний символ з буфера стирається. якщо буфер клавіатури на момент виклику INT 16h (АН=00h) пустий, то ця функція зупиняє роботу програми і чекає до того часу, поки натиснуть будь-яку клавішу. (На відміну від INT 16h АН=01h, остання функція тільки вкаже, що клавіші готової нема. ZF=1). Наведемо приклад фрагменту програми, яка чекає на ввід клавіші `А`:
...
mov ah,00h ; ввести символ
int 16h ; з клавіатури
cmp al,`A` ; це велика буква`А`?
jnz tsukl ; якщо ні, то повторити цикл,
... ; тобто перейти на мітку tsukl
Приклад фрагменту програми, яка чекає на натиснення будь-якої коавіші:
...
tsukl
mov ah,01h ; перевірити чи готова
int 16h ; будь-яка клавіша...
jz tsukl ; якщо ні-повторити,
mov ah,0 ; якщо так-зчитати її ASCII-код
int 16h ; в регістр AL
...
Окрім 16Н-го переривання BIOS користувач, для роботи з клавіатурою, може використати 21Н-е переривання операційної системи MS-DOS.
...
mov ah, номер функції
int 21h
...
Функції:
01h - ввести символ з стандартного вводу в регістр AL; 18h - аналогічна функція до 01Н, але введений символ буде відображений на дисплей;
07h - аналогічна функція до 01Н, але не перевіряється Ctrl-Break, Backspace і т.д. (так званий нефільтруючий ввід);
0Bh - отримати статус стандартного вводу і AL=0, якщо символа нема, та AL=0ffh, якщо є;
0Ch - очистити буфер клавіатури і викликати функцію вводу, вказану в регістрі AL при вході. (це може бути 041h, 07h, 08h або 0Bh);
0Ah - буферний ввід.
Для цієї функції адреса буфера вводу міститься в регістрах DS:DX. Дана функція повертає у вказаному буфері введену користувачем стрічку (максимальна довжина стрічки має не перевищувати 254 символи).
При вході, буфер, в який буде введено стрічку, має мати такий вигляд:
+---------------------
| max| ? | ? ? ? ? ?
+---------------------
де max- байт, який вказує максимальну довжину стрічку, яку може ввести користувач. max має значення від 1 до 254. Знаки питання символізують собою місце в пам`яті, яке зарезервоване для введеної користувачем стрічки. Під час виклику функції 0Ah їхні значення ніякої ролі не грають. При виході - буфер буде заповнений таким чином:
+--------------------
|max| len| H I 0dH
+--------------------
де len - довжина введеної користувачем стрічки (не враховуючи коду клавіші Enter - 0dh). H,I- коди ASCII відповідно `H`, `I`, тобто це та стрічка, яку ввів користувач. Символи вводяться з пристрою стандартного вводу до того часу, поки користувач не натисне Enter. Більше символів, ніж було описано при виклику в байті max функція ввести не дозволить. Під час вводу можна користуватися клавішою Backspace. Приведемо приклад виклику Dos-функції:
Функція 01h
...
mov ah,1 ; записати в AL
int 21h ; символ, введений з клавіатури
...
цей символ буде відображено на екрані при вводі з клавіатури, тобто, щоб користувач побачив символ на екрані програмісту не треба буде використовувати спеціальних функцій для друку, на відміну від функції BIOS, де необхідно організувати користувачу вивід символа на екран.
Функція 08h
...
mov ah,8 ; те ж що і функції 01h
int 21h ; але символ на екран не відобразиться
...
Функція 0Аh ;в регістр DX помістити зміщення адреси буфе-
... ;ра, а регістр DS має вказувати аналогічна
mov dx,offset bufer ; функція до 01H сегмент даних.
mov ah,0ah
int 21h ;після цієї команди, якщо припустимо, що ... ;користувач ввів стрічку `Help` то буфер, який ret
;до того містив стрічку `123456789` прийме
bufer: db 8 ;такий вигляд:
db `1234456789` ;bufer: db 8
;db 4 (--тобто довжина введеного слова `Help`
; db `Help`(--в 16-му коді це дорівнює 27h,48h,65h,6ch
;db4 0dh(--код клавіші Enter
;db`789`(--те що залишилося (ці символи не затерлися; введеною стрічкою)
Індивідуальне завдання
Ввести за допомогою клавіатури послідовність даних в ASCII кодах і виконати в ASCII над ними арифметичні операції: (121/11)+(144/12).
Текст програми
.model tiny
.code
org 100h
start: mov ah,9
mov dx,offset message
int 21h
call perevid
mov ax,dane
mov oper1,ax
call perevid
mov ax,dane
mov oper2,ax
call perevid
mov ax,dane
mov oper3,ax
call perevid
mov ax,dane
mov oper4,ax
mov ax,oper1
mov bx,oper2
xor dx,dx
div bx
mov resm,ax
call vuvid
mov ax,oper3
mov bx,oper4
xor dx,dx
div bx
mov resd,ax
call vuvid
mov ax,resm
mov bx,resd
add ax,bx
mov resdod,ax
call vuvid
mov ax,04c00h
int 21h
perevid:
mov dx,offset buffer
mov ah,0Ah
int 21h
xor cx,cx
mov dane,cx
mov cl,byte ptr [blenght]
cmp cl,0
je pom
mov di,-1
mov bx,1
cukl:
mov di,cx
xor ax,ax
mov al,byte ptr bcontents[di-1]
sub ax,30h
cmp al,9
ja pom
mul bx
add dane,ax
mov ax,bx
mul m
mov bx,ax
loop cukl
mov ah,9
mov dx,offset message1
int 21h
ret
vuvid:
mov bx,ax
xor si,si
mov cx,5
mov ax,10000
mov word ptr [m1],ax
perevidasci:
mov ax,bx
xor dx,dx
div word ptr m1
push ax
add ax,30h
mov byte ptr res[si],al
sub al,30h
inc si
pop ax
mul m1
sub bx,ax
mov ax,m1
xor dx,dx
div word ptr m
mov word ptr [m1],ax
loop perevidasci
mov ax,0A0Dh
mov word ptr res[si],ax
inc si
inc si
mov al,24h
mov byte ptr res[si],al
mov dx,offset res
mov ax,0900h
int 21h
ret
pom:
mov dx,offset message2
mov ax,0900h
int 21h
jmp perevid
ret
;pom1:
;mov dx,offset message2
;mov ax,0900h
;int 21h
;jmp start
;ret
message db "Vvedit pershe dane:",0Dh,0Ah,'$'
message1 db 0Dh,0Ah,'$'
message2 db "Vvedit korektno dani:",0Dh,0Ah,'$'
res db 8 dup (" ")
m dw 10
m1 dw 0
dane2 dw ?
dane dw 0
oper1 dw ?
oper2 dw ?
oper3 dw ?
oper4 dw ?
resm dw ?
resd dw ?
resdod dw ?
buffer db 5
blenght db ?
bcontents:
end start
Висновок
На цій лабораторній роботі я вивчив основні шляхи програмування портів клавіатури на ЕОМ з мікропроцесором Intel 8086(80286).