Работа с параллельным портом.
Задача: написать программу, осуществляющую двунаправленный обмен данными с параллельным портом по заданному алгоритму.
Основу программы составляют три функции, предназначенные для:
- 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
на предмет получения байта*/
}
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.