Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКДО_СистПрог_2016.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

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

/*-------------------Лабораторная работа N5---------------*/

/*-------------------Управление клавиатурой---------------*/

/* Подключение стандартных заголовков */

#include <dos.h>

void interrupt (*old9)(); /* Старый обработчик прерывания 9h */

void interrupt new9(); /* Новый обработчик прерывания 9h */

void *readvect (int in); /* Чтение вектора */

void writevect (int in,void *h); /* Запись вектора */

unsigned char F3_code=61; /* scan-code "F3" */

unsigned char key3_code=4;/* scan-code "3" */

char f=0; /* Флаг */

union REGS rr;

struct SREGS sr;

/*--------------------------------------------------------*/

void main()

{

char string[80]; /* Буфер для ввода текста */

textbackground(0);

clrscr();

textattr(0x0a);

cprintf("---------------");

cprintf(" Лабораторная работа N5 ");

cprintf("---------------");

cprintf("---------------");

cprintf(" Управление клавиатурой ");

cprintf("---------------");

old9=readvect(9);

writevect(9,new9);

textattr(0x0c);

cprintf("\n\n\r\"горячая\" комбинация: ");

textattr(0x0a);

cprintf("Left Shift, Right Ctrl, F3\n\r");

textattr(0x0b);

cprintf("Клавиша, которая блокируется: ");

textattr(0x0f);

cprintf("3");

textattr(0x07);

cprintf("\r\nВводите строку символов>");

scanf("%s",string);

writevect(9,old9);

}

/*--------------------------------------------------------*/

/* Чтение вектора */

void *readvect(int in)

{

rr.h.ah=0x35;

rr.h.al=in;

intdosx(&rr,&rr,&sr);

return(MK_FP(sr.es,rr.x.bx));

}

/*--------------------------------------------------------*/

/* Запись вектора */

void writevect(int in,void *h)

{

rr.h.ah=0x25;

rr.h.al=in;

sr.ds=FP_SEG(h);

rr.x.dx=FP_OFF(h);

intdosx(&rr,&rr,&sr);

}

/*--------------------------------------------------------*/

/* Новый обработчик 9-го прерыванмя */

void interrupt new9()

{

unsigned char c,x,y;

unsigned char byte17,byte18;

unsigned char mask=0x02;

unsigned char mask17=0x04;

unsigned char mask18=0x01;

byte17=peekb(0x40,0x17);

byte18=peekb(0x40,0x18);

if((inportb(0x60)==F3_code)&&(byte17&mask)&&

(byte17&mask17)&&(!(byte18&mask18)))

{

cputs("\7");

x=wherex();

y=wherey();

gotoxy(55,3);

textattr(0x1e);

if(f==0)

{

f=1;

cprintf("Клавиша \"3\" заблокирована ");

}

else

{

f=0;

cprintf("Клавиша \"3\" разблокирована");

}

gotoxy(x,y);

textattr(0x07);

(*old9)();

}

if( (f==1) && (inportb(0x60)==key3_code) )

{

c=inportb(0x61);

outportb(0x61,c|0x80);

outportb(0x61,c);

outportb(0x20,0x20);

}

else

(*old9)();

}

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

Во время программы при первом нажатии комбинации клавиш LeftCtrl+RightShift+F3 программа переходит в режим блокирования вводу клавиши 3, при втором - отменяет этот режим.

Лабораторная работа № 6. Управление таймером

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

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

2. Темы для предварительного изучения

  • Структура и назначение портов микросхемы конфигурации и таймера.

  • Установка вектора прерываний.

3. Постановка задачи

Построить модель аналого-цифрового преобразователя (АЦП), которая работает в реальном времени. Процесс, который дискретизуется, моделируется программой (программным блоком), который выполняет циклическое вычисление функции y=F(x), где x - номер итерации. Преобразователь моделируется программой, которая выполняет с заданной частотой (в реальном времени) прерывание процесса, считывание и запоминание текущего значения функции. Запомнить не меньше 80 значений функции. Обеспечить наглядное представление результатов работы "АЦП".