当前位置:首页 > 软件开发 > net
firefox

在DELPHI2.0/3.0中直接操作端口

borland delphi2.0/3.0以其强大的功能及方便快捷的程序设计
而为广大程序员所喜爱。但是在用它来编写工业控制程序时,需要对
计算机所连接的外部设备进行操作,即直接对i/o地址进行读写操作,
这时该软件就显得有些美中不足了。
针对这一问题,笔者使用delphi 2.0/3.0以内嵌汇编的方式编写
了一个模块port95. pas,可方便地实现直接对i/o地址的读写操作,代
码简捷且执行速度较快。
使用时只要将port95.pas加到工程文件中,并在users中加上port
95,就可以在应用程序中直接对i/o端口进行操作。
具体的实现方法及port95.pas的源代码如下:
unit port95;
interface
function portreadbyte(addr:word) : byte;
function portreadword(addr:word) : word;
function portreadwordls(addr:word) : word;
procedure portwritebyte(addr:word; value:byte);
procedure portwriteword(addr:word; value:word);
procedure portwritewordls(addr:word; value:word);
implementation
{*
* port read byte function
*parameter:port address
*return: byte value from given port
*}
function portreadbyte(addr:word) : byte; assembler; regi
ster;
asm
mov dx,ax
in al,dx
end;
{*
* high speed port read word function
* parameter: port address
* return: word value from given port
* comment:may problem with some cards and computers that
cant to access whole word, usualy it works.
*}
function portreadword(addr:word) : word; assembler; regi
ster;
asm
mov dx,ax
in ax,dx
end;
{*
* low speed port read word function
* parameter: port address
*return:word value from given port
*comment:work in cases,only to adjust delay if need
*}
function portreadwordls(addr:word) : word; assembler; re
gister;
const
delay = 150;
// depending of cpu speed and cards speed
asm
mov dx,ax
in al,dx
//read lsb port
mov ecx,delay
@1:
loop @1 //delay between two reads
xchg ah,al
inc dx
//port+1
in al,dx //read msb port
xchg ah,al //restore bytes order
end;
{* port write byte function*}
procedure portwritebyte(addr:word; value:byte); assemble
r; register;
asm
xchg ax,dx
out dx,al
end;
{*
* high speed port write word procedure
* comment:may problem with some cards and computers that
cant to access whole word, usualy it works.
*}
procedure portwriteword(addr:word; value:word); assemble
r; register;
asm
xchg ax,dx
out dx,ax
end;
{*
* low speed port write word procedure
*}
procedure portwritewordls(addr:word; value:word); assemb
ler; register;
const
delay = 150;
// depending of cpu speed and cards speed
asm
xchg ax,dx
out dx,al
mov ecx,delay
@1:
loop@1
xchg ah,al
inc dx
out dx,al
end;
end. //单元结束
上述port95.pas适用于delphi 2.0/3.0、windows 95 操作系统

 ↓相关文章:
© 2006-2008 All Rights Reserved