program azimuth;

uses crt,graph;

const bperror=50;

var i,gd,gm,C:integer;

    pw1,pw2:array[1..1023] of word;

    str1:string;

 

 

function getcap(index:integer):integer;

label a1,a2;

var a,b,b1,b2,k2,k1,k9,k3,k,z:integer;

begin

     port[$378]:=255;port[$37a]:=1;

     delay(bperror);

     z:=port[$379];

     if index=1 then begin k1:=5;k9:=13;k3:=7;k2:=15;port[$378]:=0;end

     else begin k1:=1;k9:=9;k3:=3;k2:=11;port[$378]:=0;end;

     b:=0;B1:=0;B2:=0;C:=0;

 

     repeat

     port[$37a]:=k1;

     delay(bperror);

      IF port[889]<>Z THEN begin c:=768;break;end;

      port[$37a]:=k9;

      delay(bperror);

     IF port[889]<>Z THEN begin c:=512;break;end;

     port[$37a]:=k3;

     delay(bperror);

     IF port[889]<>Z THEN begin c:=256;break;end;

     c:=0;

          port[890]:=k2;{c:=0;}

     until 1=1;

 

     delay(bperror);

     b:=128;A:=64;

     while a>=1 do begin

     port[888]:=b;

     delay(bperror);

     if port[889]<>z then b:=b+a else b:=b-a;

     IF A=1 THEN break;

     A:=ROUND(A/2);

end;

getcap:=(b+c);

end;

 

procedure setcap(index:integer);

var k1,k2:byte;

begin

     if index>=768 then begin

        k1:=4;k2:=index-768

     end;

   if (index>=512)AND(INDEX<768) then

             begin

                  k1:=12;

                  k2:=index-512;

             end;

              if (index>=256)AND(INDEX<512) then

              begin

                   k1:=6;k2:=index-256;

              end;

        if index<256 then begin

                   k1:=14;k2:=index;

              end;

          port[888]:=k2;

          port[890]:=k1;

end;

 

procedure drawgraph1;

begin

           setcolor(lightgray);

      i:=15;

      outtextxy(40,440,'320');

      outtextxy(620,440,'60');

      outtextxy(320,440,'180');

           setcolor(darkgray);

     while i<=192 do

          begin

          line(10,i,660,i);i:=i+20;

          end;

          i:=10;

     while i<=660 do

          begin

          line(i,10,i,192);i:=i+20;

          end;

                i:=235;

     while i<=440 do

          begin

          line(10,i,660,i);i:=i+20;

          end;

          i:=10;

     while i<=660 do

          begin

          line(i,235,i,440);i:=i+20;

          end;

 

          outtextxy(200,205,'Сбор данных о диапазоне...');

     for i:=100 to 740 do

         if i mod 2 = 0 then begin

          setcap(i);

         delay(10*bperror);

          pw1[i]:=round(getcap(2)/2-150);

          SETCOLOR(GREEN);

          line(i-99,185-round(pw1[I]/1.5)+10,i-101,185-round(pw1[i-2]/1.5)+10);

 

          end;

          setfillSTYLE(1,0);

          BAR(200,205,470,215);

end;

 

procedure drawgraph2(index:word);

var stall:integer;pgc1,pgc2,gc1,gc2,sgc:word;

begin

     stall:=getcap(1);

     if stall<250 then begin

        setcolor(15);outtextxy(200,205,'Необходимо настроить антенну');

        repeat until getcap(1)>250;

        stall:=250;

     end;

     setfillstyle(1,0);bar(200,205,470,215);

     setcolor(15);outtextxy(200,205,'Запустите двигатель');

     repeat delay(bperror) until abs(getcap(1)-stall)>3;

     setfillstyle(1,0);bar(200,205,470,215);

     setcolor(lightgreen);sgc:=getcap(2);

     pgc2:=getcap(2);pgc1:=getcap(1);

     repeat

     setcap(index);

     delay(bperror);

     gc1:=getcap(1);gc2:=getcap(2);

 

     if pgc1>gc1 then begin line(765-gc1*3,350+(sgc-gc2),765-pgc1*3,350+(sgc-pgc2));delay(5*bperror);

     pgc1:=gc1;pgc2:=gc2;

          pw2[gc1]:=gc2;

           end;

     until gc1<40;

end;

 

function selectstation:word;

var eq,neq:word;

begin

     eq:=0;neq:=0;

     for i:=100 to 740 do

     if pw1[i]>eq then begin neq:=i;eq:=pw1[i];end;

     setcolor(lightred);

     line(neq-99,round(eq/1.5),neq-99,round(eq/1.5)+20);

     selectstation:=neq;

end;

 

function select:word;

var eq,neq:word;

begin

     eq:=0;neq:=0;

     for i:=40 to 240 do

     if pw2[i]>eq then begin neq:=i;eq:=pw2[i];end;

     setcolor(lightred);

 line(765-neq*3,350,765-neq*3,370);

     select:=neq;

end;

 

begin

     gd:=detect;

     gm:=0;

     initgraph(gd,gm,'.');

     drawgraph1;

     str(selectstation,str1);

     setcolor(white);

     str1:='Максимум на частоте '+str1;

     outtextxy(10,460,str1);

     drawgraph2(selectstation);

     str(round(select/255*360),str1);

     str1:='Азимут '+str1;

     setcolor(white);

     outtextxy(300,460,str1);

     outtextxy(400,460,'Построение закончено.');

     readln;

     closegraph;

 

end.