Source file: /~heha/messtech/ad_da.zip/PAS/ADDAUNIT.PAS

Unit ADDAUnit;{
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º T E C H N I S C H E   U N I V E R S I T Ž T   C H E M N I T Z          º
º                                                                        º
º Programm zur Ansteuerung des AD/DA-Wandlermoduls mit Einchip-          º
º rechner 68HC11                                                         º
º                                                                        º
º UNIT mit programmspezifischen Ausgaberoutinen                          º
º                                                                        º
º Programmierer:    Torsten Levin                                        º
º                   03 AET 89                                            º
º                   TU Chemnitz-Zwickau                                  º
º                                                                        º
º Chemnitz, Januar-April 1993                                            º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
h#s 12/02}

INTERFACE

Uses Crt,Graph,maus,Dos,image,windows,Konstant,diagramm,Print,ADDAModul;

function Betriebsart:Boolean;
Procedure XZoom;
Procedure YSkalierung;
Procedure Druckebildschirm;
Procedure DirektAD;
Procedure DirektDA;
procedure ScreenInit;

IMPLEMENTATION

function Betriebsart:Boolean;
 Const
  Hauptfenster='0..7 Kanal   >P< Pause   >E/Z< Einmalig/Zyklisch   >Return< OK   >ESC< Abbruch';
  Pausenzeit  ='Pausenzeit zwischen den zyklischen Umsetzungen    >Return< OK   >ESC< Abbruch';
 Var
  i: Integer;
  c          : String[1];
  Betriebvar : Betriebstyp;
  PauseStr   : String;
  Valtest    : Integer;
  Kanalvar   : Kanaltyp;
  Valwert    : Real;

 Procedure OutKanal;
  Var i: Integer;
  Begin
   for i:=0 to 7 do Schalter(120,140+22*i,Kanalvar[i]);
  End;
 Procedure Outbetrieb;
  Begin
   Schalter(240,140,Betriebvar=Einmalig);
   Schalter(240,162,Betriebvar=Zyklisch);
  End;
 function NumKanal:Integer;
  var i,ret: Integer;
  begin
   ret:=0;
   for i:=0 to 7 do if Kanalvar[i] then Inc(ret);
   NumKanal:=ret;
  end;

 Begin
  Betriebsart:=False;
  Kanalvar:=Daten.Kanalnr;
  Betriebvar:=Daten.Betriebnr;
  str(Daten.Pause,Pausestr);
  Openwindow2(100,100,250,220,2,4,'Betriebsart ADU',true);
  StatusZeile(HauptFenster);
  OutKanal;
  OutBetrieb;
  for i:=0 to 7 do Begin
   Pressknopf2(115,137+22*i,95,18,true);
   str(i,c);
   setcolor(Daten.Color[3]);
   outtextxy(140,143+22*i,'Kanal '+c);
   outtextxy(139+48,144+22*i,'_');
  End;
  OuttextUL(260,143,'Einmalig');
  OuttextUL(260,165,'Zyklisch');
  RightTextXY(295,200,Pausestr);
  Outtextxy(300,200,'[ms]');
  Pressknopf(235,137,340,155);
  Pressknopf(235,159,340,177);
  knopf2(243,220,89,20,'&Pausenzeit',1,3);
  knopf2(235,260,105,20,'OK',1,3);
  knopf2(235,290,105,20,'Abbruch',1,3);
  Pressknopf(235,185,340,250);
  Pressknopf(234,184,341,251);
  Pressknopf(250,197,297,210);
  Repeat
   Eingabe2;
{   Until (ord(ta) in [13,27,48..55,69,80,90,101,112,122]) or (mb=1);}
   if Hit(#13,235,260,105,20) then begin
    if NumKanal=0 then Begin
     Fehler(200,200,False,'Es wurde kein','AD-Kanal gew„hlt!',
       'Diese Einstellung','ist nicht zul„ssig.');
     StatusZeile(HauptFenster);
    End else begin
     Daten.Kanalnr:=Kanalvar;
     Daten.Betriebnr:=Betriebvar;
     Betriebsart:=True;
     break;
    end;
   end;
   if Hit(#27,235,290,105,20) then break;
   if Hit('P',243,220,89,20) then begin
    StatusZeile(Pausenzeit);
    If edit(250,190,'Pausenzeit',5,0,'Eingabe der Pausenzeit',
     'w„hrend der Umsetzung','[ 0 ... 65535 ms ]',PauseStr) Then Begin
     Val(PauseStr,ValWert,ValTest);
     if Round(ValWert)>65535 then Valwert:=65535;
{        if Pausestr='' then Pausestr:='0';}
     Str(Round(Valwert),Pausestr);
     bar(252,198,294,209);
     RightTextXY(295,200,Pausestr);
     Daten.Pause:=Round(ValWert);
    End;
    StatusZeile(HauptFenster);
   End;
   if Hit('E',240,140,12,12) then begin
    Betriebvar:=Einmalig;
    OutBetrieb;
   end;
   if Hit('Z',240,162,12,12) then begin
    Betriebvar:=Zyklisch;
    OutBetrieb;
   end;
   for i:=0 to 7 do if Hit(chr(i+ord('0')),120,140+22*i,12,12) then begin
    Kanalvar[i]:=not Kanalvar[i];
    If NumKanal>4 Then begin
     Kanalvar[i]:=False;
     Fehler(200,200,false,'Es k”nnen nur','4 Kan„le gleich-','zeitig angew„hlt','werden!');
     StatusZeile(HauptFenster);
    End;
    outkanal;
   end;
  Until false;
  CloseWindow;
 End;

{---Prozedur zum Zoomen in X-Richtung----------------------}
Procedure XZoom;
 Const Status=#27' '#26' Bewegen   >Leertaste< Wechseln   '+
	     '>N< Normal   >Return< OK   >ESC< Abbruch';
 Var
  xpos1,xpos2:Integer;
  xmove:^Integer;	{Referenz, zeigt entweder auf xpos1 oder auf xpos2}
 Procedure OutWerte;
  var
   c: String[32];
  Begin
   setfillstyle(1,Daten.Color[1]);
   bar(461,59,534,69);
   bar(546,59,619,69);
   bar(461,44,534,54);
   bar(546,44,619,54);
   setcolor(Daten.Color[3]);
   str(XMasstab*(xpos1-40)+Xmin:5:0,C);
   RightTextXY(532,46,c);
   str((XMasstab*(xpos1-40)+Xmin)*Daten.Urate:3:3,C);
   RightTextXY(532,61,c);
   str(XMasstab*(xpos2-40)+Xmin:5:0,C);
   RightTextXY(617,46,c);
   str((XMasstab*(xpos2-40)+Xmin)*Daten.Urate:3:3,C);
   RightTextXY(617,61,c);
  End;
 procedure DrawLines;
 {Zeigt oder entfernt (XorPut!) die Linien an xpos1 und xpos2}
  begin
   setwritemode(XorPut);
   setlinestyle(1,0,0);
   setcolor(Daten.Color[1]);
   line(xpos1,105,xpos1,370);
   setlinestyle(2,0,0);
   line(xpos2,105,xpos2,370);
   setwritemode(NormalPut);
   setlinestyle(0,0,0);
  end;
 procedure SwapReference;
 {Tauscht die Refernz aus}
  begin
   if xmove=@xpos1 then xmove:=@xpos2 else xmove:=@xpos1;
  end;
 procedure KeepOrder;
 {Sorgt f�r xpos1<=xpos2 und tauscht ggf. auch die Referenz xmove}
  var
   h: Integer;
  begin
   if xpos1>xpos2 then begin
    h:=xpos2; xpos2:=xpos1; xpos1:=h;	{tauschen}
    SwapReference;
   end;
  end;
 var
  mausvor:Boolean;
 Begin
  xpos1:=315;
  xpos2:=315;
  xmove:=@xpos1;
  Openwindow2(385,3,245,100,2,4,'X-Zoom',true);
  Knopf2(390,77,75,20,'OK',1,3);
  Knopf2(470,77,75,20,'Abbruch',1,3);
  Knopf2(550,77,75,20,'&Normal',1,3);
  pressknopf(460,58,535,70);
  pressknopf(545,58,620,70);
  pressknopf(460,43,535,55);
  pressknopf(545,43,620,55);
  backknopf(390,29,625,73);
  OutWerte;
  StatusZeile(Status);
  Outtextxy(482,33,'Von:');
  Outtextxy(567,33,'Bis:');
  Outtextxy(395,46,'St�tzst.');
  Outtextxy(395,61,' t [ms] ');
  DrawLines;
  Repeat
   mausvor:=mb<>0;
   Eingabe2;
   if Hit(#13,390,77,75,20) then begin
    ta:=#13;
    Xmax:=Round(XMasstab*(xpos2-40))+Xmin;
    Xmin:=Round(XMasstab*(xpos1-40))+Xmin;
    If Xmax-Xmin<10 Then Xmax:=Xmin+10;
    XAutomatik:=False;
    break;
   End;
   if Hit(#27,470,77,75,20) then begin
    DrawLines;
    break;
   End;
   if Hit('N',550,77,75,20) then begin
    ta:=#13;
    XAutomatik:=True;
    break;
   End;
   if MausInRect(40,106,590,330) and (mb<>0) then begin
    DrawLines;
    if mausvor then begin
     xmove^:=mx;
    end else begin
     xpos1:=mx;	{dr�cken: linke Linie}
     xpos2:=mx;	{und rechte Linie gleich setzen}
    end;
    KeepOrder;
    DrawLines;
    Outwerte;
   End;
   case ta of
    #0: Begin
     DrawLines;
     Case tahi of
      77  : Inc(xmove^);	{Pfeil rechts}
      75  : Dec(xmove^);	{Pfeil links}
      116,$51: Inc(xmove^,10);	{Strg+Pfeil rechts, Bild Ab}
      115,$49: Dec(xmove^,10);	{Strg+Pfeil links, Bild Auf}
     End;
     If xmove^<40 Then xmove^:=40;
     If xmove^>630 then xmove^:=630;
     KeepOrder;
     DrawLines;
     OutWerte;
    end;
    ' ': SwapReference;
   end{case ta};
  Until false;
  CloseWindow;
  if ta=#13 then MaleKurve;
 End;

{---Freie Y-Skalierung des Diagramms-----------------------}
Procedure YSkalierung;
 Const Status='>Y< Automatik    >I< Minimum    >A< Maximum    >Return< OK    >ESC< Abbruch';
 Var
  AutoMerk : Boolean;
  YmaxMerk,
  YminMerk : TReal;
 procedure SetAutoMerk(NewAuto:Boolean);
  begin
   AutoMerk:=NewAuto;
   Schalter(202,209,NewAuto);
  end;
 procedure SetMaxMerk(NewMerk:TReal);
  var
   C: String[32];
  begin
   YmaxMerk:=NewMerk;
   Str(YmaxMerk:1:2,C);
   Setfillstyle(1,Daten.Color[1]);
   Bar(326,138,371,148);
   Bar(338,155,406,165);
   RightTextXY(369,140,C);
   Outtextxy(341,157,ByteToBit(Round(YmaxMerk/DAQ)+BipOffset));
  end;
 procedure SetMinMerk(NewMerk:TReal);
  var
   C: String[32];
  begin
   YminMerk:=NewMerk;
   Str(YminMerk:1:2,C);
   Setfillstyle(1,Daten.Color[1]);
   Bar(201,138,246,148);
   Bar(213,155,282,165);
   RightTextXY(244,140,C);
   Outtextxy(216,157,ByteToBit(Round(YminMerk/DAQ)+BipOffset));
  end;
 var
  Test: Integer;
  C: String;
 Begin
  Openwindow2(180,100,260,165,2,4,'Y-Skalierung',true);
  Knopf2(210,235,90,20,'OK',1,3);
  Knopf2(320,235,90,20,'Abbruch',1,3);
  Statuszeile(Status);
  Pressknopf(200,137,247,149);
  Pressknopf(212,154,283,166);
  Pressknopf(190,130,305,195);
  Pressknopf(191,131,304,194);

  Pressknopf(325,137,372,149);
  Pressknopf(337,154,407,166);
  Pressknopf(315,130,430,195);
  Pressknopf(316,131,429,194);

  Pressknopf(195,206,425,224);
  Setcolor(Daten.Color[3]);
  OuttextUL(227,211,'Y-Skalierungsautomatik');
  Outtextxy(255,140,'U [V]');
  Outtextxy(380,140,'U [V]');
  SetAutoMerk(YAutomatik);
  SetMaxMerk(Ymax);
  SetMinMerk(Ymin);

  Knopf2(200,170,95,20,'M&inimum',1,3);
  Knopf2(325,170,95,20,'M&aximum',1,3);
  Repeat
   Eingabe2;
   If Hit('Y',202,209,12,12) Then SetAutoMerk(not Automerk);
   If Hit(#13,210,235,90,20) Then Begin
    ta:=#13;
    YAutomatik:=AutoMerk;
    Ymax:=YmaxMerk;
    Ymin:=YminMerk;
    break;
   End;
   If Hit(#27,320,235,90,20) Then break;
   If Hit('A',325,170,95,20) Then Begin	{Maximum}
    Str(YmaxMerk:1:2,C);
    If edit(250,190,'Y-Maximum',5,1,'GrӇte positive Spannung',
	   'in 10mV-Schritten','[ 0.05..4.96 V ]',C) Then Begin
     Val(C,YmaxMerk,Test);
     YmaxMerk:=Round(YmaxMerk*100)/100;
     If YmaxMerk<0.05 Then YmaxMerk:=0.05;
     If YmaxMerk>4.96 Then YmaxMerk:=4.96;
     SetMaxMerk(YmaxMerk);
     SetAutoMerk(false);
    End;
   End;
   If Hit('I',200,170,95,20) Then Begin	{Minimum}
    Str(YminMerk:1:2,C);
    If edit(250,190,'Y-Minimum',5,1,'Kleinste negative Spannung',
	   'in 10mV-Schritten','[ -5..-0.05 V ]',C) Then Begin
     Val(C,YminMerk,Test);
     YminMerk:=Round(YminMerk*100)/100;
     If YminMerk<-5 Then YminMerk:=-5;
     If YminMerk>-0.05 Then YminMerk:=-0.05;
     SetMinMerk(YminMerk);
     SetAutoMerk(False);
    End;
   End;
  Until false;
  CloseWindow;
  if ta=#13 then begin	{OK gedr�ckt}
   Beschriften;
   Malekurve;
  end;
 End;

{---Prozedur f�r einen Bildschirmausdruck------------------}
Procedure Druckebildschirm;
 Const
  Druckfarben : ColorPal=(15,15,0,0,15,0,0,0,0,0,0,0);
  Days : array [0..6] of String[10] =(
  'Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag');

 Var
  FarbMerk: ColorPal;
  y, m, d, dow : Word;
  yc,mc,dc     : String[4];
  IO           : Boolean;
  Error        : Byte;

 function Druckhinweis(X,Y:Integer):Boolean;
  Const Status='Ausdrucken des aktuellen Bildschirms       >Return< OK       >ESC< Abbruch';
  Var
   C    : String[1];
  begin
   Druckhinweis:=False;
   openwindow2(x,y,340,140,2,4,'Bildschirm drucken',True);
   putpicture('druck',x+5,y+40);
   StatusZeile(Status);
   setcolor(Daten.Color[3]);
   settextstyle(0,0,1);
   If Inst.LPT=1 Then C:='1' else C:='2';

   outtextxy(x+80,y+40,'Machen Sie den Drucker an LPT'+C);
   outtextxy(x+80,y+55,'fertig. Bei Wahl von OK beginnt');
   outtextxy(x+80,y+70,'sofort der Ausdruck. W„hrend des');
   outtextxy(x+80,y+85,'Druckens mit >ESC< abbrechen.');
   knopf2(x+20,y+110,90,20,'OK',1,3);
   knopf2(x+130,y+110,90,20,'Abbruch',1,3);
   repeat
    eingabe2;
    If Hit(#13,x+20,y+110,90,20) Then Begin
     Druckhinweis:=True; break;
    End;
    If Hit(#27,x+130,y+110,90,20) Then break;
   Until false;
   closewindow;
  End;

 procedure PutError(Error:Integer);
  begin
   Case Error of
    1: Fehler(200,100,False,'Die Wartezeit','ist abgelaufen.','Der Druckvorgang','wird beendet.');
    2: Fehler(200,100,False,'Ausgabefehler','am Drucker!','Der Druckvorgang','wird beendet.');
    3: Fehler(200,100,False,'Kein Papier bzw.','Ger„t nicht bereit!','Der Druckvorgang','wird beendet.');
    4: Fehler(200,100,False,'Der Drucker zeigt','keine Reaktion!','Der Druckvorgang','wird beendet.');
    5: Fehler(200,100,False,'Kein Drucker ge-','funden!','Der Druckvorgang','wird beendet.');
   end;
  end;

 Begin
  If Druckhinweis(150,120) then Begin
   InitLPT(Inst.LPT,Error);
   PutError(Error);
   if error=0 then begin
    FarbMerk:=Daten.Color;
    Daten.Color:=Druckfarben;
    clearscreen('AD/DA-Wandlermodul','TU Chemnitz');
    GetDate(y,m,d,dow);
    str(y,yc);
    str(m,mc);
    str(d,dc);
    StatusZeile('Ausdruck vom '+Days[dow]+', den '+dc+'.'+mc+'.'+yc);
    MaleKurvenWin;
    MaleKurve;
    OutXAchse;
    HardCopy(Inst.LPT,Error);
    Daten.Color:=FarbMerk;
    ScreenInit;
    PutError(Error)
   End;
  End;
 End;

{---Direkte AD-Umsetzung-----------------------------------}
Procedure DirektAD;

 Const Status='>E< Einmalige Umsetzung      >Z< Zyklische Umsetzung      >ESC< Abbruch';
       StatusZ='Zyklische Umsetzung l„uft...                             >ESC< Abbruch';
 Var
  Ende,Okay: Boolean;
  KanalNr: Integer;
  C: String;

 procedure DirektAnzeige;
  begin
   SetWaitCursor(true);
   Okay:=modul(2,AdPrPuffer,0,AdStartAdr,1,4) { starten }
     and modul(3,AdPrPuffer,0,0,1,4);   { Datum holen }
   SetWaitCursor(false);
   setfillstyle(1,Daten.Color[1]);
   Bar(241,161,469,196);
   Bar(241,206,469,234);
   str((DirektWert-BipOffset)*DAQ:1:3,C);
   setcolor(Daten.Color[3]);
   settextStyle(0,0,4);
   RightTextXY(435+32,165,C+'V');
   settextstyle(0,0,3);
   Outtextxy(265,210,ByteToBit(DirektWert));
   settextStyle(0,0,0);
  end;

 Begin
  If not IsModulInit('Eine Umsetzung ist','nicht m”glich.') Then exit;
  Ende:=False;
  Okay:=True;
  KanalNr:=1;
  if not Auswahl(100,100,'AD-Direktumsetzung',ADKanaldaten,KanalNr)
  then exit;
  Dec(KanalNr);
  openwindow2(150,100,340,200,2,4,
    'ADU-Direktbetrieb Kanal '+chr(KanalNr+48),True);
  putpicture('ADU',170,150);
  knopf2(170,270,90,20,'&Einmalig',1,3);
  knopf2(280,270,90,20,'&Zyklisch',1,3);
  knopf2(390,270,90,20,'Abbruch',1,3);
  pressknopf(230,140,480,245);
  pressknopf(231,141,479,244);
  pressknopf(240,160,470,197);
  pressknopf(240,205,470,235);
  setcolor(Daten.Color[3]);
  Outtextxy(254,147,'Eingelesener Wert:');
  StatusZeile(Status);
  SetWaitCursor(true);
  Okay:=MapBinaryData(AdPrNameD,AdPrPuffer,AdPrSize)
    { Programmdatei f�r Direkt-Betrieb }
    and modul(1,AdPrPuffer,AdPrSize,0,0,4) { Direkt-Programm laden }
    and KanalWahl(KanalNr); { Kanal einstellen }
  SetWaitCursor(false);
  If Okay Then Begin
   Repeat
    Eingabe2;
{    Until (mb=1) or (Ord(Ta) in [27,69,90,101,122]);}
    If Hit('E',170,270,90,20) Then Begin
     DirektAnzeige;
    End;
    If Hit('Z',280,270,90,20) Then Begin
     Statuszeile(StatusZ);
     openwindow2(250,260,230,50,5,6,'Zyklische AD-Umsetzung',True);
     setcolor(Daten.Color[3]);
     outtextxy(295,292,'Abbruch mit >ESC<');
     repeat
      DirektAnzeige;
      Taste;
     until (ta=#27) or (not Okay);
     settextStyle(0,0,0);
     Closewindow;
     ta:=#1;
     Statuszeile(Status);
    End;
    If Hit(#27,390,270,90,20) Then Begin
     SetWaitCursor(true);
     Okay:=MapBinaryData(AdPrName,AdPrPuffer,AdPrSize)
	 { Progr.datei wieder fuer Normal-Betrieb }
       and modul(1,AdPrPuffer,AdPrSize,0,0,4) { AD-Programm laden }
       and SStellenEinstellen(Round(Daten.SStellen))
       and UrateEinstellen(Daten.Urate);
     SetWaitCursor(false);
     Ende:=True;
    End;
   Until Ende or Not Okay;
   If Not Okay Then Begin
    Fehler(200,150,False,'W„hrend der Um-','setzung ist ein','nicht behebbarer','Fehler aufgetreten');
    ModulInit:=False;
   End;
  End
  else FehlerReagiertNicht;
  Closewindow;
 End;

function ValBin(const s:String):Integer;
{Bin„r-String in Zahl wandeln}
 var
  i,v:Integer;
 begin
  v:=0;
  for i:=1 to Length(s) do begin
   if not (s[i] in ['0','1']) then break;
   v:=v+v;
   if s[i]='1' then Inc(v);
  end;
  ValBin:=v;
 end;

{---Direkte DA-Umsetzung-----------------------------------}
Procedure DirektDA;
 Const Status='0,1 Direkte Eingabe    '#24#25+
	     ' Auf/Ab    >U< Start der Umsetzung     >ESC< Abbruch';
 Var
  C: String[8];		{h„lt die Bits}
 Procedure OutCursor(Stelle:Integer);
  Var i : Integer;
  Begin
   If Stelle>8 Then Stelle:=8;
   setcolor(Daten.Color[1]);
   settextstyle(0,0,3);
   For i:=1 To 8 Do Outtextxy(241+24*i,213,'_');
   setcolor(Daten.Color[3]);
   Outtextxy(241+24*Stelle,213,'_');
   settextstyle(0,0,0);
  End;
 procedure OutVolt;	{die "Volt" stehen in <DirektWert>}
  var
   c1: string[8];
  begin
   setfillstyle(1,Daten.Color[1]);
   Bar(241,161,469,196);
   setcolor(Daten.Color[3]);
   str((DirektWert-BipOffset)*DAQ:1:3,C1);
   settextStyle(0,0,4);
   RightTextXY(435+32,165,C1+'V');
   settextstyle(0,0,0);
  end;
 procedure OutBits;	{die "Bits" stehen in <C>}
  begin
   setfillstyle(1,Daten.Color[1]);
   Bar(241,206,469,234);
   setcolor(Daten.Color[3]);
   settextstyle(0,0,3);
   Outtextxy(265,210,C);
   settextStyle(0,0,0);
  end;

 var
  Ende,Okay: Boolean;
 Begin
  If not IsModulInit('Eine Umsetzung ist','nicht m”glich.') Then exit;
  Ende:=False;
  Okay:=True;
  C:='';
  openwindow2(150,100,340,200,2,4,'DAU-Direktbetrieb',True);
  putpicture('DAU',170,150);
  knopf2(170,270,90,20,'&Umsetzung',1,3);
  knopf2(280,270,90,20,'Abbruch',1,3);
  pressknopf(230,140,480,250);
  pressknopf(231,141,479,249);
  pressknopf(240,160,470,197);
  pressknopf(240,205,470,240);
  setcolor(Daten.Color[3]);
  Outtextxy(254,147,'Auszugebender Wert:');
  OutCursor(1);
  StatusZeile(Status);
  SetWaitCursor(true);
  Okay:=MapBinaryData(DAPrNameD,DAPrPuffer,DAPrSize)
	 { Programmdatei fuer Direkt-Betrieb }
    and modul(1,DAPrPuffer,DAPrSize,0,0,4); { Direkt-Programm laden }
  SetWaitCursor(false);
  If Okay Then Begin
   Repeat
    Eingabe2;
    If ta in ['0','1'] Then Begin
     If Length(C)<8 Then C:=C+Ta
     else Begin
      C:=Ta;
      setfillstyle(1,Daten.Color[1]);
      Bar(241,161,469,196);	{"Volt" l”schen}
     End;
     OutBits;
     If Length(C)=8 Then Begin
      DirektWert:=ValBin(C);
      OutVolt;
     End;
     OutCursor(Length(C)+1);
    End;
    If (ta=#0) and (tahi in [72,80]) Then Begin
     If Length(C)=8 Then Begin
      If tahi=72 Then Inc(DirektWert) Else Dec(DirektWert);
      OutVolt;
      C:=ByteToBit(DirektWert);
      OutBits;
     End Else Beep(500,150);
    End;
    If Hit('U',170,270,90,20) Then Begin
     If Length(C)=8 Then Begin
      Okay:=Okay and modul(4,DAPrPuffer,0,0,1,5) { Datum senden }
	and modul(2,DAPrPuffer,0,DAStartAdr,1,4);   { starten }
     End Else Beep(500,150);
    End;
    If Hit(#27,280,270,90,20) Then Begin
     SetWaitCursor(true);
     Okay:=MapBinaryData(DAPrName,DAPrPuffer,DAPrSize)
       and modul(1,DAPrPuffer,DAPrSize,0,0,4) { AD-Programm laden }
       and SStellenEinstellen(Round(Daten.SStellen))
       and UrateEinstellen(Daten.Urate);
     SetWaitCursor(false);
     Ende:=True;
    End;
   Until Ende or Not Okay;
   If Not Okay Then Fehler(200,150,False,'W„hrend der Um-','setzung ist ein','nicht behebbarer','Fehler aufgetreten');
  End else FehlerReagiertNicht;
  Closewindow;
 End;

procedure ScreenInit;
 begin
  ClearScreen('AD/DA-Wandlermodul','TU Chemnitz');
  MaleKurvenWin;               { Zeichnen des Kurvenfensters }
  Beschriften;                 { Skalieren und Zeichnen der Y-Achse }
  MaleKurve;
  OutXAchse;                   { Zeichnen der X-Achse }
 end;

End.
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded