Реклама:

// Глобальная переменная — базовый адрес порта int Cent_Base;

// Прототипы функций нижнего уровня (см. п.3.2.1)

// Запись в регистр управления Centronics

extern void Cent_Control_drv (unsigned char control);

// Чтение из регистра управления Centronics extern unsigned char Cent_Status_drv (void);

// Прототипы функций // Функция инициализации, int lnit_SP (void);

// Функция записи в регистр светодиодов void Write_SP (unsigned char data); у // Функция чтения состояния переключателей unsigned char Read_SP (void);

// Маски битов регистров управления и состояния // Регистр управления #define STROBE 0x01 #define AUTOFD 0x02 #define INIT 0x04 #define SLCTIN 0x08 // Регистр состояния #define BUSY 0x10 #define STATUS_DATA OxOF

// Функция инициализации. // Определяет адрес порта, // к которому подключено устройство // (по сигналу наличия внешнего питания). // Гасит все светодиоды. // Возвращает: 1 — устройство подключено, // 0 — не подключено

int lnit_SP (void) {

int *b;

b = (int *) MK_FP (0, 0x408); // Указатель на ячейку 0:408 while ( *b != 0 ) // Если порт установлен

{

Cent_Base = *b; // Считываем его базовый

// адрес if (Cent_Status_drv() & BUSY != 0) continue; // Устройство не подключено

// к этому порту Cent_Control_drv (0); // Сброс регистра светодиодов Cent_Control_drv (INIT); // Разрешение записи

// в регистр // светодиодов return 1; // Устройство

// подключено

}

return 0; // Устройство не подключено

}

// Функция записи в регистр светодиодов.

// Вход: data — байт данных, в котором каждый бит

// соответствует светодиоду: 0 — не горит, 1 — горит

void Write_SP (unsigned char data)

{

outportb (Cent_Base, data); // Установка данных

Cent_Control_drv (STROBE | INIT); // Строб записи = 1 Cent_Control_drv (INIT); // Строб записи = 0

}

// Функция чтения состояния переключателей.

// Возвращает: байт данных, в котором каждый бит

// соответствует переключателю:

// 0 — замкнут, 1 — разомкнут

unsigned char Read_SP (void)

{

unsigned char data;

data = Cent_Status_drv() & STATUS.DATA; // Чтение

// младшей //тетрады

Cent_Control_drv (SLCTIN | INIT); // Выбор старшей

// тетрады

data += (Cent_Status_drv() & STATUS_DATA) « 4;

// Чтение

// старшей тетрады Cent_Control_drv (INIT); // Исходное состояние

return data;

}

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

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

#define ESC 0x1 В // Код клавиши ESC

include <CONIO.H>

// Выход из программы — по клавише Esc

void main (void) {

char key = 0;

if (lnit_SP() == 0) // Инициализация

exit(1); //He подключено

while (key != ESC) // Выход no Esc

{

while (! kbhit()) // Проверка нажатия клавиши Write_SP ( Read_SP() );// Чтение состояния

// переключателей и . // запись в регистр | // светодиодов % key = getch(); // Чтение кода клавиши

} }

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

Драйверы показанного на рис. 3.5 модуля ОЗУ емкостью 16 Кбайт реализуют функции инициализации, чтения и записи данных по произвольному адресу.


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