Перейти на главную страницу
05.01. Введение. Общие сведения о клавиатуре
05.02. Основные функции для ввода символов с клавиатуры
05.03. Резюме
05.04. Вопросы и упражнения.
05.05. Г Л О С С А Р И Й
Прямой ввод-вывод «на среднем уровне» позволяет вводить и выводить текстовые символы в файл, на консоль, модем, удалённый терминал. При этом в MS-DOS он организован при помощи механизма прерываний. Для иллюстрации «прямого ввода» будут приведены функции прямого ввода с консоли на языках Ассемблер и Си.
05.01.02. «Эхопечать» символов
05.01.03. Клавиатурный буфер
=== *** === *** ===
Клавиатура – это не просто «доска с клавишами» (дословный перевод английского названия «keyboard»). Помимо механической части (собственно клавиш и контактов) она включает в себя сложную топологию проводников, и даже собственный микропроцессор – контроллер.
Задачи, решаемые этим микропроцессором, следующие:
Существуют так называемые «алфавитно-цифровые» («белые») и «управляющие» («серые») клавиши. Первые генерируют скен-код и ASCII символы. Вторые генерируют только расширенный скен-код, а в поле «ASCII символа» стоит ноль. Благодаря этому программист легко может понять, как обрабатывать код клавиши: выводить ли символ на экран или запускать управляющую последовательность действий.
Более подробно о скэн-кодах клавиш смотри [1, 8, 33].
05.02.02. Консольный ввод в Си
05.02.03. Консольный ввод в Quick Basic
05.02.01.02. Ожидание ввода символа с эхопечатью
05.02.01.03. Получение строки символов
Разница между этими функциями в том, что функция 8 распознаёт специальное сочетание клавиш «Ctrl+Break», а функция 7 игнорирует это сочетание клавиш
В обоих случаях функция возвращает символ в регистр AL. Если AL содержит ASCII 0, то получен расширенный код. Повторите вызов прерывания с теми же параметрами, и в AL появится второй байт расширенного кода.
MOV AH,8 ;номер функции
INT 21H
CMP AL,0 ;проверяем на расширенный код
… ; иначе - обработка символа
;--- анализ расширенного кода
EXT_COD: INT 21H ; берём второй байт кода
CMP AL, 75 ; проверяем на «стрелка влево»
JE CUR_LEFT ; переход к обработчику
CMP AL, 77 ; проверяем на «стрелка вправо»
JE CUR_RIGHT ; переход к обработчику
…
Функция 1 прерывания 21H ожидает ввода символа с клавиатуры, если её буфер пуст, а затем выводит его на экран в текущую позицию курсора. Функция обрабатывает нажатие «Ctrl+Break». Введённый символ сохраняется в регистре AL. Если содержимое AL равно ASCII 0, то для получения расширенного кода повторите прерывание.
Пример использования этой функции аналогичен примеру 05.001.
Функция 1 прерывания 21H полностью игнорирует клавишу «Esc». Клавиши табуляции интерпретируются нормально. Клавиша «Backspace» сдвигает курсор на одну позицию влево, но не стирает символ в этой позиции. Клавиша «Enter» вызывает перемещение курсора на первую позицию строки (нет автоматического переноса на новую строку).
Функция 0AH прерывания 21H позволяет вводить строку длиной до 254 символов, выдавая эхо на терминал. Эта функция продолжает ввод символов до тех пор, пока не нажата клавиша «возврат каретки» («Enter»). DS:DX указывает на строку, куда помещаются вводимые символы. При вводе первый байт этой позиции должен содержать число байтов, отводимой для этой строки. После того, как строка введена, второй байт даёт число реально введённых символов. Сама строка начинается с третьего байта.
Надо отвести достаточно памяти для строки нужной длины, плюс 2 байта для дескриптора строки плюс 1 добавочный байт для символа «Возврат каретки». Код возврата каретки: ASCII 13, – вводится как последний символ строки, но не учитывается в результате, который функция помещает во второй байт дескриптора.
Таким образом, для получения 50 – символьной строки надо отвести минимум 53 байта памяти, и поместить в первый байт памяти строки число ASCII 51. После ввода 50 символов второй байт дескриптора будет содержать ASCII 50, а 53-й байт отведённой памяти будет содержать ASCII 13.
STRING DB 53DUP(?) ; область для 50 символов
; - - - получение строки с клавиатуры
LEA DX, STRING ; DS:DX – адрес строки
MOV BX,DX
MOV AL,51 ; установка длины строки (+1 для CR)
MOV [BX], AL ; посылаем в первый байт дескриптора
MOV AH, 0AH ; номер функции
INT 21H
; - - - получаем в AH длину строки
В этой процедуре можно использовать возможности редактирования строки MS-DOS. Нажатие «Backspace» или «стрелка влево» удаляет символ с экрана без помещения его в память. Работает клавиша табуляции, а расширенные коды игнорируются. Допускаются пустые строки (содержащие только символ ASCII 13). На дисплее при достижении правого края экрана вводимая строка переносится на следующую строку дисплея, а при достижении правого нижнего угла экран сдвигается на строку вверх. Если вводится больше символов, чем отведено для строки, лишние символы игнорируются, и включается гудок динамика.
ФУНКЦИЯ GETCH
ОПИСАНА В:
СИНТАКСИС: int getch();
НАЗНАЧЕНИЕ: Ввод одиночного символа с консольного терминала без эхопечати (без вывода на дисплей).
ФУНКЦИЯ ВОЗВРАЩАЕТ: прочитанный символ.
ПРИМЕЧАНИЕ: функция getch использует входной поток stdin.
ФУНКЦИЯ GETCHE
ОПИСАНА В:
СИНТАКСИС: int getche();
НАЗНАЧЕНИЕ: Функция читает одиночный символ с консольного терминала, с эхопечатью введённого символа на экране с текущей позиции курсора.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Прочитанный символ.
ПРИМЕЧАНИЕ: 1. Нет ошибочных кодов возврата;
2. Функция корректно обрабатывает «Ctrl+Break».
ФУНКЦИЯ CGETS
ОПИСАНА В:
СИНТАКСИС: char *cgets(str);
char *str;
НАЗНАЧЕНИЕ: Функция читает строку символов непосредственно с консоли, и помещает строку и её длину по указателю str. Аргумент str должен быть указателем на массив символов;
ЗАМЕЧАНИЕ: Первый элемент массива str[0] должен содержать максимально допустимую длину считываемой строки. Массив должен иметь достаточную длину, чтобы поместить строку, символ ASCII 0 плюс два байта дополнительно для дескриптора;
cgets читает символы до тех пор, пока не прочитаны символы
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: указатель на начало строки, то есть на адрес элемента str[2];
ПРИМЕЧАНИЕ: 1. Нет кодов ошибок;
2. Длина строки ограничена ~ 250 символами.
В примере 05.003 иллюстрирована работа функции cgets.
/* Определение констант – длины буфера */
#define LETTER_SIZE 50 // Максимальное число символов
#define BUFF_SIZE 55 // Общий размер буфера = LETTER_SIZE+5
/* Объявление переменной буфера */
char *buff[BUFF_SIZE];
char csize; //служебная переменна
/* Подготовительные операции и чтение с клавиатуры в буфер */
csize = BUFF_SIZE - 2; // Истинный размер буфера в символах
buff[0] = csize; // Заносим это значение в буфер;
(void) cgets( buff ); // Читаем с клавиатуры в буфер
if( buff[1] > LETTER_SIZE ) goto ERROR; // Если переполнение буфера, следуем за ссылкой ERROR.
Благодаря механизму дескрипторов (двух первых «служебных» байтов строки-буфера) «переполнения буфера» достичь действительно сложно. MS-DOS просто не допустит чтения большего числа символов, чем это указано в байте buff[0].
ФУНКЦИЯ CSCANF
ОПИСАНА В:
СИНТАКСИС: int cscanf( format {, argument} );
char *format;
НАЗНАЧЕНИЕ: Функция cscanf читает данные с консоли, выполняет форматные преобразования и помещает значения в переменные, адреса которых определяются аргументами функции.
ЗАМЕЧАНИЯ: 1. Функция cscanf использует функцию getche для ввода символов;
2. Каждый аргумент должен указывать на переменную того типа, который соответствует её описанию в строке: «format». См. также описание функции scanf, в приложении №II (06.07) к лекции №06.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
* количество элементов ввода, которые были успешно преобразованы и присвоены;
* значение EOF, если встретился символ – признак конца файла;
* 0, если нет присвоенных областей.
/* Строка формата для ввода целого числа, состоящего из 10 знаков */
const char format[] = "%10d";
int ierr; // переменная ошибки ввода
/* Ввод значения с консоли */
ierr = cscanf( format, &i; );
if( ierr != 1 )goto ERROR; // переход, если ошибка ввода
ФУНКЦИЯ GETPASS
ОПИСАНА В:
СИНТАКСИС: char *getpass( prompt );
char *prompt;
НАЗНАЧЕНИЕ: Функция getpass используется для ввода с консольного терминала пароля, который оператор должен набрать в ответ на выводимое на экран приглашение, задаваемое строкой prompt с завершающим символом "\0". При вводе пароля отключается эхопечать вводимых с терминала символов.
ЗАМЕЧАНИЕ: длина пароля составляет не более 8 символов.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: указатель на строку с завершающим нулём, содержащую не более восьми первых символов текста.
ПРИМЕЧАНИЕ: Пароль хранится в статическом буфере (символьном массиве) функции и переписывается при каждом обращении к ней.
ФУНКЦИЯ INKEY$
СИНТАКСИС: INKEY$
НАЗНАЧЕНИЕ: Функция для ввода символов с клавиатуры без эхопечати.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
REM ПРИМЕР ИСПОЛЬЗОВАНИЯ ФУНКЦИИ INKEY$
REM ОЖИДАЕМ НАЖАТИЯ КЛАВИШИ
100 C$ = INKEY$
IF C$ = "" GOTO 100
REM ПРОВЕРЯЕМ, НАЖАТА ЛИ «СЕРАЯ» КЛАВИША
IF LEN( C$ ) = 2 GOSUB 2000
…
REM "КОНСТРУКЦИЯ" ДЛЯ ОБРАБОТКИ СКЕН КОДОВ
REM ПРЕОБРАЗУЕМ КОД В ЧИСЛО
C = ASC( C$)
REM НАЖАТА КЛАВИША "СТРЕЛКА ВЛЕВО"
IF C = 75 THEN GOSUB 3000
REM НАЖАТА КЛАВИША "СТРЕЛКА ВПРАВО"
IF C = 77 THEN GOSUB 3100
…
ОПЕРАТОР INPUT
НАЗНАЧЕНИЕ: Оператор для форматированного ввода с клавиатуры с эхопечатью. Оператор автоматически переводит текст, набранный на клавиатуре, в формат, соответствующий формату вводимой переменной. Поддерживаются форматы:
1. Ввод символов завершается нажатием клавиши «Enter»; код ASCII 13 не добавляется в конец строки;
2. До нажатия этой клавиши текст можно редактировать средствами редактирования строки DOS;
3. Оператор «не воспринимает» «серые клавиши» на клавиатуре. Реакция на такое нажатие зависит от реализации Бейсика.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
Приведём пример ввода строки символов с консоли:
REM ПРИМЕР ИСПОЛЬЗОВАНИЯ ФУНКЦИИ INPUT
REM ВЫВОДИМ ПОДСКАЗКУ И ВВОДИМ СТРОКУ
PRINT "Введите своё имя: ";
INPUT NAME$
PRINT "Рад познакомиться с Вами, "; NAME$
STOP
END
Однако на практике чаще используется потоковый ввод-вывод. Именно его мы и рассмотрим в следующем разделе.
Описание же скен-кодов клавиш клавиатуры и их обработки выходит за рамки данного курса.
2. Клавиатура — это совокупность клавиш и контактов, предназначенная для ввода символов;
+3. Клавиатура — это совокупность клавиш, контактов, топологии проводников и контроллера, предназначенная для ввода символов в ЭВМ или другое устройство;
+2. Реагирование на нажатие клавиш и выдача соответственного скэн-кода;
+3. Реагирование на нажатие комбинации клавиш и выдача соответственного скэн-кода;
+4. Обработка длительного нажатия на клавишу;
+5. Запись сгенерированного символа и скэн-кода в кольцевой буфер клавиатуры;
+2. Серые;
3. Чёрные;
4. Фиолетовые;
+2. Белые клавиши служат для ввода, а серые — для управления ввода символов с клавиатуры;
+3. Белые клавиши генерируют только ASCII символы, а серые — только скэн-коды (значение ASCII символов в них всегда «0»).
2. Это отображение на экране дисплея скен-кодов символов, набранных с клавиатуры;
3. Это произношение слов, набранных с клавиатуры;
+2. При вводе символов пароля на клавиатуре;
+3. При обработке нажатия управляющих клавиш по их скэн-кодам;
+2. FIFO (первым пришёл — первым считан);
3. Random (произвольный доступ);
+2. 15 слов;
3. 15 скен-кодов;
+4. 30 байт;
+2. 7;
4. 9;
2. Функция 8 выдаёт символы с эхопечатью;
+3. Функция 8 распознаёт специальное сочетание клавиш «Ctrl+Break»;
2. 7;
4. 9;
2. Вертикальная табуляция;
+3. Возврат каретки;
+4. Забой;
2. 7;
4. 9;
2. 1 слово;
+3. 254 байта;
4. 256 байт;
5. 2000 байт;
6. 65535 байт;
2. Перевод строки;
3. ASCII0;
4. Горизонтальная табуляция;
+2. getch;
+3. getche;
4. getc;
6. sscanf;
2. getch;
3. getche;
4. getc;
6. sscanf;
2. getch;
3. getche;
4. getc;
6. sscanf;
2. INPUT;
3. LINE INPUT;
+2. INPUT;
3. LINE INPUT;
2. ASCII 13;
3. ASCII 11;
+4. Как правило, ASCII 0, если не было переполнения строки;
«на среднем уровне» позволяет вводить и выводить текстовые символы в файл, на консоль, модем, удалённый терминал. При этом в ms-dos он организован при помощи механизма прерываний
10 10 2014
1 стр.
Одновременно возникают прерывания гибкого диска, жесткого и клавиатуры. Определить порядок их обслуживания?
10 10 2014
1 стр.
Цель работы: Знакомство с основными навыками работы в электронных таблицах: ввод данных в ячейки таблицы, форматирование ячеек таблицы, ввод простых формул, создание обрамления, ре
14 12 2014
4 стр.
Также, какие корни у современной клавиатуры. Также рассказывается, чем клавиатура Thinkgeek отличается от обычных клавиатур. А также узнаем принцип работы клавиатуры
10 10 2014
1 стр.
Охватывает все стороны жизни индивида. – «Германия – превыше всего!»
26 09 2014
8 стр.
«работа» и νόμος — «закон» — в традиционном понимании — наука о приспособлении должностных обязанностей, рабочих мест, оборудования и компьютерных программ для наиболее безопасного
25 12 2014
1 стр.
Диагностика (греч diagnosticos- способный распознавать) – раздел клинической медицины, изучающей содержание, методы и последовательные ступени процеса распознавания болезней или ос
27 09 2014
1 стр.
Наука или учение о тканях. В последнее 10-летие содержание гистологии переросло такого узкого понимания и включает в себя изучение закономерностей микроскопического развития, строе
14 12 2014
1 стр.