Сделай Сам Свою Работу на 5

Клавиатурные функции библиотеки Mocrosoft C

Стандартные библиотеки трансляторов Mocrosoft Quick и C 6.0 содержат набор функций, предназначенных для работы с клавиатурой. Эти функции повторяют и немного дополняют возможмости функций MS-DOS и BIOS, обслуживающих клавиатуру.

Самые простые из них - getch() и getche(). Они списаны в файле conio.h.

Функция getch() имеет следующий прототип: int getch(void);

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

Функция обрабатывает клавиши Ctrl-C и Ctrl-Break- при вводе этих комбинаций клавиш работа программы завершается.

Если клавиатурный буфер пуст, программа переводится в состояние ожидания.

Функция getche() полностью аналогична функции getch(), за исключением того, что прочитанный символ отображается на экране. Приведем прототип функции getche(): int getche(void);

Приведем пример программы отображающей на экране ASCII-коды и расширенный ASCII-коды нажимаемых клавиш.

 

#include <conio.h>

#include <ctype.h>

#include <stdio.h>

void main() {

int key;

//Читаем в цикле символы с клавиатуры и отображаем

//ASCII- коды нажатых клавиш.

//Выходим из цикла при нажатии на клавишу ESC

for(;;) {

//Читаем символ

key=getch();

//Если прочитанный символ равен 0, вызываем функцию getch()

//для получения расширенного ASCII-кода нажатой клавиши

if ((key == 0) || (key == 0xe0)) {

key=getch();

printf( "pасширенный ASCII-код:\t" ); }

else printf( "ASCII-код:\t" );

printf( "%d/n",key );

//При нажатии на клавишу ESC выходим из цикла

if (key == 27) break; }}

 

Для проверки буфера клавиатуры на наличие символов можно использовать функцию kbhit(). Она описана в файле conio.h: int kbhit(void);

Если буфер клавиатуры не пуст, функция возвращает не нулевое значение. В этом случае программа может прочитать символы из буфера клавиатуры при помощи функции getch() и getche(). Если буфер пуст, функция возвращает нулевое значение.

Приведем пример программы, ожидающей нажатия на любую клавишу. Во время ожидания программа выводит на экран поочередно символы '<' и '>':



 

#include <conio.h>

void main() {

int key;

//Ожидаем нажатия на любую клавишу.

//Во время ожидания выводим на экран поочередно

//символы '<' и '>'

while(!kbhit()) printf("<\b>\b");

//Как только будет нажата какая-нибудь клавиша,

//выводим ее ASCII-код

key=getch();

//Если прочитанный символ равен 0, вызываем функцию getch()

//для получения расширенного ASCII-кода нажатой клавиши

if ((key == 0) || (key == 0xe0)) {

key=getch();

printf( "Расширенный ASCII-код:\t" ); }

else printf( "ASCII-код:\t" );

printf( "%d/n",key );}

 

Для ввода с клавиатуры строки символов можно использовать функцию cgets(), работающую аналогично функции 0Ah прерывания MS-DOS INT 21h: char *cgets(char *buffer);

Функция описана в файле conio.h. Перед вызовом аргумент функции buffer должен указывать на массив, размер которого должен быть достаточным для хранения вводимой строки, завершающего строку нулевого байта и двух дополнительных байтов. Первый элемент массива buffer[0] должен содержать максимальную длину вводимой строки – как и для функции 0Ah прерывания MS-DOS INT 21h.

После завершения ввода второй элемент массива buffer[1] будет содержать длину введенной строки, сама строка будет завершаться символами новой строки NL, перевода строки LF и нулем.

Функция cgets() возвращает указатель на начало введенной строки в буфере, т.е. на третий элемент массива buffer[2].

Приведем простой пример, в котором функция cgets() используется для ввода целого числа:

 

#include <stdio.h>

#include <string.h>

#include <conio.h>

#define MAX 80

char buf[MAX];

void main() {

int i;

char *bufptr;

//Устанавливаем максимально допустимкю длину строки

buf[0] = MAX + 2

printf("\nВведите целое число:");

//Вводим число, можно использовать клавиши редактирования

bufptr = cgets(buf);

//Преобразуем введенное число к формату int

//и вводим его

i = atoi(bufptr);

printf("\n Вы ввели число %d",i);}

 

Существует и более удобная для использования функция, позволяющая вводить строку с клавиатуры, а точнее, из стандартного потока ввода. Это функция gets():

char *gets(char *buffer);

Функция gets() описана в файле stdio.h.

Эта функция читает строку из стандартного потока ввода stdin и запоминает ее в буфере buffer. Символ новой строки '\n' в конце введенной строки функция заменяет на ноль.

После завершения ввода функция возвращает указатель на заполненный буфер или NULL в случае ошибки или условия "Конец файла".

Обратите внимание на отличие между функциями cgets() и gets():

– Функция cgets() позволяет редактировать вводимую строку символов, функция gets() просто записывает в буфер все символы подряд ( в том числе и коды клавиш редактирования).

– Программе, использующей для ввода с клавиатуры функцию cgets(), недоступны средства переназначения ввода операционной системы. Если же программа использует функцию gets(), читающую строку из стандартного потока ввода, можно использовать средства переназначения.

– Перед вызовом функции cgets() необходимо специальным образом подготовить буфер для вводимой строки (записать в первый байт буфера длину вводимой строки). Функция gets() не требует никакой подготовки буфера.

 

Еще одна полезная функция, которую можно использовать для ввода с клавиатуры, - scanf(). Эта функция подробно описана во всех книгах по языку программирования Си, поэтому мы не будем ее подробно рассматривать. Отметим только, что с помощью этой функции можно организовать ввод чисел в заданном формате. Однако можно сначала ввести строку при помощи функций cgets() или gets(), а уже потом выполнять все необходимые проверки и преобразования этой строки.

ДЛЯ ЗАМЕТОК

 

КЛАВИАТУРА IBM PC

 

УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ

для специальности “Программное и аппаратное обеспечение вычислительной техники и сетей”

ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ФАКУЛЬТЕТ ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ       КЛАВИАТУРА IBM PC УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ     Волгоград


 

           
 
  ББК     Автор:     Рецензент:   Клавиатура. Учебно-методическое пособие для специальности “Программное и аппаратное обеспечение вычислительной техники и сетей”.   В пособии излагаются принципы работы клавиатуры и возможные способы взаимодействия с ней. Вследствие дороговизны и неполноты раскрытия специальной литературы автором данного учебно-методического пособия была предпринята попытка полного описания этой темы.   Учебное пособие предназначено для студентов технических специальностей, изучающих компьютеры и их программное обеспечение. Оно также может быть полезно преподавателям и учебно-вспомогательному персоналу при постановке лабораторных работ по специальным дисциплинам.   Рекомендовано к опубликованию редакционным и методическим советами Костанайского государственного университета им. А.Байтурсынова.  
 
    КЛАВИАТУРА IBM PC   УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ для специальности “Программное и аппаратное обеспечение вычислительной техники и сетей”
 
   

               
 
–(записать в первый байт буфера длину вводимой строки). Функция gets() не требует никакой подготовки буфера.   Еще одна полезная функция, которую можно использовать для ввода с клавиатуры, - scanf(). Эта функция подробно описана во всех книгах по языку программирования Си, поэтому мы не будем ее подробно рассматривать. Отметим только, что с помощью этой функции можно организовать ввод чисел в заданном формате. Однако можно сначала ввести строку при помощи функций cgets() или gets(), а уже потом выполнять все необходимые проверки и преобразования этой строки. ДЛЯ ЗАМЕТОК  
 
  СОДЕРЖАНИЕ ВВЕДЕНИЕ 1. АППАРАТНОЕ ПРЕРЫВАНИЕ КЛАВИАТУРЫ 2. СРЕДСТВА BIOS ДЛЯ РАБОТЫ С КЛАВИАТУРОЙ 2.1. ЧТЕНИЕ СИМВОЛА С ОЖИДАНИЕМ 2.2. ПРОВЕРКА БУФЕРА НА НАЛИЧИЕ В НЕМ СИМВОЛА 2.3. УСТАНОВКА ВРЕМЕННЫХ ХАРАКТЕРИСТИК КЛАВИАТУРЫ 2.4. ЗАПИСЬ СИМВОЛОВ В БУФЕР КЛАВИАТУРЫ 2.5. ЧТЕНИЕ СИМВОЛА С ОЖИДАНИЕМ ДЛЯ 101-КЛАВИШНОЙ КЛАВИАТУРЫ 2.6. ПРОВЕРКА БУФЕРА НА НАЛИЧИЕ В НЕМ СИМВОЛОВ ДЛЯ 101-КЛАВИШНОЙ КЛАВИАТУРЫ 2.7. ПОЛУЧЕНИЕ СОСТОЯНИЯ ПЕРЕКЛЮЧАЮЩИХ КЛАВИШ ДЛЯ 101-КЛАВИШИ КЛАВИАТУРЫ 3. СРЕДСТВА MS-DOS ДЛЯ РАБОТЫ С КЛАВИАТУРОЙ 3.1. БУФЕРИЗОВАННЫЙ ВВОД С ЭХО-ВЫВОДОМ 3.2. БУФЕРИЗОВАННЫЙ ВВОД БЕЗ ЭХО-ВЫВОДА 3.3. НЕ ФИЛЬТРОВАННЫЙ ВВОД БЕЗ ЭХО-ВЫВОДА 3.4. ВВОД/ВЫВОД НА КОНСОЛЬ 3.5. ВВОД СТРОКИ СИМВОЛОВ 3.6. ПРОВЕРКА СОСТОЯНИЯ СТАНДАРТНОГО ВВОДА 3.7. СБРОС БУФЕРА КЛАВИАТУРЫ 4. КЛАВИАТУРНЫЕ ФУНКЦИИ БИБЛИОТЕКИ MICROSOFT C.
 
   
 

               
 

ВВЕДЕНИЕ

 

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

 

Система ASCII

Клавиатуры многих микропроцессорных систем соединяются с ЭВМ посредством микросхемы, называемой шифратором, которая преобразует каждый удар по клавише в 8-битовый ASCII-код. Система ASCII представляет собой набор числовых кодов, используемых ЭВМ для обмена данными. Как показано в таблице 1, набор символов ASCII представлен 128 кодами (от 00h до 7fh). Чтобы отыскать ASCII-код данного символа, надо к старшей цифре, указанной в верхней строке, приписать младшую цифру из крайней левой колонки. Например, латинской букве A соответствует старшая цифра 4, а младшая – 1, так что кодом этой буквы служит 41h.

 

  Старшие разряды
Младшие разряды  
NUL DLE SP @ P   p
SOH DC1 ! A Q a q
STX DC2 B R b r
ETX DC3 # C S c s
EOT DC4 $ D T d t
ENQ NAK % E U e u
ACK SYN & F V f v
BEL ETB , G W g w
BS CAN ( H X h x
 
 
#include <conio.h> #define MAX 80 char buf[MAX]; void main() { int i; char *bufptr; //Устанавливаем максимально допустимкю длину строки buf[0] = MAX + 2 printf("\nВведите целое число:"); //Вводим число, можно использовать клавиши редактирования bufptr = cgets(buf); //Преобразуем введенное число к формату int //и вводим его i = atoi(bufptr); printf("\n Вы ввели число %d",i);}   Существует и более удобная для использования функция, позволяющая вводить строку с клавиатуры, а точнее, из стандартного потока ввода. Это функция gets(): char *gets(char *buffer); Функция gets() описана в файле stdio.h. Эта функция читает строку из стандартного потока ввода stdin и запоминает ее в буфере buffer. Символ новой строки '\n' в конце введенной строки функция заменяет на ноль. После завершения ввода функция возвращает указатель на заполненный буфер или NULL в случае ошибки или условия "Конец файла". Обратите внимание на отличие между функциями cgets() и gets(): – Функция cgets() позволяет редактировать вводимую строку символов, функция gets() просто записывает в буфер все символы подряд ( в том числе и коды клавиш редактирования). – Программе, использующей для ввода с клавиатуры функцию cgets(), недоступны средства переназначения ввода операционной системы. Если же программа использует функцию gets(), читающую строку из стандартного потока ввода, можно использовать средства переназначения. Перед вызовом функции cgets() необходимо специальным образом подготовить буфер для вводимой строки
 
   
 

               
 
экран поочередно символы '<' и '>':   #include <conio.h> void main() { int key; //Ожидаем нажатия на любую клавишу. //Во время ожидания выводим на экран поочередно //символы '<' и '>' while(!kbhit()) printf("<\b>\b"); //Как только будет нажата какая-нибудь клавиша, //выводим ее ASCII-код key=getch(); //Если прочитанный символ равен 0, вызываем функцию getch() //для получения расширенного ASCII-кода нажатой клавиши if ((key == 0) || (key == 0xe0)) { key=getch(); printf( "Расширенный ASCII-код:\t" ); } else printf( "ASCII-код:\t" ); printf( "%d/n",key );}   Для ввода с клавиатуры строки символов можно использовать функцию cgets(), работающую аналогично функции 0Ah прерывания MS-DOS INT 21h: char *cgets(char *buffer); Функция описана в файле conio.h. Перед вызовом аргумент функции buffer должен указывать на массив, размер которого должен быть достаточным для хранения вводимой строки, завершающего строку нулевого байта и двух дополнительных байтов. Первый элемент массива buffer[0] должен содержать максимальную длину вводимой строки – как и для функции 0Ah прерывания MS-DOS INT 21h. После завершения ввода второй элемент массива buffer[1] будет содержать длину введенной строки, сама строка будет завершаться символами новой строки NL, перевода строки LF и нулем. Функция cgets() возвращает указатель на начало введенной строки в буфере, т.е. на третий элемент массива buffer[2]. Приведем простой пример, в котором функция cgets() используется для ввода целого числа:   #include <stdio.h> #include <string.h>
 
HT EM ) I Y i y
A LF SUB * : J Z j z
B VT ESC + ; K [ k {
C FF FS , < L \ l |
D CR GS - = M ] m }
E SO RS . > N   n ~
F SI US / ? O - o DEL

Таблица 1.

 

Обратите внимание, что наряду с обычными буквами, цифрами и знаками набор символов ASCII содержит управляющие символы, например символ возврата каретки CR (Carriage Return), прогона страницы FF (Form Feed), перехода на следующую строку LF (Line Feed). К ним принадлежат некоторые символы используемые в коммуникационных протоколах, например символ подтверждения приема ACK (Acknowlege), в начале текста STX (Start of Text) и конца передачи EOT (End of Transmisson). Однако если Вы тщательно изучите таблицу 1 (откровенно говоря, это не слишком увлекательное занятие), то увидите, что в нее не включены специальные клавиши IBM PC. Например, Вы не найдете в таблице 1 кодов функциональных клавиш или клавиши фиксирования цифрового регистра. Идентификация таких клавиш представляла особую задачу для разработчиков клавиатуры фирмы IBM, и они нашли довольно интересное решение, на котором стоит остановится подробнее.

 



©2015- 2019 stydopedia.ru Все материалы защищены законодательством РФ.