⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testctrl.pas

📁 合成实验的上位机程序
💻 PAS
字号:
unit TestCtrl;

interface
  //<Step1>在对PIO_D144的D/I/O端口进行读写之前先进行初始化操作
  procedure PIO_D144_Reset;
  //<Step2>本过程用来设置PIO_D144板卡的D/I/O端口功能
  procedure PIO_D144_IO_Select(IOAddress: Word; SetIO: Byte);
  //<Step3>本过程用来激活PIO_D144板卡的一个D/I/O port
  procedure PIO_D144_Active_IO_Port(SelPort: Byte);
  //<Step4>本过程用来读写PIO_D144板卡的一个D/I/O端口数据
  function PIO_D144_RW_8BitData(Operation,Status: Byte): Byte;
  function PIO_D144_Port(Channel: Integer): Integer;
  function PIO_D144_Bit(Channel: Integer): Integer;

  //<Step1>在对TMC12的D/I/O端口进行初始化操作
  procedure TMC12_Reset;
  procedure TMC12_ActiveChip(Channel: Byte);
  procedure TMC12_SetCtrlWord(Channel: Byte);
  procedure TMC12_ActiveCounter(Channel,LSB,MSB: Byte);
  procedure TMC12_StartCount(Channel: Word);
  function TMC12_IsCountOver: Word;
  function TMC12_StartBit(Channel: Word): Word;


const
  //本机上PIO_D144基地址
  PIO_BaseX = $AC00;
  //Reset\Control Register偏移地址
  PIO_Reset = $0;
  //I/O Select Control Register偏移地址1
  PIO_IO_Select1 = $C8;
  //I/O Select Control Register偏移地址2
  PIO_IO_Select2 = $CC;
  //I/O Select Control Register偏移地址3
  PIO_IO_Select3 = $D0;
  //Active I/O Port Control Register偏移地址
  PIO_Active_IO_Port =$C4;
  //Read/Write 8-Bit Register偏移地址
  PIO_RW_8BitData =$C0;
  //本机上PIC_TMC12基地址
  TMC_BaseX = $CC00;
  //Select the active 8254 chip 1/2/3/4偏移地址
  TMC_SelChip =$10;
  //8254 Timer/Counter0 Control偏移地址
  TMC_Counter0 = $0;
  //8254 Timer/Counter1 Control偏移地址
  TMC_Counter1 = $4;
  //8254 Timer/Counter2 Control偏移地址
  TMC_Counter2 = $8;
  //Active 8254 Control Word偏移地址
  TMC_CtrlWord = $0c;
  //PIC_TMC12 D/I/O输出偏移地址
  TMC_DIO = $14;
                                                 
type
  PCI_TMC12 = Record					        
       CountNum: Byte;
        Channel: array [1..12] of Integer;
           Time: array [1..4, 1..12] of Integer;
          TimeL: array [1..4, 1..12] of Byte;
          TimeH: array [1..4, 1..12] of Byte;
           Loop: array [1..4, 1..12] of Integer;
         OneEnd: array [1..12] of Boolean;
         AllEnd: Boolean;
      EnOneGate: array [1..12] of Word;
     EnAllGates: Word;
  end;

var
  TMC12: PCI_TMC12;


implementation
			
//<Step1>在对PIO_D144的D/I/O端口进行读写之前先进行初始化操作
procedure PIO_D144_Reset;
begin
  asm
    PUSH AX
    PUSH DX
    MOV DX,PIO_BaseX       //送基址
    ADD DX,PIO_Reset       //地址累加
    MOV AL,01H             //使能值01H
    OUT DX,AL              //送使能值
    POP DX
    POP AX
  end;
end;

//<Step2>本过程用来设置PIO_D144板卡的D/I/O端口功能
procedure PIO_D144_IO_Select(IOAddress: Word; SetIO: Byte);
begin
  asm
    PUSH AX
    PUSH DX
    MOV DX,PIO_BaseX
    MOV AX,&IOAddress
    ADD DX,AX
    MOV AL,&SetIO         //设置D/I/O port的功能
    OUT DX,AL    
    POP AX
    POP DX
  end;
end;

//<Step3>本过程用来激活PIO_D144板卡的一个D/I/O port
procedure PIO_D144_Active_IO_Port(SelPort: Byte);
begin
  asm     
    PUSH AX
    PUSH DX
    MOV DX,PIO_BaseX
    ADD DX,PIO_Active_IO_Port
    MOV AL,&SelPort         //确定哪个I/O port被激活
    OUT DX,AL       
    POP AX
    POP DX
  end;
end;

//<Step4>本过程用来读写PIO_D144板卡的一个D/I/O端口数据
function PIO_D144_RW_8BitData(Operation,Status: Byte): Byte;
begin
  case Operation of
    0: asm   
         PUSH AX
         PUSH DX
         MOV DX,PIO_BaseX
         ADD DX,PIO_RW_8BitData
         MOV AL,&Status
         OUT DX,AL       //如果是D/O,则进行写操作  
         POP AX
         POP DX
       end;
    1: asm   
         PUSH AX
         PUSH DX
         MOV DX,PIO_BaseX
         ADD DX,PIO_RW_8BitData
         IN AL,DX
         MOV @Result,AL  //如果是D/I,则进行读操作  
         POP AX
         POP DX
       end;
  end;
end;

function PIO_D144_Port(Channel: Integer): Integer;
var
  Port: Integer;
begin
  case ((Channel-1) div 8) of
    0: Port:=0;
    1: Port:=1;
    2: Port:=6;
    3: Port:=7;
    4: Port:=2;
    5: Port:=12;
  end;
  Result:=Port;
end;   

function PIO_D144_Bit(Channel: Integer): Integer;
var
  Bit: Integer;
begin
  case (Channel mod 8) of
    1: Bit:=1;
    2: Bit:=2;
    3: Bit:=4;
    4: Bit:=8;
    5: Bit:=16;
    6: Bit:=32;
    7: Bit:=64;
    0: Bit:=128;
  end;
  Result:=Bit;
end;

procedure TMC12_Reset;
begin
  asm 
    PUSH AX
    PUSH DX
    MOV DX,TMC_BaseX
    ADD DX,TMC_DIO
    MOV AL,$0         //初始化,输出清零
    OUT DX,AL     
    POP AX
    POP DX
  end;
end;

procedure TMC12_ActiveChip(Channel: Byte);
var
  Chip: Byte;
begin
  case Channel of
      1..3: Chip:=0;
      4..6: Chip:=1;
      7..9: Chip:=2;
    10..12: Chip:=3;
  end;
  asm    
    PUSH AX
    PUSH DX
    MOV DX,TMC_BaseX
    ADD DX,TMC_SelChip
    MOV AL,&Chip        //选择一个Chip
    OUT DX,AL    
    POP AX
    POP DX
  end;
end;

procedure TMC12_SetCtrlWord(Channel: Byte);
var
  CtrlWord,Counter: Byte;
begin
  case Channel of
    1,4,7,10: Counter:=0;
    2,5,8,11: Counter:=$40;
    3,6,9,12: Counter:=$80;
  end;
  CtrlWord:=Counter or $30;
  asm   
    PUSH AX
    PUSH DX
    MOV DX,TMC_BaseX
    ADD DX,TMC_CtrlWord
    MOV AL,&CtrlWord    //置控制字,为了和下面程序对应,送初值必须设成先LSB8,后MSB8
    OUT DX,AL   
    POP AX
    POP DX
  end;
end;

procedure TMC12_ActiveCounter(Channel,LSB,MSB: Byte);
var
  CtrlWord: Byte;
  CounterAdd: Word;
begin
  case Channel of
    1,4,7,10: CounterAdd:=0;
    2,5,8,11: CounterAdd:=$4;
    3,6,9,12: CounterAdd:=$8;
  end;
  asm  
    PUSH AX
    PUSH DX
    MOV DX,TMC_BaseX
    MOV AX,&CounterAdd  //选择一个Counter
    ADD DX,AX
    MOV AL,&LSB         //送计数值,先低8位
    OUT DX,AL
    MOV AL,&MSB         //后高8位
    OUT DX,AL     
    POP AX
    POP DX
  end;
end;

procedure TMC12_StartCount(Channel: Word);
begin
  asm   
    PUSH AX
    PUSH DX
    MOV DX,TMC_BaseX
    ADD DX,TMC_DIO
    MOV AX,&Channel     //启动计数的通道
    OUT DX,AX      
    POP AX
    POP DX
  end;
end;

function TMC12_IsCountOver: Word;
begin
  asm
    PUSH AX
    PUSH DX
    MOV DX,TMC_BaseX
    ADD DX,TMC_DIO
    IN AX,DX
    MOV @Result,AX
    POP AX
    POP DX
  end;
end;

function TMC12_StartBit(Channel: Word): Word;
var
  I: Integer;
begin
  Result:=1;
  for I:=2 to Channel do
    Result:=Result*2;
end;

end.
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -