Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LRP1

.pdf
Скачиваний:
16
Добавлен:
02.02.2015
Размер:
453 Кб
Скачать
☆

деленных значений в SP или SS на входе или изменяют значения SP или SS на выходе, не могут быть выполнены с помощью этой процедуры.

5.1.4. Собственная процедура обработки прерываний имеет следующий вид:

procedure NewIntr(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP : Word); Interrupt;

begin

...

end.

Примечание:

-имя процедуры задается пользователем; -любое число параметров (в том числе и все) в процедуре можно

опускать, но только подряд начиная с начала.

Вызов пользовательской процедуры обработки прерывания осуществляется с помощью процедуры Intr (см. п. 5.1.2). Предварительно адрес процедуры пользователя должен быть занесен в таблицу векторов прерывания в соответствии с выбранным номером прерывания либо путем прямой записи (см. п. 5.1.1), либо с помощью процедуры SetIntVec (см. п. 5.1.5), а адрес системной процедуры обработки данного прерывания сохранен либо в переменной (см. п. 5.1.1), либо

спомощью процедуры GetIntVec (см. п. 5.1.4).

5.1.5.Процедура GetIntVec возвращает адрес заданного вектора прерывания и имеет следующий вид:

GetIntVec(IntNo:byte; var Vector:pointer),

где:IntNo задает номер прерывания (0...255) и адрес возвращается в параметре Vector).

5.1.6. Процедура SetIntVec устанавливает заданный вектор прерывания по заданному адресу и имеет следующий вид:

SetIntVec(IntNo:byte; Vector:pointer),

где:IntNo задает номер прерывания (0...255) и Vector задает адрес (при задании адреса можно воспользоваться оператором @ или функцией Addr).

31

5.1.7. Чтобы сделать программу резидентной, т.е. такой, которая постояно находилась бы в оперативной памяти (все программы обработки прерывания должны быть такие), необходимо использовать в конце программы процедуру Keep(0), которая завершает программу и оставляет ее в памяти (параметр в процедуре указывает значение кода возврата).

Поскольку программа остается в памяти, включая сегмент данных, сегмент стека и "кучу", необходимо перед программой указать директиву компилятора, минимизирующую резидентную область памяти:

{$m $800,0,0}.

5.2. На языке Турбо-Си.

5.2.1. Для чтения вектора прерывания и для изменения таблицы векторов прерываний используйте дальние указатели(сhar far *). Например, для установки указателей на вектора 9 и 60 можно применить выражение

char far * adr_p,int9_p; adr_p= (char far *)(4*9); int9_p= (char far *)(4*60);

а для записи адреса обработчика 9 прерываний в 60-й вектор прерываний -

*int9_p=* adr_p;

5.2.2.Для вызова программ обработки заданного прерывания используется процедура geninterrupt(IntNo),

где:IntNo - номер прерывания (0...255).

Надо указать в программе подключение библиотеки директивой

#include <dos.h>

5.2.3. Собственная процедура обработки прерываний должна быть обработана специальным модификатором Турбо-Си interrupt,который автоматически сохраняет значения всех регистров и восстанавливает их перед возвратом управления вызывающей программе.При этом используется для возврата управления команда IRET вместо обычной команды

RET.

Собственная процедура обработки прерываний должна быть описана как:

void interrupt New_intr(); 32

Тогда при вызове автоматически определяется ее начальный адрес, которому присваивается значение указателя

*adr_p=(char far *)New_intr;

5.2.4.Чтобы сделать программу резидентной, т.е. такой, которая постояно находилась бы в оперативной памяти (все программы обработки прерывания должны быть такие), необходимо использовать в конце программы функцию 31H прерывания 21H,кототорая завершает программу

иоставляет ее в памяти резидентной.

union REGS in,out;

in.h.ah=0x31;/*задание 31H функции завершить и оставить резидентной в регистер ah*/

in.h.al=0;/*код возврата*/

in.x.dx=size;/*обьем выделенной памяти в 16_байтных параграфах */ int86(0x21,&in,&out);/*обрашение к 21 прерыванию с параметрами*/

6.Индивидуальные задания

6.1.Осуществить коррекцию прерывания Int 9 (от клавиатуры) так, чтобы:

а) выполнялись все действия системного обработчика данного прерывания;

б) при нажатии одной из клавиш-переключателей вывести на экран название этой клавиши.

6.2.Клавишу-переключатель выбрать по следующему правилу:

нк := нс mod 8,

где:нк - номер клавиши-переключателя в табл. 1; нс - номер студента в журнале.

7.Содержание отчета

7.1.Тема лабораторной работы.

7.2.Цель работы.

7.3.Порядок выполнения.

7.4.Индивидуальное задание.

7.5.Текст программы.

7.6.Результаты работы программы.

7.7.Выводы.

33

Лабораторная работа 4

ОРГАНИЗАЦИЯ РАБОТЫ КЛАВИАТУРЫ ПЭВМ

1. Цель работы

Изучение организации и принципов работы клавиатуры и приобретение практических навыков управления микропроцессором клавиатуры.

2.Темы для предварительной проработки

2.1.Организация и принцип работы клавиатуры ПЭВМ.

3.Описание работы

3.1.Принципы работы клавиатуры. На рис. 1 представлена упрощенная схема клавиатуры.

┌───┬───┬──── +5B

Переключатели клавиатуры

 

 

 

 

│

│

│

│ │ │

┌──┬────┬──┐

─────┼────────┼────────┼────┴───┴───┴────┤X0│CPU │

│

─────┼────────┼────────┼─────────────────┤X1│

│

│

─────┼────────┼────────┼─────────────────┤X2│

│

│

│

│

│

. . .

│X3│

│

│

│

│

│

 

│..│

│Z

├──────>

│

│

│

 

│ │

│

│К систем-

│

│

│

 

├──┤

│

│ному бло-

─────┼────────┼────────┴─────────────────┤Y0│

│

│ ку ПЭВМ

─────┼────────┴──────────────────────────┤Y1│

│

│

─────┴───────────────────────────────────┤Y2│

│

│

 

 

 

 

│Y3│

│

│

 

 

 

 

│..│

│

│

 

 

 

 

└──┴────┴──┘

Рис.1. Схема клавиатуры

В качестве контроллера клавиатуры используется специализированный микропроцессор Intel 8042, имеющий два порта - входной и выход-

34

ной. Входной порт (X) подключен к горизонтальным линиям матрицы, а выходной (Y) - к вертикальным. Все горизонтальные линии подключены также через резисторы к источнику питания +5B.

Устанавливая по очереди на каждой из вертикальных линий уровень напряжения, соответствующий логическому нулю, клавиатурный контроллер опрашивает состояние горизонтальных линий. Если нажатых клавиш нет, уровень напряжения на всех горизонтальных линиях соответствует логической 1 (т. к. все эти линии подключены к источнику питания +5B через резисторы).

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

Как только на одной из горизонтальных линий появится уровень логического нуля, клавиатурный процессор фиксирует нажатие на клавишу. Он посылает в центральный процессор запрос на прерывание (Int 09H) и восьмиразрядный номер клавиши в матрице записывает в порт 60H. Аналогичные действия выполняются, когда оператор отпускает нажатую ранее клавишу.

Номер клавиши, посылаемый клавиатурным процессором, однозначно связан с распайкой клавиатурной матрицы и не зависит напрямую от обозначений, нанесенных на поверхность клавиш. Этот номер называется скан-кодом (Scan Code). Отметим, что скан-код отжатой клавиши отличается от скан-кода нажатой клавиши единицей в старшем бите (т.е. больше на 128).

Слово scan ("сканирование") подчеркивает, что клавиатурный процессор сканирует клавиатуру для поиска нажатой клавиши.

Если нажать на клавишу и не отпускать ее, клавиатура перейдет в режим автоповтора. В этом режиме в центральный процессор автоматически через некоторый промежуток времени, называемый периодом авповтора, посылается код нажатой клавиши.

3.2. Порты для работы с клавиатурой.

Для работы с клавиатурой ПЭВМ типа XT и AT использует порты с адресами 60H и 61H.

Порт 60H при чтении содержит скан-код последней нажатой клавиши. Он также участвует в управлении клавиатурного процессора.

Порт 61H управляет не только клавиатурой, но и другии устройствама компьютера, например, работой встроенного динамика. Этот порт доступен как для чтения, так и для записи. Если старший бит порта равен 1, то клавиатура будет заблокирована, если 0 - разбло-

35

кирована. Нужно отметить, что поскольку порт 61H управляет не только клавиатурой, то при сбросе старшего бита необходимо остальные разряды порта оставить без изменения.

3.3. Команды контроллера клавиатуры.

Процессор 8042 обслуживает не только клавиатуру, но и другие системы компьютера (например, с его помощью выполняется возврат процессора 80286 из защищенного режима работы в реальный). Все свои действия процессор осуществляет, выполняя соответвующие команды.

Для посылки команды необходимо вначале убедиться в том, что его внутренняя очередь команд пуста (если команда состоит из нескольких байтов, проверка осуществляется для каждого байта). Это можно сделать, прочитав слово состояния 8042 из порта с адресом 64 h. Бит с номером 1 должен быть равен нулю (биты нумеруются с 0). После того как программа дождется готовности процессора 8042, она может послать ему команду, записав ее в порт с адресом 60h (это делается для каждого байта команды).

Для управления клавиатурой процессор 8042 использует следующие команды:

3.3.1. Команда установки характеристик режима автоповтора. Команда состоит из двух байтов. Первый байт: код команды - F3h;

второй байт определяет характеристики режима. Его формат представлен в таблице 1:

Таблица 1

────────────────────────────────────────────────────────────────

Биты Значение

────────────────────────────────────────────────────────────────

0-4

Период автоповтора:

 

 

0

- 30.0;

0Ah - 10.0;

 

1

- 26.7;

0Dh - 9.2;

 

2

- 24.0;

10h

- 7.5;

 

4

- 20.0;

14h

- 5.0;

 

8

- 15.0;

1Fh - 2.0.

Период автоповтора определяет количество посылок скан-кода, генерируемых процессором клавиатуры в одну секунду. Можно использовать не только те значения, которые приведены выше, но и промежуточные, например, 9 или 15h.

────────────────────────────────────────────────────────────────

36

Продолжение таблицы 1

────────────────────────────────────────────────────────────────

Биты Значение

────────────────────────────────────────────────────────────────

5-6 Задержка включения режима автоповтора:

00 - 250 мс;

01 - 500 мс;

10 - 750 мс;

11 - 1000 мс.

7 Зарезервировано, должно быть 0.

──────────────────────────────────────────────────────────────────

Первоначально при инициализации системы период задержки для включения режима автоповтора устанавливается модулями BIOS равным 500 мс при периоде автоповтора, равным 10 повторам в секунду.

3.3.2. Команда управления светодиодами клавиатуры.

Команда состоит из двух байтов. Первый байт: код команды - EDh; формат второго байта представлен в таблице 2:

Таблица 2

────────────────────────────────────────────────────────────────

Биты Значение

────────────────────────────────────────────────────────────────

01 - включить светодиод ScrollLock

11 - включить светодиод NumLock

21 - включить светодиод CapsLock

3-7 Не используется

───────────────────────────────────────────────────────────────

3.3.3. Команда возврата к значениям, задаваемым BIOS. Код команды - 0F6h.

4.Порядок выполнения

4.1.В соответствии с индивидуальным заданием:

-установить соответствующие период и задержку автоповтора; -осуществить мигание соответствующего светодиода.

4.2. Путем чтения из порта 60h скан-кода определить клавишу, скан-код нажатия которой совпадает с номером студента в журнале. Определить скан-код отжатия этой клавиши. При определении скан-ко-

37

дов можно воспользоваться алгоритмом, приведенным на рис.2.

──1 ──────────────

Начало

 

─────────┬─────────

 

 

 

 

 

│

 

┌

 

 

┌── 2

────┴─────────┐

│Для предотвращения чтения

 

│ Задержка 100 мс

│

│скан-кодов отжатия клавиш

 

└─────────┬─────────┘

│Ctrl и F9

при запуске

 

 

│

 

│программы

 

 

─ 3

────┴───────

 

 

 

┌───

 

I = 1, 2

 

─────────────────┐

│

────────┬───────

 

 

│

│

 

│

 

 

│

│

┌── 4

────┴─────────┐

─ 8

────┴────────

│

│Чтение из порта 60H│

 

Конец

│

│

скан-кода

│

─────────────────

│└─────────┬─────────┘

│

│

│┌───────────>

││ ┌── 4 ────┴─────────┐

││ │Чтение из порта 60H│

│ │ │

скан-кода

│

││ └─────────┬─────────┘

│

│

│

│

│ да

5

│

└──

скан-коды

│

 

совпадают?

│

 

 

│

 

│нет

│

 

│

│─ 6 ────┴────────

│"новый" скан-код

│────────┬────────

│

│

│┌── 7 ────┴─────────┐

││"старый" скан-код │

│

│ = "новому"

│

│

└─────────┬─────────┘

└──────────────┘

Рис.2

38

4.3. После выполнения пп. 3.1 и 3.2 восстановить характеристики клавиатуры в исходное состояние.

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:

39

Таблица 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.Текст программы.

7.6.Результаты работы программы.

7.7.Выводы.

Лабораторная работа 5

БУФЕР КЛАВИАТУРЫ ПЭВМ

1. Цель работы Изучение организации буфера клавиатуры и приобретение практи-

ческих навыков определения хранящихся в буфере ASCII и скан-кодов клавиш клавиатуры

.

2.Темы для предварительной проработки

2.1.Организация буфера клавиатуры.

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]