📄 io_direct.htm
字号:
<html><head><title>在DELPHI2直接操作端口</title><meta http-equiv=Content-Type content=text/html; charset=gb2312><meta name=GENERATOR content=Microsoft FrontPage 3.0><style><!--
A{text-transform: none; text-decoration: none;}
A:hover {color: #F77C02 ; text-decoration: underline;} }
--></style><style type=text/css><!--
.font1 {font-size:10.5pt; line-height:15pt; align=center}
.font2 {font-size:9pt; line-height:13pt; }
A{text-transform: none; text-decoration:none;color:#0000FF}
a:hover {text-decoration:underline;color:#FFFFF}
--></style></head><body bgcolor=#FFFFFF><p><span class=font1> </span></p><center><span class=font1><font color=#000000><b>在DELPHI2.0/3.0中直接操作端口</b></font></span></center><p><span class=font1><font color=#008000><b><br></b></font><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>。 </span></p><p><span class=font1>宋永柱</span></p><p><span class=font2>版主:西安 梁 明<br>日期:99-07-29<br>E-mail:<a href=mailto:delphifan@990.net>delphifan@990.net</a></span></p><hr></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -