Реклама:

#include <DOS.H> #include <STDIO.H>

#define START 1 // Маска бита запуска

// (бит 0 порта 2)

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

// (бит 7 порта 1)

#define DH 3 ' // Маска 8-го и 9-го битов

// данных АЦП // (биты 0 и 1 порта 1)

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

// Глобальные переменные ^signed BASE_ADDR; ^signed CVVADDR;

// Базовый адрес УКПО

// Адрес регистра

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

void main (void) {

unsigned data_ADC = 0; // Данные с АЦП

outportb (CW_ADDR, 4); // Установка конфигурации:

// порт 2 на вывод, // остальные на ввод

outportb (BASE+2, START* 1) // Запуск АЦП — запись 0

while ( ( (data_ADC = inportb (BASE+1)) & READY ) != 0 );

// Опрос готовности

data_ADC = (data_ADC & DH)«8 + inportb (BASE);

// Чтение младшего // байта данных

printf ("\пПрочитан код — %u", data_ADC);

}

//*** Конец программы

В следующем примере рассмотрим реализацию протоколов обмена с "быстрым" устройством — модулем ОЗУ емкостью 16 КБайт с байтовой организацией. Подключим модуль ОЗУ к портам УКПО следующим образом:

РО.О ... Р0.7 — младший байт шины адреса: АО ... А7, Р1.0 ... Р1.5 — старшие линии шины адреса: А8...А13, Р1.6— сигнал разрешения записи -\УЕ, Р1.7— сигнал разрешения выхода -ОЕ, Р2.0 ... Р2.7— шина данных: ЭО ... Э7.

Ниже приведены драйверы модуля ОЗУ, реализующие процедуры записи и чтения байта данных по произвольному адресу. Перед вызовом драйверов должно быть предварительно установлено управляющее слово УКПО — ОЗН (порты 0 и 1 — на вывод, порт 2 — на ввод).

// *** Драйверы модуля ОЗУ ***

#define WE 0x40 // Маска бита WE (бит 6 порта 1) #define ОЕ 0x80 // Маска бита ОЕ (бит 7 порта 1) #define АН 0x3 F // Маска линий А8..А13 шины адреса // (биты 0...5 порта 1)

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

unsigned BASE_ADDR; // Базовый адрес УКПО

unsigned CW_ADDR; // Адрес регистра

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

// Прототипы функций

void Write_RAM (unsigned addr, unsigned char data); unsigned char Read_RAM (unsigned addr);

Л функция записи байта данных

void Write_RAM (unsigned addr, unsigned char data)

{

outportb (CW_ADDR, 7); // Порты 0...2 — на вывод

outportb (BASE_ADDR, addr); // Младший байт адреса

outportb (BASE_ADDR+1, (addr»8) & AH | OE & (~WE));

// Старшие линии адреса,

// OE=1, WE=0 outportb (BASE_ADDR+2, data); // Установка данных

outportb (BASE_ADDR+1, (addr»8) & AH | OE | WE)); //WE=1 outportb (CVVADDR, 3); // Порты 0,1 — на вывод,

// порт 2 — на ввод

)

// Функция чтения байта данных unsigned char Read_RAM (unsigned addr)

{

unsigned char data;

outportb (BASE_ADDR, addr); // Младший байт адреса

outportb (BASE_ADDR+1, (addr»8) & AH & (~OE) | WE);

// Старшие линии // адреса, // OE=0, WE=1 data = inportb (BASE_ADDR+2); // Чтение данных outportb (BASE_ADDR+1, (addr»8) &AH | OE | WE)); // OE=1 Return (data);

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

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


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