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

📄 delphi23_io.htm

📁 对于学习很有帮助
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>在DELPHI2.0/3.0中直接操作端口</title>
</head>

<body bgcolor="#FFFFFF" text="#000000">

<p align="center"><font size="5" color="#000000"><strong>在DELPHI2.0/3.0中直接操作端口</strong></font></p>

<p><strong><font color="#008000" size="5"><br>
</font></strong><br>
<br>
Borland Delphi2.0/3.0以其强大的功能及方便快捷的程序设计<br>
而为广大程序员所喜爱。但是在用它来编写工业控制程序时,需要对<br>
计算机所连接的外部设备进行操作,即直接对I/O地址进行读写操作,<br>
这时该软件就显得有些美中不足了。<br>
针对这一问题,笔者使用Delphi 2.0/3.0以内嵌汇编的方式编写<br>
了一个模块PORT95. PAS,可方便地实现直接对I/O地址的读写操作,代<br>
码简捷且执行速度较快。<br>
使用时只要将PORT95.PAS加到工程文件中,并在users中加上Port<br>
95,就可以在应用程序中直接对I/O端口进行操作。<br>
具体的实现方法及PORT95.PAS的源代码如下:<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 操作系统<br>
。 </p>

<p>宋永柱</p>
</body>
</html>

⌨️ 快捷键说明

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