- •Введение
- •1. Цель лабораторного курса
- •2. Организация и проведение лабораторных работ
- •4. Порядок выполнения работы
- •4. Порядок выполнения работы
- •5. Особенности программирования
- •6. Индивидуальные задания
- •5. Особенности программирования
- •5. Особенности программирования
- •6. Индивидуальные задания
- •4. Порядок выполнения
- •5. Особенности программирования
- •4. Порядок выполнения
- •5. Особенности программирования
- •4. Порядок выполнения
- •5.Особенности программирования.
- •4. Порядок выполнения
- •5.Особенности программирования
- •6. Индивидуальные задания
- •7.Содержание отчета
- •Литература
5. Особенности программирования
5.1. На языке Турбо-Паскаль.
5.1.1. Для чтения данных из порта и записи данных в порт ис-
пользуйте предопределенный массив Port. Например, для чтения из
порта 64H применяется выражение b:=Port[$64], а для записи в порт
60H - выражение Port[$60]:=b, где b - переменная типа byte.
5.2. На языке Турбо-Си.
5.2.1. Для обращения к портам ПЭВМ применяются функции чтения
и записи порта,которые хранятся в библиотеке < dos.h>. Библиотека
подключается директивой
#include < dos.h>
после чего, например, для записи значения b в порт 60H ис-
пользуется выражение:
outportb(0x60,b);
Для чтения из порта 64H используется выражение:
b=intportb(0x64);
где:b- переменная типа char.
6. Индивидуальные задания
6.1. Индивидуальные задание выбрать в соответствии с таблицей 3:
Таблица 3
───────────────────────────────────────────────
Номер Период задержка Наименование
в журнале автоповтора автоповтора светодиода
───────────────────────────────────────────────
1 30.0 250 NumLock
2 26.7 750 CapsaLock
3 24.0 1000 ScrollLock
4 20.0 250 NumLock
5 2.0 750 CapsaLock
6 3.0 1000 ScrollLock
7 30.0 1000 ScrollLock
8 26.7 250 NumLock
9 24.0 250 CapsaLock
10 2.0 1000 ScrollLock
11 3.0 250 NumLock
12 4.0 750 CapsaLock
13 5.0 1000 ScrollLock
14 20.0 250 NumLock
15 30.0 750 CapsaLock
16 26.7 1000 ScrollLock
───────────────────────────────────────────────
7. Содержание отчета
7.1. Тема лабораторной работы.
7.2. Цель работы.
7.3. Индивидуальное задание.
7.4. Текст программы.
7.5. Результаты работы программы.
Лабораторная работа 5 БУФЕР КЛАВИАТУРЫ ПЭВМ
1. Цель работы
Изучение организации буфера клавиатуры и приобретение практи-
ческих навыков определения хранящихся в буфере ASCII и скан-кодов
клавиш клавиатуры
2. Темы для предварительной проработки
2.1. Организация буфера клавиатуры.
2.2. Формирование ASCII кодов.
3. Описание работы
Записанная в ПЗУ BIOS подпрограмма обработки прерывания 09H,
вызванного процессором клавиатуры при нажатии (отжатии) клавиши,
читает скан-код из порта 60H и, если это скан-код клавиши-переклю-
чателя (правый Shift, левый Shift, Ctrl, Alt, ScrollLock, NumLock,
CapsLock и Insert), то изменяется содержимое ячеек памяти
0040:0017H и 0040:0018H, хранящих состояния клавиш-переключате-
лей. В буфер клавиатуры при этом ничего не пишется (исключение
составляет клавиша Insert). В таблице 1 приведен формат байта по
адресу 0040:0017H, а в таблице 2 - по адресу 0040:0018H.
Таблица 1
Формат байта по адресу 0040:0017H
──────────────────────────────────────
Бит Значение, когда бит=1
──────────────────────────────────────
0 нажата клавиша правый Shift
1 нажата клавиша левый Shift
2 нажата клавиша Ctrl
3 нажата клавиша Alt
4 режим ScrollLock включен
5 режим NumLock включен
6 режим CapsLock включен
7 режим вставки включен
────────────────────────────────────────
Таблица 2
Формат байта по адресу 0040:0018H.
───────────────────────────────────────────────
Бит Значение, когда бит=1
───────────────────────────────────────────────
0 нажаты клавиши левый Shift вместе с Ctrl
1 нажаты клавиши левый Shift вмести с Alt
2 нажата клавиша SysReq
3 нажаты клавиши Ctrl вместе с NumLock
4 режим ScrollLock включен
5 режим NumLock включен
6 режим CapsLock включен
7 режим вставки включен
───────────────────────────────────────────────
Состояния клавиш-переключателей могут быть изменены программно.
Если же это скан-код клавиши, не являющейся переключателем, то
в соответствии с ее скан-кодом и состоянием клавиш-переключателей
формируется или однобайтный ASCII код данной клавиши, который вмес-
те со скан-кодом записывается в буфер клавиатуры, или двубайтный
расширенный код, первым байтом которого является 0, а второй байт в
большинстве случаев совпадает со скан-кодом. Эти два байта также
записываются в буфер клавиатуры. При отжатии клавиши в буфер ничего
не записывается и изменяется только состояние клавиш-переключате-
лей.
Программа обработки прерывания 09H отслеживает также некоторые
комбинации клавиш. В табл.3 приведены эти комбинации и действия,
выполняемые обработчиком прерывания при их обнаружении:
Таблица 3
Функции клавиш
───────────────────────────────────────────────
Комбинация клавиш Выполняемые действия
───────────────────────────────────────────────
Ctrl-Alt-Del Сброс и перегрузка системы
Ctrl-NumLock Перевод машины в состояние ожидания
Shift-PrtSc Распечатка на принтере содержимого экрана
(обработка прерывания 05H)
Ctrl-Break Завершение выполнения программы
───────────────────────────────────────────────
Структура буфера клавиатуры изображена на рис.1. Буфер
клавиатуры расположен по адресам 0040:001H - 0040:003cH опера-
тивной памяти и позволяет накапливать данные (ASCII и скан-коды) о
15 нажатиях клавиш (на месте, предшедствующем началу строки симво-
лов в буфере хранятся ASCII код возврата каретки (ASCII 13) и скан
-код клавиши "Enter").
В ячейке 0040:001aH (указатель начала) хранится адрес перво-
го введенного символа, а в ячейке 0040:001cH (указатель хвоста) -
адрес первой свободной ячейки после последнего введенного символа.
Адреса хранятся в виде байта смещения (второй байт ячейки не ис-
пользуется). Если буфер пуст, то содержимое указателя начала сов-
падает с содержимым указателя хвоста.
15 0
┌──────────────┐
0040:003с │ │
├──────────────┤
3a │ │ Содержимое ячейки буфера
├──────────────┤
38 │ │ 15 8 7 0
├──────────────┤ ┌────────────┬────────────┐
36 │ │ │ скан-код │ ASCII │
├──────────────┤ └────────────┴────────────┘
34 │ "R" │
├──────────────┤ если ASCII код равен 0, то
32 │ "E" │ вместо скан-кода указывается
├──────────────┤ номер расширенного кода
30 │ "F" │ (в большинстве случаев сов-
├──────────────┤ падающего со скан-кодом)
2e │ "F" │
├──────────────┤
2c │ "U" │
├──────────────┤
2a │ "B" │
├──────────────┤
28 │ │
├──────────────┤
26 │ │
├──────────────┤
24 │ │
├──────────────┤
22 │ │
├──────────────┤
20 │ │
├──────────────┤
1e │ │
├──────────────┤
1c │ 36 │ Указатель хвоста
├──────────────┤
0040:001a │ 2a │ Указатель начала
└──────────────┘
Рис.1
Запись в буфер осуществляется по адресу указателя хвоста, при
этом содержимое указателя увеличивается на 2. Чтение из буфера
производится по адресу указателя начала, при этом содержимое ука-
зателя также увеличивается на 2 (если указатель содержит адрес
последней ячейки буфера - 3cH, то вместо увеличения на 2 в него
необходимо записать адрес начала буфера - 1H).