Написание программы, осуществляющей двунаправленный обмен данными с параллельным портом по заданному алгоритму

Страницы работы

3 страницы (Word-файл)

Содержание работы

Работа с параллельным портом.

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

Основу программы составляют три функции, предназначенные для:

-  receive_byte получает байт из порта и помещает его в глобальную переменную data_rec. a Так как параллельный порт имеет всего 5 входных сигналов, один из них используется для стробирования, а остальные четыре – для приема данных в два этапа – сперва младшие 4 бита, а затем старшие 4 бита. На входе стробирования при этом должно формироваться два импульса низкого уровня соответственно.

-  send_byte передает в порт сперва адрес требуемой ячейки для записи, затем выставляет сами данные, а затем выдает строб для записи. Все операции производятся с задержкой в 1 мс, обеспечиваемую функцией delay. Между задержками производится опрос состояния входа стробирования на случай получения данных. При наличии данных на входе операция вывода прерывается, и вызывается функция ввода. В связи с тем, что опрос состояния порта производится между задержками, длительность входного импульса стробирования не должна быть меньше одной миллисекунды по крайней мере для младших 4 бит вводимого числа.

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

Структура основной программы:

В случае необходимости ввода данных программа должна постоянно опрашивать порт в ожидании появления низкого уровня на стробирующем входе и в случае его появления вызвать функцию receive_byte. После получения байта необходимо обнулить переменную flag, так как в случае получения байта она инкрементируется, и если не была обнулена, то принимает значение 2, что является признаком переполнения и потери полученного байта.

При выводе данных функции send_byte передаются два параметра: сами данные – 1 байт и адрес для их записи во внешнее устройство: младшие 4 бита. После завершения работы функции send_byte необходимо осуществить проверку переменной flag на наличие полученного байта при выполнении функции  вывода.

Распределение сигналов:

Входные:

BUSY – строб входных данных

ACT, PE, SLCT, ERROR – соответственно входные биты данных

Выходные:

DO7-DO0 – выходные данные

IRQ Enable – выходной строб

SLCT IN, INIT, автоперевод строки, строб – биты адреса.

Временные диаграммы:

Входные:                                                                                                     Выходные:

#include<iostream.h>

#include<dos.h>

#include<conio.h>

typedef unsigned char UC;

UC flag,data_rec;

void receive_byte()//ввод байта

{     UC t;

UC data;

do

{     t=inportb(0x379);

} while(t&128!=0);

data=(t>>3)&0x0f;//младшие 4 бита

do

{     t=inportb(0x379);

} while(t&128==0);

do

{     t=inportb(0x379);

} while(t&128!=0);

data|=(t<<1)&0xf0;//старшие 4 бита

do

{     t=inportb(0x379);

} while(t&128==0);

data_rec=data;

flag+=(flag<2)?1:0;//Признак получения байта, программа должна

//его обнулять при выборке байта из переменной data_rec

}

void send_byte(UC data,UC address)//вывод байта

{     UC t,t1;

t=address;

t&=15;

t|=16;

outportb(0x37a,t);//вывод адреса для записи

t1=inportb(0x379);

if(t1&128==0)receive_byte();

delay(1);

outportb(0x378,data);//вывод данных

t1=inportb(0x379);

if(t1&128==0)receive_byte();

delay(1);

t&=15;

outportb(0x37a,t);//вывод строба (низкий уровень) для записи

delay(1);

t|=16;

outportb(0x37a,t);//снятие строба

}

void initial()//инициализация портов

{   UC t;

flag=0;

outportb(0x37a,0x10);//вывод НЕ строба

do

{     t=inportb(0x379);

} while(t&128==0);//ожидание отсутствия данных на входе

}

void main()

{   UC t1;

clrscr();

cout<<"Инициализация устройства,\nнеобходимо отсутствие строба"

<<" (единичный уровень) на входе";

initial();

clrscr();

cout<<"А теперь программа ждет получения 10 байт";

for(int i=0;i<10;i++)//Ввод 10 байт

{     do

{     t1=inportb(0x379);

if(t1&128==0)receive_byte();

} while(flag==0);

flag=0;

{//обработка полученного байта в переменной data_rec

}

}

{/*передача данных функцией send_byte, после передачи байта необходимо проверять переменную flag

на предмет получения байта*/

}

}

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
35 Kb
Скачали:
0