МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИНАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІНСТИТУТ КОМП’ЮТЕРНОЇ ТЕХНІКИ АВТОМАТИКИ ТА МЕТРОЛОГІЇ
ЗВІТ ЛАБОРАТОРНИХ РОБІТ №1-4
З ПРЕДМЕТУ: «Периферійні пристрої»
ТЕМА: «Дослідження режимів функціонування інтерфейсу RS-232C»
Львів – 2012
Мета роботи: ознайомитися з процесом передачі даних через асинхронний інтерфейс RS-232C (COM-порт).
Теоретичні відомості
Асинхронний послідовний інтерфейс – це основний тип інтерфейсу, за допомогою якого здійснюється передача даних між комп’ютерами. Термін асинхроний означає, що при передачі даних не використовуються ніякі синхронізуючі сигнали, і окремі символи можуть передаватись з випадковими інтервалами, як, наприклад при вводі даних з клавіатури.
Кожному символу, який передається через послідовне з’єднання, мусить передувати стандартний стартовий сигнал, а завершувати його передачу – стоповий сигнал.
Термін послідовний означає, що передача даних виконується по одиночному провіднику, а біти передаються послідовно один за другим. Такий тип зв’язку характерний для телефонної мережі, в якій кожний напрямок обслуговує один провідник.
В основному у всіх пристроях, для яких потрібен двонапрямлений зв’язок з комп’ютером, використовується порт, який став стандартом – RS-232C (Reference Standard number 232 version C – стандарт обміну номер 232 версії С), який позволяє передавати дані між несумісними пристроями.
Інтерфейс RS-232C розроблено в 1969 році рядом корпорацій США для забезпечення з’єднання комп’ютерів та різноманітних периферійних пристроїв. Стандарт RS-232 в загальному випадку описує 4 інтерфейсні функції:
1. Визначення керувальних сигналів, що передаються через інтерфейс.
2. Визначення формату даних користувача, що передаються через інтерфейс.
3. Передачу тактових сигналів для синхронізації потоку даних.
4. Формування електричних характеристик інтерфейсу.
Інтерфейс RS-232 є послідовним асинхронним інтерфейсом, в якому перед бітами даних передається спеціальний стартовий біт, після бітів даних йде біт паритета та 1 чи 2 стопових біти. Така сукупність бітів носить назву старт-стопного символу. Кожний старт-стопний символ, як правило, у якості бітів даних містить один інформаційний символ, наприклад, символ стандартного коду для обміну інформацією, що задається таблицею ASCII. Символи ASCII відображаються семибітовими кодовими словами. Так, наприклад, латинська буква А має код 1000001. Її передача рівнями ТТЛ зображена на рисинку.
Початок асинхронного символу завжди відмічається низьким рівнем стартового рівня (“0”). Після нього йдуть 7 біт даних, потім біт паритету, та 2 стопових біти. Біт паритету встановлюється в “1”, або “0”, наприклад, непарний паритет характеризується тим, що загальна кількість одиниць в групі з семи біт (сім даних + один біт паритету) повинно бути непарним числом. Стопові біти передаються високим рівнем (“1”).
Для двопровідної лінії зв'язку у випадку передачі з комп'ютера на зовнішній пристрій використовуються сигнали SG і TхD. Всі 10 сигналів інтерфейсу задіюються лише при з'єднанні комп'ютера з модемом.
Власне дані (5, 6, 7 або 8 біти) супроводжуются стартовим бітом, бітом парності і одним або двома стоповими бітами. Отримавши стартовий біт, приймач вибирає з лінії біти даних через визначені інтервали часу. Дуже важливо, щоб тактові частоти приймача і передавача були однаковими, допустима розбіжність - не більше 10 %
Формат даних RS-232C
Всі сигнали RS-232C передаються спеціально вибраними рівнями, що забезпечують високу завадостійкість зв'язк. Відзначимо, що дані передаються в інверсному коді (логічній одиниці відповідає низький рівень, логічному нулю - високий рівень).
Рівні сигналів RS-232C на передавальному і приймаючому кінцях лінії зв'язку.
Хід роботи:
Створила програму для передачі даних між COM портами, яка має наступний вигляд (рис.1):
Рис.1.
Для того щоб почати передачу, спочатку потрібно відкрити порти, натиснувши на кнопку «Відкрити». Після цього можна відсилати дані, для цього потрібно натиснути на кнопку «Надіслати дані». З’являється вікно «Передавач», де потрібно ввести текст, який потрібно передати, наприклад ввожу своє прізвище (рис.2), після цього натискаю кнопку «ОК».
Рис.2.
Дані, які надсилались заносяться у поле «Приймач» (рис.3), а також з’являється можливість закрити порти і переглянути часові діаграми, виводиться швидкість, з якою передавалось повідомлення.
Рис.3.
Для того, щоб переглянути часові діаграми кожної літери, яка передавалась для підтвердження потрібно натиснути на кнопку «Відображення часових діаграм». Після цього з’являться кнопки з назвою кожної літери, яка передавалась (рис.4), якщо натискати на кожну з них можна побачити відображення передачі кожної літери (рис.5-12).
Рис.4.
Рис.5.
Рис.6.
Рис.7.
Рис.8.
Рис.9.
Рис.10.
Рис.11.
Рис.12.
Для виходу з програми потрібно натиснути на кнопку «Вихід».
Висновки: виконавши поставлене завдання, я ознайомилась з процесом передачі даних через послідовний асинхронний інтерфейс RS-232C (COM-порт), створення приймача, формування та передачі пакетних даних у графічному представленні, а також ознайомилась з процесом налаштування основних параметрів прийому – передачі пакетних даних.
Додаток:
Лістинг програми:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Comm32, StdCtrls, Buttons, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
Comm321: TComm32;
Comm322: TComm32;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
SpeedButton1: TSpeedButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton;
Button1: TButton;
Button2: TButton;
Label21: TLabel;
Edit11: TEdit;
Button3: TButton;
Timer1: TTimer;
Label23: TLabel;
Label22: TLabel;
Label24: TLabel;
Panel1: TPanel;
SpeedButton10: TSpeedButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Comm322ReceiveData(Buffer: Pointer; BufferLength: Word);
procedure SpeedButton9Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton10Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure SpeedButton7Click(Sender: TObject);
procedure SpeedButton8Click(Sender: TObject);
private
{ Private declarations }
public
function bin (x: Integer): string;
Function GetTimeInMilliSeconds(theTime : TTime): Int64;
{ Public declarations }
end;
var
Form1: TForm1;
SendStr,st1,st2,st3,st4,st5,st6,st7,st8:String;
s,b1:integer;
a:integer;
implementation
uses Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9;
{$R *.dfm}
function TForm1.bin(x: Integer): string;
const t:array[0..1] of char = ('0','1');
var res:string;
d:0..1;
begin
res:='';
while (x<>0) do
begin
d:=x mod 2 ;
res:=t[d]+' '+res;
x:=x div 2;
end;
Bin:=res;
end;
Function TForm1.GetTimeInMilliSeconds(theTime : TTime): Int64;
var
Hour, Min, Sec, MSec: Word;
begin
DecodeTime(theTime,Hour, Min, Sec, MSec);
Result := (Hour * 3600000) + (Min * 60000) + (Sec * 1000) + MSec;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SendStr:='';
if InputQuery('Ïåðåäàâà÷', 'Òåêñò:', SendStr) then
Comm321.WriteCommData(PChar(SendStr+#13#10), Length(SendStr));
//Ïðèéìà÷
Label21.Visible:=true;
Edit11.Visible:=true;
Label24.Caption:='Øâèäê³ñòü ïåðåäà÷³ 9600';
SpeedButton9.Visible:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Comm321.StartComm;
Comm322.StartComm;
Button3.Visible:=true;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Comm321.StopComm;
Comm322.StopComm;
Button3.Visible:=false;
Edit11.Text:='';
SpeedButton9.Visible:=false;
SpeedButton1.Visible:=false;
SpeedButton2.Visible:=false;
SpeedButton3.Visible:=false;
SpeedButton4.Visible:=false;
SpeedButton5.Visible:=false;
SpeedButton6.Visible:=false;
SpeedButton7.Visible:=false;
SpeedButton8.Visible:=false;
end;
procedure TForm1.Comm322ReceiveData(Buffer: Pointer; BufferLength: Word);
var
RecivedStr:String;
begin
RecivedStr:=PChar(Buffer);
edit11.Text:=RecivedStr;
end;
procedure TForm1.SpeedButton9Click(Sender: TObject);
var
n:integer;
begin
Label1.Caption:=SendStr[1];
Label2.Caption:=SendStr[2];
Label3.Caption:=SendStr[3];
Label4.Caption:=SendStr[4];
Label5.Caption:=SendStr[5];
Label6.Caption:=SendStr[6];
Label7.Caption:=SendStr[7];
Label8.Caption:=SendStr[8];
Label11.Caption:='';
s:=0;
for n:=1 to Length (Label1.Caption) do
begin
Label11.Caption:=Label11.Caption + IntToStr(ord(Label1.Caption[n]));
s:=s+ord(Label1.Caption[n]);
end;
a:=StrToInt(Label11.Caption);
Edit1.Text:=Bin(a);
Label12.Caption:='';
s:=0;
for n:=1 to Length (Label2.Caption) do
begin
Label12.Caption:=Label12.Caption + IntToStr(ord(Label2.Caption[n]));
s:=s+ord(Label2.Caption[n]);
end;
a:=StrToInt(Label12.Caption);
Edit2.Text:=Bin(a);
Label13.Caption:='';
s:=0;
for n:=1 to Length (Label3.Caption) do
begin
Label13.Caption:=Label13.Caption + IntToStr(ord(Label3.Caption[n]));
s:=s+ord(Label3.Caption[n]);
end;
a:=StrToInt(Label13.Caption);
Edit3.Text:=Bin(a);
Label14.Caption:='';
s:=0;
for n:=1 to Length (Label4.Caption) do
begin
Label14.Caption:=Label14.Caption + IntToStr(ord(Label4.Caption[n]));
s:=s+ord(Label4.Caption[n]);
end;
a:=StrToInt(Label14.Caption);
Edit4.Text:=Bin(a);
Label15.Caption:='';
s:=0;
for n:=1 to Length (Label5.Caption) do
begin
Label15.Caption:=Label15.Caption + IntToStr(ord(Label5.Caption[n]));
s:=s+ord(Label5.Caption[n]);
end;
a:=StrToInt(Label15.Caption);
Edit5.Text:=Bin(a);
Label16.Caption:='';
s:=0;
for n:=1 to Length (Label6.Caption) do
begin
Label16.Caption:=Label16.Caption + IntToStr(ord(Label6.Caption[n]));
s:=s+ord(Label6.Caption[n]);
end;
a:=StrToInt(Label16.Caption);
Edit6.Text:=Bin(a);
Label17.Caption:='';
s:=0;
for n:=1 to Length (Label7.Caption) do
begin
Label17.Caption:=Label17.Caption + IntToStr(ord(Label7.Caption[n]));
s:=s+ord(Label7.Caption[n]);
end;
a:=StrToInt(Label17.Caption);
Edit7.Text:=Bin(a);
Label18.Caption:='';
s:=0;
for n:=1 to Length (Label8.Caption) do
begin
Label18.Caption:=Label18.Caption + IntToStr(ord(Label8.Caption[n]));
s:=s+ord(Label8.Caption[n]);
end;
a:=StrToInt(Label18.Caption);
Edit8.Text:=Bin(a);
//ïðèñâîºííÿ çíà÷åíü êíîïêàì äëÿ ×Ä
SpeedButton1.Visible:=true;
SpeedButton2.Visible:=true;
SpeedButton3.Visible:=true;
SpeedButton4.Visible:=true;
SpeedButton5.Visible:=true;
SpeedButton6.Visible:=true;
SpeedButton7.Visible:=true;
SpeedButton8.Visible:=true;
SpeedButton1.Caption:=Label1.Caption;
SpeedButton2.Caption:=Label2.Caption;
SpeedButton3.Caption:=Label3.Caption;
SpeedButton4.Caption:=Label4.Caption;
SpeedButton5.Caption:=Label5.Caption;
SpeedButton6.Caption:=Label6.Caption;
SpeedButton7.Caption:=Label7.Caption;
SpeedButton8.Caption:=Label8.Caption;
//êîðåêòóâàííÿ á³òîâîãî çíà÷åííÿ
st1:=edit1.Text;
DELETE(st1,16,1);
Edit1.Text:=st1;
st2:=Edit2.text;
DELETE(st2,16,1);
edit2.Text:=st2;
st3:=Edit3.text;
DELETE(st3,16,1);
edit3.Text:=st3;
st4:=Edit4.text;
DELETE(st4,16,1);
edit4.Text:=st4;
st5:=Edit5.text;
DELETE(st5,16,1);
edit5.Text:=st5;
st6:=Edit6.text;
DELETE(st6,16,1);
edit6.Text:=st6;
st7:=Edit7.text;
DELETE(st7,16,1);
edit7.Text:=st7;
st8:=Edit8.text;
DELETE(st8,16,1);
edit8.Text:=st8;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label22.Caption:=TimeToStr(Time);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Form2.Visible:=true;
Form2.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label1.Caption;
end;
procedure TForm1.SpeedButton10Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Form3.Visible:=true;
Form3.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label2.Caption;
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
Form4.Visible:=true;
Form4.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label3.Caption;
end;
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
Form5.Visible:=true;
Form5.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label4.Caption;
end;
procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
Form6.Visible:=true;
Form6.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label5.Caption;
end;
procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
Form7.Visible:=true;
Form7.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label6.Caption;
end;
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
Form8.Visible:=true;
Form8.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label7.Caption;
end;
procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
Form9.Visible:=true;
Form9.Caption:='×àñîâà ä³àãðàìà ë³òåðè '+Label8.Caption;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
function GetSubStr(st:string; expl:string; n:integer):string;
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
function TForm2.GetSubStr(st:string; expl:string ;n:integer):string;
Var p,i:integer;
Begin
for i:= 1 to n-1 do
begin
p:=pos(expl,st);
st:=copy(st,p+1,Length(st)-p);
while (pos(expl,st)=1) and (length(st)>0) do
delete(st,1,1);
end;
p:=pos(expl,st);
if p<>0 then result:=copy(st,1,p-1)
else result:=st;
End;
procedure TForm2.FormPaint(Sender: TObject);
var k,i:integer;
a1:array[1..20] of integer;
begin
Color:=clWhite;
//îñ³ êîîðäèíàò
Canvas.MoveTo(10,10);
Canvas.LineTo(10,350);
Canvas.MoveTo(0,340);
Canvas.LineTo(770,340);
Canvas.MoveTo(80,335);
Canvas.LineTo(80,345);
Canvas.MoveTo(140,335);
Canvas.LineTo(140,345);
Canvas.MoveTo(200,335);
Canvas.LineTo(200,345);
Canvas.MoveTo(260,335);
Canvas.LineTo(260,345);
Canvas.MoveTo(320,335);
Canvas.LineTo(320,345);
Canvas.MoveTo(380,335);
Canvas.LineTo(380,345);
Canvas.MoveTo(440,335);
Canvas.LineTo(440,345);
Canvas.MoveTo(500,335);
Canvas.LineTo(500,345);
Canvas.MoveTo(560,335);
Canvas.LineTo(560,345);
Canvas.MoveTo(620,335);
Canvas.LineTo(620,345);
Canvas.MoveTo(680,335);
Canvas.LineTo(680,345);
Canvas.MoveTo(740,335);
Canvas.LineTo(740,345);
Canvas.TextOut(5,150,'1');
Canvas.TextOut(5,320,'0');
Canvas.TextOut(560,365,'ïàðèò.ïàðí.');
Canvas.TextOut(640,365,'ñòîïîâ³ á³òè');
// ïî÷àòêîâèé íóëü
Canvas.MoveTo(20,150);
Canvas.LineTo(20,340);
Canvas.MoveTo(20,340);
Canvas.LineTo(80,340);
//Ðèñóâàííÿ ä³àãðàìè ë³òåðè
//Ââåäåì ìàññèâ
for i:=1 to length(Form1.Edit1.text) do
//Ïðåîáðàçóåì ïîëó÷åííûå ïîäñòðîêè â ÷èñëà
a1[i]:=StrToInt(GetSubStr(Form1.Edit1.text,' ',i));
if a1[1]=1 then
begin
Canvas.MoveTo(80,340);
Canvas.LineTo(80,150);
Canvas.MoveTo(80,150);
Canvas.LineTo(140,150);
end;
if a1[1]=0 then
begin
Canvas.MoveTo(80,340);
Canvas.LineTo(140,340);
end;
if (a1[2] and a1[1])=1 then
begin
Canvas.MoveTo(140,150);
Canvas.LineTo(200,150);
end;
if (a1[1]=0) and (a1[2]=1) then
begin
Canvas.MoveTo(140,340);
Canvas.LineTo(140,150);
Canvas.MoveTo(140,150);
Canvas.LineTo(200,150);
end;
if (a1[2] and a1[1])=0 then
begin
Canvas.MoveTo(140,340);
Canvas.LineTo(200,340);
end;
if (a1[1]=1) and (a1[2]=0) then
begin
Canvas.MoveTo(140,150);
Canvas.LineTo(140,340);
Canvas.MoveTo(140,340);
Canvas.LineTo(200,340);
end;
if (a1[3] and a1[2])=1 then
begin
Canvas.MoveTo(200,150);
Canvas.LineTo(260,150);
end;
if (a1[2]=0) and (a1[3]=1) then
begin
Canvas.MoveTo(200,340);
Canvas.LineTo(200,150);
Canvas.MoveTo(200,150);
Canvas.LineTo(260,150);
end;
if (a1[3] and a1[2])=0 then
begin
Canvas.MoveTo(200,340);
Canvas.LineTo(260,340);
end;
if (a1[2]=1) and (a1[3]=0) then
begin
Canvas.MoveTo(200,150);
Canvas.LineTo(200,340);
Canvas.MoveTo(200,340);
Canvas.LineTo(260,340);
end;
if (a1[4] and a1[3])=1 then
begin
Canvas.MoveTo(260,150);
Canvas.LineTo(320,150);
end;
if (a1[3]=0) and (a1[4]=1) then
begin
Canvas.MoveTo(260,340);
Canvas.LineTo(260,150);
Canvas.MoveTo(260,150);
Canvas.LineTo(320,150);
end;
if (a1[4] and a1[3])=0 then
begin
Canvas.MoveTo(260,340);
Canvas.LineTo(320,340);
end;
if (a1[3]=1) and (a1[4]=0) then
begin
Canvas.MoveTo(260,150);
Canvas.LineTo(260,340);
Canvas.MoveTo(260,340);
Canvas.LineTo(320,340);
end;
if (a1[5] and a1[4])=1 then
begin
Canvas.MoveTo(320,150);
Canvas.LineTo(380,150);
end;
if (a1[4]=0) and (a1[5]=1) then
begin
Canvas.MoveTo(320,340);
Canvas.LineTo(320,150);
Canvas.MoveTo(320,150);
Canvas.LineTo(380,150);
end;
if (a1[5] and a1[4])=0 then
begin
Canvas.MoveTo(320,340);
Canvas.LineTo(380,340);
end;
if (a1[4]=1) and (a1[5]=0) then
begin
Canvas.MoveTo(320,150);
Canvas.LineTo(320,340);
Canvas.MoveTo(320,340);
Canvas.LineTo(380,340);
end;
if (a1[6] and a1[5])=1 then
begin
Canvas.MoveTo(380,150);
Canvas.LineTo(440,150);
end;
if (a1[5]=0) and (a1[6]=1) then
begin
Canvas.MoveTo(380,340);
Canvas.LineTo(380,150);
Canvas.MoveTo(380,150);
Canvas.LineTo(440,150);
end;
if (a1[6] and a1[5])=0 then
begin
Canvas.MoveTo(380,340);
Canvas.LineTo(440,340);
end;
if (a1[5]=1) and (a1[6]=0) then
begin
Canvas.MoveTo(380,150);
Canvas.LineTo(380,340);
Canvas.MoveTo(380,340);
Canvas.LineTo(440,340);
end;
if (a1[7] and a1[6])=1 then
begin
Canvas.MoveTo(440,150);
Canvas.LineTo(500,150);
end;
if (a1[6]=0) and (a1[7]=1) then
begin
Canvas.MoveTo(440,340);
Canvas.LineTo(440,150);
Canvas.MoveTo(440,150);
Canvas.LineTo(500,150);
end;
if (a1[7] and a1[6])=0 then
begin
Canvas.MoveTo(440,340);
Canvas.LineTo(500,340);
end;
if (a1[6]=1) and (a1[7]=0) then
begin
Canvas.MoveTo(440,150);
Canvas.LineTo(440,340);
Canvas.MoveTo(440,340);
Canvas.LineTo(500,340);
end;
if (a1[8] and a1[7])=1 then
begin
Canvas.MoveTo(500,150);
Canvas.LineTo(560,150);
end;
if (a1[7]=0) and (a1[8]=1) then
begin
Canvas.MoveTo(500,340);
Canvas.LineTo(500,150);
Canvas.MoveTo(500,150);
Canvas.LineTo(560,150);
end;
if (a1[8] and a1[7])=0 then
begin
Canvas.MoveTo(500,340);
Canvas.LineTo(560,340);
end;
if (a1[7]=1) and (a1[8]=0) then
begin
Canvas.MoveTo(500,150);
Canvas.LineTo(500,340);
Canvas.MoveTo(500,340);
Canvas.LineTo(560,340);
end;
//ïàðèòåò ïàðíîñò³
Form1.Edit1.Text:=Form1.Edit1.Text+' 0';
k:=0;
for i:=1 to length(Form1.Edit1.text) do
begin
if a1[i]=1 then k:=k+1;
end;
if (k mod 2=0) then
Label1.Caption:='Ïàðèòåò ïàðíîñò³ íóëü '+'(òîìó ùî îäèíèöü '+IntToStr(k)+')';
if (k mod 2=1) then
Label1.Caption:='Ïàðèòåò ïàðíîñò³ îäèíèöÿ '+'(òîìó ùî îäèíèöü '+IntToStr(k)+')';
if (k mod 2=0) and (a1[8]=0) then
begin
Canvas.MoveTo(560,340);
Canvas.LineTo(620,340);
end;
if (k mod 2=0) and (a1[8]=1) then