
- •1. Паралельний і послідовний порти
- •Лабораторна робота №1 Тема: Управління об’ктами за допомогою lpt порта пк.
- •1.1. Паралельний порт
- •1.1.2. Внутрішній пристрій
- •Група даних
- •Група управління
- •Група стану
- •1.1.3. Програмне управління Отримання базової адреси паралельного порту
- •Ввід/вивід даних через паралельний порт
- •Команди принтера і процедури переривань bios
- •Безпосередній доступ до регістрів порту
- •Вага біта
- •Лабораторна робота №2 Тема: Управління об’ктами за допомогою сом порта пк.
- •1.2. Послідовний інтерфейс rs232
- •1.2.1. Послідовна передача даних
- •1.2.2. Роз'єм і кабель порту rs232
- •1.2.3. Внутрішня апаратна конструкція
- •Перетворювачі напруги
- •Базові адреси сом-портів
- •1.2.4. Програмне управління Отримання базової адреси послідовного порту
- •Ініціалізація сом-порта
- •Передача і приймання послідовних даних
- •Передача даних по лініях взаємодії
- •2.4. Експериментальні плати паралельного, послідовного та ігрового портів
- •2.4.1. Експериментальна плата паралельного порту
- •2.4.2. Експериментальна плата послідовного порту
- •3. Програми управління експериментальними платами
- •3.1. Програмне забезпечення для експериментальної плати паралельного порту
- •3.1.1. Опис програми centexp.Pas
- •Текст програми centexp.Pas
- •3.2. Програмне забезпечення для експериментальної плати послідовного порту
- •3.2.1. Опис програми rs232exp.Pas
- •Текст програми rs232exrpas
- •Лабораторна робота №3 Тема: Управління об’ктами за допомогою usb порта пк.
- •Функція
- •Механізм передачі даних
Текст програми centexp.Pas
Рrоgram Centroniс_Ехреrimenta1_Воаrd;
(• Програма управління експериментальною платою паралельного порту *)
uses graph, crtt, dos;
var
l,led_selected:integer;
ch:char;
status: array [1..18] of integer;
key_pressed: string [10];
(* Підключення двох бібліотек: TLIB1 і TLIB2.*)
($1 c \ioexp\tplib1.pas}
{$1 c \ioexp\tplib2.pas}
Procedure Draw_panel;
(* Малювання панелі управління експериментальної плати *)
begin
(*Малювання 16 світлодіодів на екрані *)
serbkcolor(cyan);
for i:=1 to 16 do status[i]:=0;
for i:=1 to 8 do draw_led(30+i*30, 350, status[i]);
for i:=1 to 8 do draw_led(340+i*30, 350, status[8+i]); (*Виведення назв*)
draw_led(20,20,1);
draw_message(50,20,70,20,lightblue,'LED ON',0,1,yellow);
draw_led(20,60,0):
draw_message(50,60,70,20,lightblue,'LED OFF',0,1,yellow);
draw_message(50,390,230,20,blue, 'DATA PORT D1 - D8 ',0,1,yellow);
draw_message(360,390,110,20,blue, 'CONTROL D1 - D4 ',0,1,yellow);
draw_message(480,390,110,20,blue, 'STATUS D1 - D4 ',0,1,yellow);
(*Малювання панелі допомоги pнизу.*)
setfillstyle(1,magenta);
bar(1,420,800,480);
settextstyle(0,0,1);
outtextxy(20,430,'[ARROW]: Select а LED [SPACE]:Change LED status [Q]:Quit');
(*Малювання центрального повідомлення*)
draw_message(60,200,500,50,blue, 'Centronic Experimental Board',0,1,yellow);
(*Ініціалізація виходів.*)
write_data_port(p_address,0);
write_control_port(P_address,0);
end;
Procedure Output_Input; (*Процедура вводу/виводу.*)
var
output_byte, input_byte:byte;
begin
(*Обчислення значення даних, що передаються в порт даних.*)
output_byte:=0;
for i:=1 to 8 do output_byte:=output_byte+status[i]*bit_weight(i);
write_data_port(P_address,output_byte);
(|Обчислення значення даних, о передаються в порт управління.*)
output_byte:=0;
for i:=9 to 12 do output_byte:=output_byte+status[i]*bit_weight(i-8);
write_control_port(P_address,output_byte);
(*Зчитування даних з порту стану і обчислення стану світлодіодів.*)
input_byte:=read_status_port(P_address);
for i:=1 to 4 do status[12+i]:=round((input_byte and bit_weight(i))/bit_weight(i));
end;
Procedure scan_keyboard;
(*Опитування клавіатури для виявлення натиснення клавіші.*)
var
led_selected_old:integer;
begin
led_selected_old:=led_selected;
(*Виявлення натиснення клавіші.*)
keyрressed:=getkey;
if key_pressed='LEFT' then led_selected: = led_selected - 1;
if key_pressed='RIGHT' then led_selected: = led_selected + 1;
if key_pressed=' ' then status[led_selected]: = 1- status[led_selected];
(*Показ віртуальних світлодіодів та їх стану.*)
setbkcolor(cyan):
for i:=1 to 8 do draw_led(30+i*30,350,status[i]);
for i:=1 to 4 do draw_led(340+i*30,350,status[8+i]);
output_input;
for i:=5 to 8 do draw_led(340+i*30,350,status[8+i]);
if led_selected>12 then led_selected:=i2;
if led_selected<1 then led_selected:=1;
(*Відображення кола навколо вибраного світлодіода.*)
setlinestyle(0,0,3);
setcolor(cyan);
if led_selected_old<=8 then circle(30+30*led_selected_old,350,15)
else circle(340+30*(led_selected_old-8),350,15);
setcolor(yellow);
if led_selected<=8 then circle(30+30*led_selected,350,15)
else circle(340+30*(led_selected-8),350,15);
end;
(«Головна програма.*)
begin
centronic_address; (*Введення адреси паралельного порту.*)
initialize_graph; (*Ініціалізація графічного режиму.*)
draw_panel; (*Малювання віртуальної панелі.*)
led_selected:=1;
repeat
scan_keyboard;
(*Опитування клавіатури для виявлення натиснення клавіші.*)
until (key_pressed='Q') or (key_рressed='q');
closegraph; (*3акриття графічного режиму.*)
end.
Тут використовуються дві бібліотеки - TPLIB1.PAS і TPLIB2.PAS, які підключаються за допомогою директиви Тр6 INCLUDE.
{$I c:\ioexp\tplib1.pas}
{$I c:\ioexp\tplib2.pas}
Програма містить три головні процедури, що знаходяться в бібліотеці TLIB2.PAS: Draw_panel малює віртуальну панель управління експериментальною платою, Draw_led() і Draw_message() - зображення віртуальних світлодіодів і напису. Процедура Output_input управляє операціями вводу/виводу паралельного порту, Write_data_port(), write_control_port() і read_status_port() - операціями запису в регістри порту і читання з них; вони містяться в бібліотеці TPLIB1.PAS.
Процедура Scan_keyboard опитує клавіатуру для виявлення натиснення клавіш управління. Тут використовується функція getkey з бібліотеки TPLIB2.PAS.