Автор работы: Пользователь скрыл имя, 25 Февраля 2013 в 23:23, курсовая работа
Випуск комп'ютерів IBM PC розпочався у 1981 році, і вони швидко завоювали величезну популярність у користувачів. IBM PC і сумісні з ними комп'ютери становлять тепер більшу частину парку професійних ПЕОМ у світі. У цей час програмне забезпечення, розроблене для IBM PC, охоплює практично всі сфери людської діяльності. Даний курсовий проект присвячений розробці програми-перемикача світлодіодів клавіатури.
Вступ 5
1 Пристрій введення даних – клавіатура 6
1.1 Характеристика клавіатури 6
1.2 Типи клавіатур 7
2 Керування клавіатурою на рівні портів введення-виведення 10
3 Схема керування клавиатурою 13
4 Розробка програми-перемикача світлодіодів клавіатури 15
4.1 Опис програми 15
4.2 Інструкція коритсувачу 16
5 Тестування розробленої програми 17
Заключення 18
Література 19
Додаток А Текст програми 20
Графічна частина
Лист 1 (формат А2) Блок-схема алгоритму програми
jne not_our_key ; перейти до нашому
[...]
not_our_key:
jmp old_int09h ; виклик старого оброблювача
Ми поки не можемо завершити оброблювач просто командою IRET, тому що, по-перше, оброблювач апаратного переривання клавіатури повинен установити біт 7 порту 61h, а потім повернути його у вихідний стан, наприклад так:
in al,61h
push ax
or al,80h
out 61h,al
pop ax
out 61h,al
А по-друге, він повинен повідомити контролеру переривань, що обробка апаратного переривання закінчилася командами
mov al,20h
out 20h,al
60h для запису — регістр керування клавіатурою. Байт, записаний у цей порт (якщо біт 1 у порту 64h дорівнює 0), інтерпретується як команда. Деякі команди складаються з більш ніж одного байта — тоді варто дочекатися обнуління цього біта ще раз перед тим, як посилати наступний байт.
Перелічимо найбільш стандартні команди.
Команда EDh 0?h — змінити стан світлодіодів клавіатури. Другий байт цієї команди визначає новий стан:
біт 0 — стан Scroll Lock (1 — включена, 0 — виключена)
біт 1 — стан Num Lock
біт 2 — стан Caps Lock
При цьому стан перемикачів, що зберігає BIOS у байтах стану клавіатури, не змінюється, і з першою нагодою оброблювач переривання клавіатури BIOS відновить стан світлодіодів.
Команда EEh — луна-запит. Клавіатура відповідає скан-кодом EEh.
Команда F3h ??h — Установити параметри режиму автоповтора:
біт 7 другого байта команди — 0
біти 6 – 5 встановлюють паузу перед початком автоповтора:
00 = 250ms, 01 = 500ms, 10 = 750ms, 11 = 1000ms
біти 4 – 0 встановлюють швидкість автоповтора (символів у секунду):
00000 = 30,0 01111 = 8,0
00010 = 24,0 10010 = 6,0
00100 = 20,0 10100 = 5,0
00111 = 16,0 10111 = 4,0
01000 = 15,0 11010 = 3,0
01010 = 12,0 11111 = 2,0
01100 = 10,0
Всі проміжні значення також мають сенс і відповідають проміжним швидкостям, наприклад 00001 = 26,7.
Команда F4h — ввімкнути клавіатуру.
Команда F5h — вимикнути клавіатуру.
Команда F6h — установити параметри за замовчуванням.
Команда FEh — послати останній скан-код ще раз.
Команда FFh — виконати самотестування.
Клавіатура відповідає на всі команди, крім EEh й FEh, скан-кодом FAh (підтвердження), що поглинається стандартним оброблювачем BIOS, так що, якщо ми не заміщаємо повністю стандартний оброблювач, про його обробку можна не турбуватися.
Схема обробки переривання від клавіатури зображена на малюнку 3.1
При натисканні на клавішу виробляється електричний сигнал, що перетворює в так званий SCAN-код клавіші довжиною в 1 байт.
SCAN-код виробляється
при натисканні або при
SCAN-код попадає в контролер клавіатури. У ньому існує невеликий буфер, де накопичуються SCAN-коди до їхньої обробки.
Контролер клавіатури надсилає запит на переривання на контролер переривань, контролер переривань на центральний процесор по лінії INTR. Якщо переривання дозволені, центральний процесор по лінії INTA видає сигнал контролеру клавіатури для того, щоб контролер клавіатури виставив SCAN-код клавіші в порт 60h. Далі центральний процесор виконує 9-і переривання, тобто викликає підпрограму обробки цього переривання. Підпрограма обробки (тобто 09h) забирає SCAN-код з порту 60h (читає), обробляє його, тобто ставить йому певний ASCII-код у буфер клавіатури.
Сигнал переривань
Відповідь
SCAN- код
SCAN-код
ASCII-код
SCAN-код
Мал. 3.1 Схема обробки переривання від клавіатури
Буфер клавіатури – це спеціальна область в оперативній пам'яті, куди заносяться SCAN й ASCII коди клавіш.
Програма INT 09h поряд з буфером клавіатури використовує також спеціальні осередки, де зберігається слово стану клавіатури (мал. 3.2). Це слово містить біти, які характеризують натискання керуючих клавіш типу ALT, CTRL, SHIFT і т.д. Це слово стану клавіатури розташоване за адресою 0040h:0017h (осередок 417, сегмент 0, зсув 417).
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
INS |
Caps Lock |
Num Lock |
Scroll Lock |
ALT |
CTRL |
SHIFT (лівий) |
SHIFT (правий) |
Якщо в біті 1, то відповідна клавіша натиснута.
Програма описана як com-програма (org 100h). Тіло програми складається із трьох процедур, описаних з параметром near.Тіло основної програми перебуває в процедурі Start. Після неї описані дві підпрограми - change_LEDs й wait_KBin. Нижче представлений опис кожної з них.
В основній програмі за допомогою функції 02h переривання int 1Ah визначається поточний час. Поточна секунда зберігається з регістра dh у регістр ch. Регістру сl привласнюється стан світлодіодів клавіатури, дорівнює 0100b. Далі треба виконати цикл, організований за допомогою мітки main_loop, у якому власне відбувається перемикання світлодіодів клавіатури відповідно до регістра сl. На початку циклу викликається процедура change_LEDs. Далі відбувається зрушення регістра cl на 1, тобто перехід до наступного світлодіоду. Якщо 1 виходить у біт 3 – відбувається повернення її в біт 0. Потім у циклі, організованому у вигляді мітки continue відбуваються наступні дії: за допомогою функції 1h переривання int 16h перевіряється, чи не натиснута клавіша; якщо натиснуто - перехід на мітку exit_loop - зчитування клавіші (функція 0h переривання int 16h) і вихід із програми (команда ret) ; якщо клавіша не була натиснута - у стеці зберігається регістр сх (команда push cх) , далі за допомогою функції 02h переривання int 1Ah визначається поточний час, відновлюється зі стека регістр сх (команда pop cx) і рівняється поточна секунда з регістра dh зі значенням у регістрі сh; після порівняння в кожному разі йде копіювання поточної секунди з dh в ch (mov ch,dh) і залежно від результату порівняння – якщо була та ж сама секунда, не перемикати світлодіоди (перехід на мітку continue), інакше – перемкнути світлодіоди (перехід на мітку main_loop).
Процедура change_LEDs встановлює стан світлодіодів клавіатури
відповідно до числа в CL. На початку процедури йде виклик підпрограми
wait_KBin - очікування можливості посилки команди. Далі через регістр al у порт 60h посилається команда клавіатури EDh (mov al,EDh й out 60h,al). Потім знову викликається підпрограми wait_KBin. Далі через регістр al у порт 60h пересилається значення регістра сl - новий стан світлодіодів (mov al,сl й out 60h,al). Команда ret - вихід з підпрограми.
Процедура wait_KBin очікує можливість введення команди для клавіатури. На початку відбувається читання слова стану клавіатури - занесення байта в регістр al з порту 64h (mov al,64h). Далі відбувається порівняння - якщо біт 1 із цього байта не дорівнює 1, то очікувати (байт, записаний у порт 60h (якщо біт 1 у порту 64h дорівнює 0), інтерпретується як команда), якщо дорівнює 1 - вийти з підпрограми (команда ret).
Програма закінчується крапкою входу в програму, який має ім'я процедури, що містить тіло основної програми - Start.
Блок-схема алгоритму представлена Листі 1.
Текст програми представлений у Додатку А.
Дане програмне забезпечення не вимагає великого обсягу оперативної пам'яті й працює практично на всіх без винятку IBM-сумісних персональних комп'ютерах. Програма працює в середовищі MS DOS або в режимі емуляції DOS (будь-який файловий менеджер під DOS). Власне сама програма – файл mig.com. Для роботи програми необхідно запустити вищезгаданий файл у зазначеному режимі.
Програма курсового проекту була розроблена для роботи в операційній системі MS DOS (режимі емуляції DOS).
У ході розробки й налагодження програми були повністю виконані вимоги, пред'явлені для курсового проектування, а саме перемикання світлодіодів клавіатури.
Тестування програми проводилося в режимі файлового менеджера під DOS - Volcov Commander. Тестування програми показало, що вона працює правильно й коректно, вихід із програми відбувається по натисканню клавіші на клавіатурі. Після закінчення програми методом перевірки було визначено, що відбувається перемикання світлодіодів на прямо протилежні значення.
При цьому стан перемикачів, що зберігає BIOS у байтах стану клавіатури, не змінюється, і з першою нагодою оброблювач переривання клавіатури BIOS відновить стан світлодіодів. Що й відбувається після виходу з режиму Volcov Commander.
Ірвін, Стосов. Мова Асемблера для процесорів Intel, 3-і видання: Пер. с англ. - М.: Видавничий будинок «Вільямс», 2002.-616с.: іл. - Парал. Тит. Англ.
mig.asm
; циклічно перемикає
; Компіляція:
; TASM:
; tasm /m mig.asm
; tlink /t /x mig.obj
.model tiny
.code
org 100h ; COM-програма
start proc near
mov ah,2 ; функція 02 переривання 1Ah
int 1Ah ; одержати поточний час
mov ch,dh ; зберегти поточну секунду в CH
mov cl,0100b ; CL = стан світлодіодів клавіатури
main_loop:
call change_LEDs ; установити Світлодіоди відповідно до CL
shl cl,1 ; наступний світлодіод,
test cl,1000b ; якщо одиниця вийшла в біт 3,
jz continue
mov cl,0001b ; повернути її в біт 0,
continue:
mov ah,1 ; перевірити, чи не була натиснута клавіша,
int 16h
jnz exit_loop ; якщо так - вийти із програми
push cx
mov ah,2 ; функція 02 переривання 1Ah
int 1Ah ; одержати поточний час
pop cx
cmp ch,dh ; зрівняти поточну секунду в DH з CH
mov ch,dh ; скопіювати її в кожному разі,
je continue ; якщо це була та ж сама секунда - не
; перемикати світлодіоди,
jmp short main_loop ; інакше - перемкнути світлодіоди
exit_loop:
mov ah,0 ; вихід із циклу - була натиснута клавіша
int 16h ; уважати її
ret ; і завершити програму
start endp
; процедура change_LEDs
; установлює стан світлодіодів
клавіатури відповідно до
change_LEDs proc near
Информация о работе Розробка програми, здійснюючій циклічне перемикання світлодіодів клавіатури