📄 testctrl.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 + -