Інститут менеджменту та економіки “Галицька Академія”
Кафедра комп’ютерних та телекомунікаційних систем
КУРСОВИЙ ПРОЕКТ
з дисципліни СИСТЕМНЕ ПРОГРАМУВАННЯ
Тема - Розробити програму обробки даних з маніпулятора “миша”, яка в текстовому режимі роботи монітора виводить на екран відстань в міліметрах та дюймах, що пройшов курсор маніпулятора.
ПОЯСНЮВАЛЬНА ЗАПИСКА
КП.ПІ - 62. 00. 000. ПЗ
Студент гр. ПІ-07-1_______ (Малярчук Т.В.)
(підпис)
Допускається до захисту
Керівник курсового проекту
________________________________________
(посада) (підпис) (дата) (розшифровка підпису)
м.Івано-Франківськ
2008
Анотація
У процесі виконання завдання курсового проектування на мові Assembler розроблено програму, яка опрацьовує поточний стан маніпулятора “миша” і відображає в лівому верхньому куті екрану (в текстовому режимі роботи) шлях пройдений курсором в дюймах і міліметрах.
Розроблено блок-схему програми, подано опис функціонування в середовищі дискової операційної системи.
Annotation
In a process of the job fulfilling of the course planning software which works over current status of the manipulator "mouse" and represents in the left overhead corner of screen (in the character mode of operations) a way passed by a cursor in inches and millimetres is developed in the Assembler language.
A block - program chart is developed, given description of functioning in the environment of disk operating system.
Зміст
1. Опис апаратної частини маніпулятора “Миша” та основних функцій керування ………………………………………………………………………...5
2. Розробка структури та алгоритмів програмного забезпечення керування маніпулятором “Миша…………………………………………………………...8
3. Текст програми опитування та відображення стану маніпулятора “Миша” …………………………………………………………………………………….11
Висновки…………………………………………………………………………15
Перелік використаних літературних джерел…………………………..……....16
1 Опис апаратної частини маніпулятора “Миша” та основних функцій керування
Маніпулятор “Миша” виник як результат реалізації різних ідей: від мережевої комунікації до універсального інтерфейсу користувача.
В наслідок фінансування NASA Даглас Энгельбарт і його колеги створили таблицю властивостей і характеристик відомих на початок 60-х маніпуляторів, в результаті чого було створено перший маніпулятор, рис.1.
Рис. 1.1. Зовнішній вигляд першого маніпулятора
Цей маніпулятор виготовив Білл Інгліш (Bill English), інженер, а програмістом був Джефф Руліфсон (Jeff Rulifson), який написав програми для демонстрації можливостей “Миші”.
Якщо ви відкриєте корпус миші, ви побачите простий механізм, що складається з кульки, двох осей з гумовими валами, двох дисків з отворами і чотирьох фотодатчиків:
Рис. 1.2. Внутрішній устрій миші
Коли ви переміщаєте мишу по поверхні столу, обертання кульки передається через гумові вали двом дискам з отворами. Біля кожного диска розташовані фотодатчики (по два на диск). Вони фіксують напрям обертання і кут повороту дисків. Під час руху миші фотодатчики виробляють імпульси, які передаються в комп'ютер. Кількість цих імпульсів лінійно залежить від величини переміщення миші.
В даний час виготівники комп'ютерного устаткування пропонують великий вибір мишей різного типу. Миші відрізняються не тільки зовнішнім виглядом і кількістю клавішею, але також і способом підключення до комп'ютера, миші можуть мати різну точність і різний програмний інтерфейс.
Можна виділити два найчастіше використовуваних способу підключення миші до комп'ютера: через послідовний порт (COM1, COM2);
через спеціальний адаптер, який вставляється в слот розширення материнської плати комп'ютера.
Вибираючи мишу, використовуйте той спосіб підключення, який вам більш зручний. При цьому не слід забувати про існування комп'ютерів, що не мають слотів розширення (звично це комп'ютери типу Lap-Top). Для таких комп'ютерів більше підійде миша, що підключається через послідовний порт.
Що стосується програмного інтерфейсу, то можна виділити два типи:
трьохкнопкова миша системи Mouse Systems
двохкнопкова миша Microsoft
Деякі миші можуть емулювати обидва типи. Емульований тип залежить від стану перемикача, що знаходиться на нижній кришці корпусу миші або від того, чи була натиснута клавіша миші під час включення живлення комп'ютера.
Принцип функціонування оптичного маніпулятора такий: світло від світлодіода за допомогою лінзи фокусується на ділянці поверхні під “мишою”. Далі цей світловий промінь, відбивається від поверхні, фокусується (збирається) іншою лінзою і направляється безпосередньо в сенсор-приймач, оснащений приймальним оптичним елементом, рис1.2. і, як правило, процесором обробки поступаючих на фотоелемент даних.
Рис. 1.3. Структурна схема оптичного маніпулятора
Необхідно зазначити, що оптимальна відстань від лінзи до поверхні повинна бути в межах від 2.3 до 2.5 мм. Це перша причина, чому оптичні маніпулятори погано працюють на прозорій і напівпрозорій поверхні, дефектами (подряпинами, ямками тощо).
При реалізації програми, що обслуговує диски необхідно використати функції переривання int13h, а також відповідні команди розгалуження, організації циклів та адресації пам’яті:
jmp - команда безумовного переходу, передає управління в іншу точку програми, не зберігаючи будь-якої інформації для повернення. Операндом може бути безпосередня адреса для переходу, а також регістр або змінна, що містить адресу. В розробленій програмі ця команда використана для переходу до загрузчика;
cmp - команда порівнює два операнди і встановлює флажки. Процес здійснюється шляхом вирахування джерела (число, регістр або змінна) з приймача (регістр або змінна, приймач та джерело не можуть бути змінними одночасно), причому результат вирахування нікуди не записується. Єдиним наслідком роботи цієї команди є зміна флажків CF, OF, SF, ZF, AF і PF. В даній програмі команда використовується в поєднанні з командами переходу jmp, jl та jnejl - команда, яка здійснює перехід, аналогічний попередній, з умовою якщо перший операнд при попередньому порівнянні виявився меншим від другого;
pusha - команда розміщує (зберігає) в стеку регістри в такому порядку : AX,CX,DX,BX,SP,BP,SI,DI;
popa - команда виконує дії повністю протилежні pusha (відновлює попередньо збережені значення регістрів), але поміщене в стек значення SP або ESP ігнорується. popa завантажує зі стеку DI,SI,BP, збільшує SP на 2, і завантажує BX,DX,CX,AX;
mov - базова команда пересилання даних. Здійснює копіювання даних в приймач із джерела;
2 Розробка структури та алгоритмів програмного забезпечення керування маніпулятором “Миша”
Програма обробки даних з маніпулятора “миша”, яка в текстовому режимі роботи монітора виводить на екран відстань в міліметрах та дюймах, що пройшов курсор маніпулятора реалізована наступним чином. Програма встановлює текстовий відео режим номер 3 (80 стовбців 25 строк), ініціалізуємо маніпулятор миша, включаємо видимість курсору миші далі в циклі ми зчитуємо без очікування з клавіатури дані та викликаємо підпрограму яка виводить в лівому верхньому куті шлях в міліметрах та дюймах(out_len). Якщо була натиснута клавіша Esc завершуємо виконання програми.
Підпрограма out_len викликає функцію яка визначає переміщення курсору маніпулятора відносно позиції в якій ця функція була викликана перед тим. Якщо переміщення відбувалось у напрямку вверх або вліво функція 000Вh повертає від’ємні значення переміщення , тому в цих випадках нам потрібно змінити знак значень переміщення. Поточне значення переміщення cумується з значенням в лічильнику переміщення. Завершує свою роботу підпрограму викликом підпрограм відображення значень в дюймах та міліметрах (відповідно showD та showM).
Підпрограми showD та showM працюють майже аналогічно, перетворюють значення яке записано в лічильнику переміщення та виводять його на екран за допомогою підпрограм trdec та getch. Відмінність тільки в тому, що дані вони виводять в різних місцях та власне в перетворенні в дюйми та міліметри.
Підпрограма trdec перетворює з двійкової форми значення в десяткову, а якщо точніше сказати виділяє з числа певний розряд та виводить його в ASCI форматі на екран за допомогою підпрограми getch. Розряд визначається значенням в регістрі АХ (АХ=1 – підпрограма виводить нульовий розряд десяткового значення, АХ=100 – перший , і та к далі ).
ні так
Рис. 2.1. Блок-схема програми
так
ні
Рис. 2.2. Блок-схема підпрограми опитування маніпулятора
3 Текст програми опитування та відображення стану маніпулятора “Миша”
.model small
.stack 100h
.code
start:
mov ax,0003h ;Встановлення текстового відео режиму 80х25
int 10h
mov ax,0 ;Ініціалізація маніпулятора миші
int 33h
mov ax,1 ;Функція включення курсору миші
int 33h
m: mov ah,6 ;Функція зчитування натисненої клавіші
mov dl,0ffh ;без очікування, без ехо виводу і без
int 21h ;перевірки на Ctrl+Break
cmp al,1bh ;Якщо натиснута клавіша ESC
je m_end ;переходимо на мітку m_end
call out_len ;інакше викликаємо підпрогаму визначення
;шляху який пройшов курсор маніпулятора
jmp m ;В циклі опитуємо натиснуті клавіші
;========end==============
m_end: mov ah,4ch ;Функція завершення exе програми
int 21h ;переривання DOS
;========proc=============
out_len:
mov ax,000bh ;Функція повертає значення лічильника
;відносного переміщення курсору миші
int 33h
and dx,dx ;В DX=переміщення по вертикалі, якщо значення не від’ємне
jns p1 ;переходимо на мітку р1
neg dx ;інакше змінюємо знак на додатній
p1: add word ptr countD,dx ;додаємо до лічильника отримане значення
and cx,cx ;В СX=переміщення по горизонталі, якщо значення не від'ємне
jns p2 ;переходимо на мітку р2
neg cx ;інакше змінюємо знак на додатній
p2: add word ptr countD,cx ;;додаємо до лічильника отримане значення
call showD ;Викликаємо підпрограму відображення відстані в дюймах
call showM ;Викликаємо підпрограму відображення відстані в міліметрах
ret ;Завершення підпрограми
showD:
mov ah,2 ;Функція встановлює курсор для виведення
;інформації про стан маніпулятора на екран
mov bh,0 ;номер сторінки
mov dh,0 ;номер строки
mov dl,0 ;номер стовбця
int 10h
mov bp,word ptr countD ;Дістаємо значення лічильника
mov ax,20 ;В АХ значення для перетворення одиниць в тисячні дюйма
mul bp ;множення AX на BP
mov bp,ax ;АХ переміщення в тисячних дюйма
mov ax,2710h ;АХ заносимо 10 000 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov ax,03e8h ;АХ заносимо 1000 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov dl,','
call getch
mov ax,64h ;АХ заносимо 100 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov ax,0ah ;АХ заносимо 10 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov ax,1 ;АХ заносимо 1 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov dl,'D'
call getch ;Виводимо символ D
ret
showM:
mov ah,2 ;Функція встановлює курсор для виведення інформації
;про стан маніпулятора на екран
mov bh,0 ;номер сторінки
mov dh,1 ;номер строки
mov dl,0 ;номер стовбця
int 10h
mov bp,word ptr countD ;Дістаємо значення лічильника
mov ax,bp
shr ax,1 ;перетворюємо одиниці в міліметри
mov bp,ax
mov ax,2710h ;АХ заносимо 10 000 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov ax,03e8h ;АХ заносимо 1000 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov ax,64h ;АХ заносимо 100 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov ax,0ah ;АХ заносимо 10 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov ax,1 ;АХ заносимо 1 для перетворення
;в десятковий вигляд значення в лічильнику
call trdec ;виклик підпрограми перетворення бінарного значення в ;десяткове
mov dl,'M'
call getch ;Виводимо символ M
mov dl,'M'
call getch ;Виводимо символ M
ret
;Підпрограма для переведення двійкового значення в десяткове
trdec:
mov dl,0 ;присвоюємо початкове , нульове значення
pt2: cmp ax,bp ;порівнюємо чи значення в АХ не більше за ВР
jnb pt1 ;якщо більше переходимо на мітку pt2
sub bp,ax ;інакше віднімаємо від ВР АХ
inc dl ;і збільшуємо на один наше значення
jmp pt2 ;Повторюємо в циклі
pt1:
add dl,30h ;Перетворюємо наше значення в ASCI код
call getch ;Виводимо його
ret
;Підпрограма виводу символу на екран
getch:
mov ah,2 ;Функція виводу на екран
int 21h
ret
.data
countD dw 0 ;Лічильник переміщення
end start
Висновок
В результаті виконання завдання курсового проектування на мові Assembler розроблено програму, яка опрацьовує поточний стан маніпулятора “миша” і відображає в лівому верхньому куті екрану (в текстовому режимі роботи) шлях пройдений курсором в дюймах і міліметрах .
Розроблено блок-схему програми, подано опис функціонування в середовищі дискової операційної системи.
Література
1. Зубков С.В. Assembler для DOS, Windows и UNIX – 3-е изд., стер. – М.: ДМК Пресс; СПб.: Питер, 2004. – 608с.
2. Джорден Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ./ Предисл. Н.В. Гайского. – М.: Финансы и статистика, 1992. – 544с.
3. Фролов А.В., Фролов Г.В. MS-DOS для программиста. – М.: ДИАЛОГ-МИФИ, 1995. – 256с.
4. Системное программное обеспечение. Учебник для вузов/ А.Ю. Молчанов. - СПб: Питер, 2003. – 396 с.
5. Костельцев А.В. Построение интерпретаторов и компиляторов. – СПб: Наука и техника, 2001. – 224 с.
6. Велихов А.В. Макроассемблер: Создание и отладка программ. – М.: Майор, 2001. – 192 с. – (Мой компьютер).