在delphi中的读I/O端口的问题(急急急!!!!)(200分)

  • 主题发起人 主题发起人 007_1
  • 开始时间 开始时间
0

007_1

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个医疗软件,读硬件卡为ISA/PC104,卡上留了220H-227H 8个端口,228H-22FH 8
个端口等等还有四个,发送和接收都为第一个端口即:220H或228H,我说的也可能不太清楚
我希望各位老兄能帮帮我,我愿意把我所有的分都拿出来,希望能有这方面的资料,或者
关于在DELPHI下如何读写这种硬件的源码,(注:此卡为并口,我需要发送命令,和接收
数据)。谢谢大家!
 
能不能给你一点启发

procedure BeepEx(feq:word=1200;delay:word=1);

procedure BeepOff;
begin
asm
in al,$61;
and al,$fc;
out $61,al;
end;
end;
const
scale=1193180;
var
temp:word;
begin
temp:=scale div feq;
asm
in al,61h;
or al,3;
out 61h,al;
mov al,$b6;
out 43h,al;
mov ax,temp;
out 42h,al;
mov al,ah;
out 42h,al;
end;
sleep(delay);
beepoff;
end;
 
扬声器发音的程序片段就是访问端口,在WIN98下可以,
WIN2000 可能就不行了,现抄过来能不能给你一点启发

 
谢谢您的回答,有没有不用汇编的,或者有没有这方面的资料!
 
有专用的控件啊
 
查WIN32 API
 
有控件给我发一个过来,谢谢!hu_yang@371.net
 
i/o还是用汇编好
似乎有这方面的控件,不过我觉得用起来可能跟用汇编差别不大!
是否应该作驱动程序了?
写数据简单,按着说明out就行了。
读数据要看你用查询方式还是中断方式,这就麻烦了,windows限制很多的,应该查询的好做点。
 
我这里有一个用查询方法做的I/O读写数据的函数,可能你的更简单一些。你要仔细的看你
的说明书它的I/O是如何操作的。
function Acl813(address:WORD;tdh:byte):WORD;
var
temp:WORD;
Recode,aa:WORD;
Loop:integer;
begin
//初始化
Recode:=0;
temp:=address+9;
Loop:=0;
//写1到I/O的地址为address+9的端口
asm
mov Dx,temp
mov AL,1
out Dx,AL
end;
//把tdh写到I/O的地址为address+10的端口
temp:=address+10;
asm
mov Dx,temp
mov AL,tdh
out Dx,AL
end;
sleep(1);

temp:=address+$0c;
asm
mov Dx,temp
mov AL,0
out Dx,AL
end;
sleep(1);
temp:=address+4;
repeat
Loop:=Loop+1;
//把I/O的地址为address+4的端口中的数据读出放到Recode
asm
MOV DX,temp
IN AX,DX
MOV Recode,AX
end;
aa:=recode and $1000
until (aa=0) or (loop>300);
recode:=recode and $0fff;
//函数的返回
result:=recode;
end;

 
请亲近汇编,没什么可怕的。
 
其实汇编不那么可怕!
对于端口操作可以写两个函数,一个读数据,一个写数据即可,以后就可以一劳永逸了,
具体汇编程序可以参照以上几位大哥的[blue][/blue][8D]
 
在WinNT,Win2000,WinXp中
用汇编来直接操作I/O是行不通的
去vcl.vclxx.org
有很经典的控件,而且有的还有源代码哦!
 
汇编其实最简单!!
当然不要相信学校里教的那些可怜的上个世纪70年代的代码!
三角函数、幂运算等等一点也不难,用80387协处理器几个字节的代码就搞定了!!!
 
在windows下,用汇编都是不行的。
C语言可以也读写端口 inport outport
但是只要在windows下 汇编或C都是不行 98会蓝屏 2000会出错误提示
除非是写Drivers 上写Drivers的网站看看会有写好的库可以用
 
控件吧:Tvichw32
 
后退
顶部