Реклама:

Другой задачей, где в процессе работы требуется изменение направления передачи порта, является использование части его линий для ввода, а другой части — для вывода информации (как уже неоднократно говорилось, направление передачи информации можно установить только для всего порта целиком, а не для отдельных его битов). Рассмотрим сопряжение с компьютером простейшего устройства, состоящего из четырех ключей и четырех лампочек и предположим, что ввиду большой загруженности УКПО другими задачами для подключения нашего устройства выделен только один порт 5 (рис. 2.59). Драйверы, приведенные ниже, реализуют две функции — чтение состояния ключей и "поджигание" лампочек.

Разработка устройств сопряжения для персонального компьютера типа IBM PC. Под общей редакцией Ю. В. Новикова

Рис. 2.59. Подключение простейшего устройств* из ключей и лампочек.

// *** Драйверы устройства 'Набор лампочек и кнопочек" ***

^define LAMP OxOF // Маска битов светодиодов

// (биты 0...3 порта 5)

#define Р5 0x20 // Маска бита порта 5

// в управляющем слове

// Глобальные переменные

unsigned BASE_ADDR; // Базовый адрес УКПО unsigned CW_ADDR; // Адрес регистра

// управляющего слова unsigned char CW; // Управляющее слово

// Прототипы функций unsigned char Get_Switch (void); void Set_Lamp (unsigned char data);

// Функция чтения состояния ключей unsigned char Get_Switch (void)

// В возвращаемом байте четыре старших .бита (4...7) // соответствуют четырем ключам //(0 — замкнут, 1 — разомкнут).

{

unsigned char data;

outportb (CW_ADDR, CW & (~P5)); // Порт 5 — на ввод data = inportb (BASE_ADDR+5); // Чтение состояния ключей outportb (CW_ADDR, CW | P5); // Порт 5 — на вывод return (data);

>

// Функция "поджигания" лампочек

void Set_Lamp (unsigned char data)

// Четыре младших бита из data соответствуют четырем

// лампочкам (1 — горит, 0 — погашен).

{

outportb (BASE ADDR+5, (data & LAMP) | Get_Switch()); }

//*** Конец драйверов

Понятно, что если для "поджигания" лампочек просто вывести соответствующую тетраду в порт 5, это может привести к конфликту на четырех старших линиях между выводимой информацией и состоянием ключей. Поэтому в старшую тетраду надо записывать те данные, которые установлены ключами. Для этого приходится считывать их состояние при каждой записи в порт 5. Для считывания состояния ключей необходимо переводить порт 5 на ввод, а затем после чтения — опять на вывод. Такое кратковременное отключение порта от лампочек (время зависит от быстродействия компьютера, но во всяком случае не превосходит нескольких десятков микросекунд) не будет заметно.

2.2.3. Программирование логического анализатора

При написании драйверов логического анализатора (см. п.2.1.10) необходимо реализовать три основные процедуры:

♦ установка параметров и запуск регистрации;

♦ проверка окончания регистрации;

♦ чтение массива данных

// *** Драйверы логического анализатора ***

#define READY 0x01 // Маска бита готовности (бит 0)

#define FREQ 0x07 // Маска битов кода частоты

// регистрации (биты 0...2) #define SYNC 0x38 // Маска битов кода синхролинии


⇐ Предыдущая страница| |Следующая страница ⇒