📄 005.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI专题文档-外设应用-->在DELPHI2.0/3.0中直接操作端口</TITLE>
<META NAME="keywords" CONTENT=" DELPHI专题文档-外设应用 在DELPHI2.0/3.0中直接操作端口">
<META NAME="description" CONTENT=" - DELPHI专题文档-外设应用 - 在DELPHI2.0/3.0中直接操作端口">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<a href="index7.html">返回</a>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">在DELPHI2.0/3.0中直接操作端口</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p class="tt2"> Borland Delphi2.0/3.0以其强大的功能及方便快捷的程序设计而为广大程序员所喜爱。但是在用它来编写工业控制程序时,需要对计算机所连接的外部设备进行操作,即直接对I/O地址进行读写操作,这时该软件就显得有些美中不足了。针对这一问题,笔者使用Delphi
2.0/3.0以内嵌汇编的方式编写了一个模块PORT95. PAS,可方便地实现直接对I/O地址的读写操作,代码简捷且执行速度较快。使用时只要将PORT95.PAS加到工程文件中,并在users中加上Port95,就可以在应用程序中直接对I/O端口进行操作。具体的实现方法及PORT95.PAS的源代码如下:<br>
<br>
unit Port95;<br>
interface<br>
function PortReadByte(Addr:Word) : Byte;<br>
function PortReadWord(Addr:Word) : Word;<br>
function PortReadWordLS(Addr:Word) : Word;<br>
procedure PortWriteByte(Addr:Word; Value:Byte);<br>
procedure PortWriteWord(Addr:Word; Value:Word);<br>
procedure PortWriteWordLS(Addr:Word; Value:Word);<br>
implementation<br>
{*<br>
* Port Read byte function<br>
*Parameter:port address<br>
*Return: byte value from given port<br>
*}<br>
function PortReadByte(Addr:Word) : Byte; assembler; regi<br>
ster;<br>
asm<br>
MOV DX,AX<br>
IN AL,DX<br>
end;<br>
{*<br>
* HIGH SPEED Port Read Word function<br>
* Parameter: port address<br>
* Return: word value from given port<br>
* Comment:may problem with some cards and computers that<br>
can't to access whole word, usualy it works.<br>
*}<br>
function PortReadWord(Addr:Word) : Word; assembler; regi<br>
ster;<br>
asm<br>
MOV DX,AX<br>
IN AX,DX<br>
end;<br>
{*<br>
* LOW SPEED Port Read Word function<br>
* Parameter: port address<br>
*Return:word value from given port<br>
*Comment:work in cases,only to adjust DELAY if need<br>
*}<br>
function PortReadWordLS(Addr:Word) : Word; assembler; re<br>
gister;<br>
const<br>
Delay = 150;<br>
// depending of CPU speed and cards speed<br>
asm<br>
MOV DX,AX<br>
IN AL,DX<br>
//read LSB port<br>
MOV ECX,Delay<br>
@1:<br>
LOOP @1 //delay between two reads<br>
XCHG AH,AL<br>
INC DX<br>
//port+1<br>
IN AL,DX //read MSB port<br>
XCHG AH,AL //restore bytes order<br>
end;<br>
{* Port Write byte function*}<br>
procedure PortWriteByte(Addr:Word; Value:Byte); assemble<br>
r; register;<br>
asm<br>
XCHG AX,DX<br>
OUT DX,AL<br>
end;<br>
{*<br>
* HIGH SPEED Port Write word procedure<br>
* Comment:may problem with some cards and computers that<br>
can't to access whole word, usualy it works.<br>
*}<br>
procedure PortWriteWord(Addr:word; Value:word); assemble<br>
r; register;<br>
asm<br>
XCHG AX,DX<br>
OUT DX,AX<br>
end;<br>
{*<br>
* LOW SPEED Port Write Word procedure<br>
*}<br>
procedure PortWriteWordLS(Addr:word; Value:word); assemb<br>
ler; register;<br>
const<br>
Delay = 150;<br>
// depending of CPU speed and cards speed<br>
asm<br>
XCHG AX,DX<br>
OUT DX,AL<br>
MOV ECX,Delay<br>
@1:<br>
LOOP@1<br>
XCHG AH,AL<br>
INC DX<br>
OUT DX,AL<br>
end;<br>
end. //单元结束<br>
上述PORT95.PAS适用于Delphi 2.0/3.0、Windows 95 操作系统。 </p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -