Распознавание данных из СОМ-порта - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Хелпаните с лабой комрады. Собственно само задание: составить программу считывания данных из СОМ-порта, генерируемых манипулятором Мышь. Serial Mouse — мышь с последовательным интерфейсом, подключаемая через 9- или 25-контактный разъем СОМ-порта Собственно сам код проги:
program ComMouse;
 
uses
    Crt, Graph;
 
{type
  TTryData =}
 
var
  { Data }
  Dat0, Dat1, Dat2, Dat3, Dat4 : Byte;
  PortAdr : Word;
 
  { Mouse }
  LBut, MBut, RBut : Boolean;
  PX, PY : Integer;
 
function TryMS : boolean; far;
var
  r : Boolean;
begin
  r := False;
  asm
      MOV   DX,    PortAdr
      ADD   DX,    5
      IN    AL,    DX
      TEST  AL,    01h
      JZ    @x
 
      SUB   DX,    5
      IN    AL,    DX
      TEST  AL,    40h
      JZ   @x
 
      MOV   Dat0,  AL
 
      ADD   DX,    5
  @1: IN    AL,    DX
      TEST  AL,    80h
      JNZ   @x
      TEST  AL,    01h
      JZ    @1
      SUB   DX,    5
 
      IN    AL,    DX
      MOV   Dat1,  AL
 
      ADD   DX,    5
  @2: IN    AL,    DX
      TEST  AL,    80h
      JNZ   @x
      TEST  AL,    01h
      JZ    @2
      SUB   DX,    5
 
      IN    Al,    DX
      MOV   Dat2,  AL
 
      MOV   AH,    Dat0
      SHL   AH,    6
      MOV   AL,    Dat1
      AND   AL,    3Fh
      OR    AH,    AL
      SAR   AX,    8
      ADD   PX,    AX
 
      MOV   AH,    Dat0
      AND   AH,    0Ch
      SHL   AH,    4
      MOV   AL,    Dat2
      AND   AL,    3Fh
      OR    AH,    AL
      SAR   AX,    8
      ADD   PY,    AX
 
      MOV   AL,    Dat0
      MOV   LBut,  False
      TEST  Al,    20h
      JZ   @r
      MOV   LBut,  True
  @r: MOV   MBut,  False
      MOV   RBut,  False
      TEST  Al,    10h
      JZ   @t
      MOV   RBut,  True
 
  @t: MOV   r,     True
  @x:
  end;
  TryMS := r;
end;
 
function TryPC : boolean;  far;
var
  r : Boolean;
begin
  r := False;
  asm
      MOV   DX,    PortAdr
      ADD   DX,    5
      IN    AL,    DX
      TEST  AL,    01h
      JZ    @x
 
      SUB   DX,    5
      IN    AL,    DX
      MOV   AH,    AL
      AND   AH,    $F8
      CMP   AH,    80h
      JNE   @x
 
      MOV   Dat0,  AL
 
      ADD   DX,    5
  @1: IN    AL,    DX
      TEST  AL,    80h
      JNZ   @x
      TEST  AL,    01h
      JZ    @1
      SUB   DX,    5
 
      IN    AL,    DX
      MOV   Dat1,  AL
 
      ADD   DX,    5
  @2: IN    AL,    DX
      TEST  AL,    80h
      JNZ   @x
      TEST  AL,    01h
      JZ    @2
      SUB   DX,    5
 
      IN    Al,    DX
      MOV   Dat2,  AL
 
      ADD   DX,    5
  @3: IN    AL,    DX
      TEST  AL,    80h
      JNZ   @x
      TEST  AL,    01h
      JZ    @3
      SUB   DX,    5
 
      IN    Al,    DX
      MOV   Dat3,  AL
 
      ADD   DX,    5
  @4: IN    AL,    DX
      TEST  AL,    80h
      JNZ   @x
      TEST  AL,    01h
      JZ    @4
      SUB   DX,    5
 
      IN    Al,    DX
      MOV   Dat4,  AL

      MOV   AH,    Dat1
      SAR   AX,    8
      ADD   PX,    AX
 
      MOV   AH,    Dat2
      SAR   AX,    8
      SUB   PY,    AX
 
      MOV   AL,    Dat0
      MOV   RBut,  False
      TEST  Al,    01h
      JNZ   @r
      MOV   RBut,  True
  @r: MOV   MBut,  False
      TEST  Al,    02h
      JNZ   @s
      MOV   MBut,  True
  @s: MOV   LBut,  False
      TEST  Al,    04h
      JZ   @t
      MOV   LBut,  True
 
  @t: MOV   r,     True
  @x:
  end;
  TryPC := r;
end;
 
type
  TTryMouse = function : Boolean;
var
  TryMouse : TTryMouse;
 
procedure InitPC;
begin
     asm
        MOV   AX, 40h
        MOV   ES, AX
        MOV   DX, ES:[0]
        MOV   PortADR, DX
        ADD   DX, 3
        MOV   AL, 10000000b
        OUT   DX, AL
        SUB   DX, 2
        XOR   AL, AL
        OUT   DX, AL
        DEC   DX
        MOV   AL, 60h
        OUT   DX, AL
 
        MOV   AL, 00000011b
        ADD   DX, 3
        OUT   DX, AL
 
        SUB   DX, 2
        MOV   AL, 0
        OUT   DX, AL
 
        XOR   AX, AX
        MOV   PX, AX
        MOV   PY, AX
     end;
  TryMouse := TryPC;
end;
 
procedure InitMS;
begin
     asm
        MOV   AX, 40h
        MOV   ES, AX
        MOV   DX, ES:[0]
        MOV   PortADR, DX
 
        ADD   DX, 3
        MOV   AL, 10000000b
        OUT   DX, AL
        SUB   DX, 2
        XOR   AL, AL
        OUT   DX, AL
        DEC   DX
        MOV   AL, 60h
        OUT   DX, AL
        MOV   AL, 00000010b
        ADD   DX, 3
        OUT   DX, AL
 
        SUB   DX, 2
        MOV   AL, 0
        OUT   DX, AL
 
        XOR   AX, AX
        MOV   PX, AX
        MOV   PY, AX
     end;
  TryMouse := TryMS;
end;
 
procedure UpDatePicture;
const
  Page : integer = 0;
var
  C : Word;
  S : String;
begin
  Page := Page xor 1;
  SetActivePage(Page);
  SetBkColor(Black);
  ClearDevice;
  SetColor(White);
  OutTextXY(10,10,'Press Q to exit');
  OutTextXY(10,20,'Press P to Init PC-Mouse');
  OutTextXY(10,30,'Press M to Init MS-Mouse');
 
  Str(PX,S);
  OutTextXY(GetMaxX-80,GetMaxY-10,S);
  Str(PY,S);
  OutTextXY(GetMaxX-40,GetMaxY-10,S);
end;
 
var
  GrDriv, GrMode : Integer;
begin
                { Init Graph Section }
  GrDriv := VGA;
  InitGraph(GrDriv,GrMode,'С:\BP\BGI');
  UpDatePicture;
                { Maim Program Loop }
  while true do
    begin
                { Read A Command }
      if KeyPressed then
        case ReadKey of
          'Q','q' : break;
          'M','m' : InitMS;
          'P','p' : InitPC;
        end;
                { Read A Mouse }
      if Assigned(TryMouse) then
        if TryMouse then
          UpDatePicture;
    end;
 
  CloseGraph;
end.
Программа не компилируется. Как исправлять я не знаю поэтому и прошу помощи. Вообщем помогите откомпилить прогу.

Решение задачи: «Распознавание данных из СОМ-порта»

textual
Листинг программы
var
  f:text;
  s:string;
begin
  assign(f,'COM1');
  reset(f);
  readln(f,s);
  writeln(s);
  close(f);
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.733 из 5
Похожие ответы