?? delphi_derect_io.htm
字號:
<html><head><title>在DELPHI2.0/3.0中直接操作端口</title><style><--! A{text-decoration:none}--></style><meta http-equiv=Content-Type content=text/html; charset=gb2312><meta name=GENERATOR content=Microsoft FrontPage 3.0><meta name=Microsoft Border content=none></head><body style=font-family: 宋體, serif; font-size: 9pt bgcolor=#FFFFFF link=#000080 vlink=#000080 alink=#000080><center><span style=font-family: 宋體; font-size: 9pt><font color=#000000><b><br>在DELPHI2.0/3.0中直接操作端口</b></font></span></center><center><span style=font-family: 宋體; font-size: 9pt>版主:西安 <a href=mailto:delphifan@990.net>梁 明</a></span></center><hr><ul> <li><p align=left><span style=font-family: 宋體; font-size: 9pt><font color=#000000><b>在DELPHI2.0/3.0中直接操作端口</b></font></span></p> <p><span style=font-family: 宋體; font-size: 9pt><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> <br> 作者:宋永柱</span></p> </li></ul><p><span style=font-family: 宋體; font-size: 9pt> </span><ul> <li><span style=font-family: 宋體; font-size: 9pt>版主:梁明<br> 日期:99-07-28<br> E-mail:<a href=mailto:delphifan@990.net>delphifan@990.net</a></span></li></ul><hr></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -