Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 3.7. Демонстрационная программа работы с клавиатурой (KEY.C).






// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ///////////////////////////////////////

#include < dos.h>

#include < bios.h>

#include < stdio.h>

#include < math.h>

#include < conio.h>

#include < graph.h>

// ОПРЕДЕЛЕНИЯ ///////////////////////////////////////////////

// битовые маски для управляющих клавиш

#define SHIFT_R 0х0001

#define SHIFT_L 0х0002

#define CTRL 0х0004

#define ALT 0х0008

#define SCROLL_LOCK_ON 0х0010

#define NUM_LOCK_ON 0х0020

#define CAPS_LOCK_ON 0х0040

#define INSERT_MODE 0х0080

#define CTRL_L 0х0100

#define ALT_L 0х0200

#define CTRL_R 0х0400

#define ALT_R 0х0800

#define SCROLL_LOCK_DWN 0х1000

#define NUM_LOCK_DWN 0х2000

#define CAPS_LOCK_DWN 0х4000

#define SYS_REQ_DWN 0х8000

// Значения скан-кодов. Внимание: каждая клавиша продуцирует только

// один скан-код, поэтому определения даны только для символов

// нижнего регистра. Например, одна и та же клавиша соответствует

// символу " 1" (нижний регистр) и символу "! " (верхний регистр).

// Однако пользоваться надо все равно определением SCAN_1

#define SCAN_ESC 1

#define SCAN_1 2

#define SCAN_2 3

#define SCAN_3 4

#define SCAN_4 5

#define SCAN_5 6

#define SCAN_6 7

#define SCAN_7 8

#define SCAN_8 9

#define SCAN_9 10

#define SCAN_0 11

#define SCAN_MINUS 12

#define SCAN_EQUALS 13

#define SCAN_BKSP 14

#define SCAN_TAB 15

#define SCAN_Q 16

#define SCAN_W 17

#define SCAN_E 18

#define SCAN_R 19

#define SCAN_T 20

#define SCAN_Y 21

#define SCAN_U 22

#define SCAN_I 23

#define SCAN_0 24

#define SCAN_P 25

#define SCAN_LFT_BRACKET 26

#define SCAN_RGT_BRACKET 27

#define SCAN_ENTER 28

#define SCAN_CTRL 29

#define SCAN_A 30

#define SCAN_S 31

#define SCAN_D 32

#define SCAN_F 33

#define SCAN_G 34

#define SCAN_H 35

#define SCAN_J 36

#define SCAN_K 37

#defane SCAN_L 38

#define SCAN_SEMI 39

#define SCAN_APOS 40

#define SCANJTILDE 41

#define SCAN_LEFT_SHIFT 42

#define SCAN_BACK_SLASH 43

#define SCAN_Z 44

#define SCAN_X 45

#define SCAN_C 46

#define SCAN_V 47

#define SCAN_B 48

#define SCAN_N 49

#define SCAN_M 50

#define SCAN_COMMA 51

#define SCAN_PERIOD 52

#define SCAN_FOWARD_SLASH 53

#define SCAN_RIGHT_SHIFT 54

#define SCAN_PRT_SCRN 55

#define SCAN_ALT 56

#define SCAN_SPACE 57

#define SCAN_CAPS_LOCK 58

#define SCAN_F1 59

#define SCAN_F2 60

#define SCAN_F3 61

#define SCAN_F4 62

#define SCAN_F5 63

#define SCAN_F6 64

#define SCAN_F7 65

#define SCAN_F8 66

#define SCAN_F9 67

#define SCAN_F10 68

#define SCAN_Fll 133

#define SCAN_Fl2 134

#define SCAN_NUM_LOCK 69

#define SCAN_SCROLL_LOCK 70

#define SCAN_HOME 71

#define SCAN_UP 72

#define SCAN_PGUP 73

#define SCAN_NUM_MINUS 74

#define SCAN_LEFT 75

#define SCAN_CENTER 76

#define SCAN_RIGHT 77

#define SCAN_NUM_PLUS 78

#define SCAN_END 79

#define SCAN_DOWN 80

#define SCAN_PGDWN 81

#define SCAN_INS 82

#define SCAN_DEL 83

// ФУНКЦИИ /////////////////////////////////////////////

unsigned char Get_Ascii_Key(void)

{

// Если в буфере клавиатуры есть символ, функция возвращает его

// ASCII-код. Если символа нет, возвращается 0.

if (_bios_keybrd(_KEYBRD_READY)) return(_bios_keybrd(_KEYBRD_READ));

else return(0);

} // конец функции

////////////////////////////////////////////////////////

unsigned int Get_Control_Keys(unsigned int mask)

(

// функция возвращает состояние любой управляющей клавиши

return(mask & _bios_keybrd(_KEYBRD_SHIFTSTATUS));

}//конец функции ////////////////////////////////////////////////////////

unsigned char Get_Scan_Code(void) (

// функция возвращает скан-код нажатой клавиши // используется встроенный ассемблер

_asm{

mov ah, 01h; функция 01h - проверка нажатия клавиши

int 16h; вызов прерывания

jz empty; нет символа - выход

mov ah, 00h; функция 0 - получение скан-кода

int 16h; вызов прерывания

mov al, ah; перемещаем результат из АН в AL

xor ah, ah; обнуляем АН

jmp done; результат возвращается в АХ

empty:

xor ax, ax; обнуляем AX

done:

} //конец ассемблерного блока

} // конец функции

// ОСНОВНАЯ ПРОГРАММА ///////////////////////////////////////

void main(void)

{

unsigned char key;

int done=0;

unsigned int control;

_clearscreen(_GCLEARSCREEN);

while(! done)

{

_settextposition(2, 0);

if ((key = Get_Scan_Code())) printf(" %c %d ", key, key);

// проверка на нажатие Ctrl и Alt

if (Get_Control_Keys(CTRL))

printf(" \ncontrol key pressed");

if (Get_Cbntrol_Keys(ALT))

printf(" \nalt key pressed ");

if (key==16) done=1); // 16 — это скан-код клавиши Q

}// конец цикла while

} // конец функции main

Мышь

Изобретение мыши, безусловно, было событием в компьютерной истории. Появившись в результате исследований в центре Xerox PARK в Калифорнии, она завоевала сердца миллионов пользователей. Мышь позволила наглядно работать с экраном и легко общаться с интересующими объектами. Обычно мышь подсоединяется к последовательному порту компьютера или DIN коннектору на лаптопе. Существующая bus mice требует специальной платы, поэтому не получила широкого распространения (это понятно — мало кто хочет просто так вскрывать свой компьютер для установки одной платы).

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

Вообще-то, написание драйвера мыши — не самое скучное занятие, но мы этого делать не будем. К счастью, Microsoft и другие фирмы написали кучу подобных драйверов. Поэтому мы не станем самостоятельно декодировать мышиные пакеты, а воспользуемся более удобным программным интерфейсом.

Мы будем использовать только минимум функций для определения позиции мыши и статуса кнопок. В таблице 3.3 перечислены эти функции.

Замечание

Микки (mickey) — это самое маленькое расстояние, которое отслеживается мышью. Оно примерно равно 1/200 дюйма.

Таблица 3.3. Функции драйвера мыши.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.