Delphi对并口进行操作!

原创 2004年06月25日 23:09:00

并行端口简称并口,它有3个端口:数据端口、状态端口、控制端口,常用的并口为LPT1,它的3个端口的地址分别为:378H、379H和37AH。

  一、并口读写

  在汇编语言中,可以用 in、out 指令操作并口,而在Delphi中并没有相对应的函数、方法可对并口进行读写,幸运的是Delphi可以嵌入汇编程序,通过直接嵌入汇编指令 in、out 可方便地对并口进行读写。我们还可以通过调用 Windows API 函数或第三方提供的DLL、VXD来访问并口,但通过使用嵌入汇编的方法对并口进行读写更方便、快捷。

  使用下面的 ReadPort 函数和 WritePort 过程可以读写并口,参数 Port 为要操作的端口地址。

function ReadPort(Port:WORD):BYTE;

    var

         B:BYTE;

begin

       ASM

               MOV DX, Port;

               IN AL, DX;

              MOV B, AL;

      END;

     Result:=B;

end;

procedure WritePort(Port:WORD;ConByte:BYTE);

begin

       ASM

               MOV DX, Port;

               MOV AL, ConByte;

              OUT DX, AL;

       END;

end;

二、位操作

  要按位来控制并口,可以先读取并口的数据,再进行位操作,最后再重新写入并口,就可以实现对并口的位的控制。

  逻辑运算符and对两个要操作的数执行按位的逻辑与运算:即中有1“与”1的结果为1,其它的0“与”1、1“与”0、0“与”0的结果都为0。

  逻辑运算符or对两个要操作的数执行按位的逻辑或运算:即只要相“或”的两位有一位是1,结果就为1;否则“或”的结果为0。


  使用and运算符可以对指定的位置0,例如:十六进制84H的二进制为:10000100,它的第三位为1,若要将第三位置为0,且其它位不变,可以使用:$84 and $FB = $80,80H的二进制值为10000000。

  使用or运算符可以对指定的位置1,例如:十六进制84H的第二位为0,若要将第二位置为1,且其它位不变,可以使用:$84 or $02 = $86,86H的二进制值为10000110。

  例子:

  1、将数据端口378H的D2位的电位设置为低,即置0:

B:=ReadPort($378);

B:=B and $FB;

WritePort($378,B);

  2、将数据端口378H的D2位的电位设置为高,即置1:

B:=ReadPort($378);

B:=B or $04;

WritePort($378,B);

  3、判断数据端口378H的D2位的电位高低:

B:=ReadPort($378);

if ((B and $04)=$04) then

//电位为高时的代码

else

//电位为低时的代码

或:

B:=ReadPort($378);

if ((B or $FB)=$FF) then

//电位为高时的代码

else

//电位为低时的代码

  三、具体实现

  下面的例子是控制并口的数据端口378H的各个位的电位高低。数据端口的8个位:D0~D7分别对应并行接口的2~9脚,关于并行接口其它的引脚的说明就查看相关资料,这里就不多说了。

  首先运行 Delphi,新建一个工程,按一下F12在Form1的单元文件Unit1中加入读写端口的代码:

function ReadPort(Port:WORD):BYTE;

procedure WritePort(Port:WORD;ConByte:BYTE);

function ReadPort(Port:WORD):BYTE;

var

       B:BYTE;

begin

      ASM

            MOV DX, Port;

            IN AL, DX;

            MOV B, AL;

     END;

     Result:=B;

end;

procedure WritePort(Port:WORD;ConByte:BYTE);

begin

      ASM

             MOV DX, Port;

             MOV AL, ConByte;

             OUT DX, AL;

      END;

end;


  添加8个 CheckBox 组件,修改它们的 Caption(标题)属性分别为 D0 到 D7 ,将它们按右到左进行排列好。

  双击 CheckBox1,在CheckBox1组件的OnClick(单击)事件中加入以下的程序代码:

procedure TForm1.CheckBox1Click(Sender: TObject);

var

        b:BYTE;

begin

         b:=0;

         if CheckBox1.Checked then

                       b:=b or $01;

         if CheckBox2.Checked then

                      b:=b or $02;

         if CheckBox3.Checked then

                     b:=b or $04;

        if CheckBox4.Checked then

                     b:=b or $08;

        if CheckBox5.Checked then

                     b:=b or $10;

        if CheckBox6.Checked then

                     b:=b or $20;

        if CheckBox7.Checked then

                     b:=b or $40;

        if CheckBox8.Checked then

                    b:=b or $80;

       WritePort($378,b); //写数据端口

end;
 

  输入完成后,把CheckBox2到CheckBox8这7个CheckBox组件的OnClick事件设置为CheckBox1的OnClick事件:CheckBox1Click。

  此时编译运行程序,已经可以通过点击这8个CheckBox来控制LPT1的数据端口的各个位的电位高低了。

  下面再加入监控并口的数据端口状态的功能。

  在Form1中加入一个Timer组件:Timer1,修改它的Enabled属性为False,Interval属性为1。

  在Timer1的OnTimer事件中加入:

procedure TForm1.Timer1Timer(Sender: TObject);

   var

          B:BYTE;

begin

          B:=ReadPort($378); //读数据端口

          CheckBox1.Checked:=((B or $FE)=$FF);

          CheckBox2.Checked:=((B or $FD)=$FF);

          CheckBox3.Checked:=((B or $FB)=$FF);

          CheckBox4.Checked:=((B or $F7)=$FF);

          CheckBox5.Checked:=((B or $EF)=$FF);

          CheckBox6.Checked:=((B or $DF)=$FF);

          CheckBox7.Checked:=((B or $BF)=$FF);

          CheckBox8.Checked:=((B or $7F)=$FF);

end;
 

  再加入一个CheckBox组件,修改的Caption属性为“监控并口”,并在它的OnClick事件中加入:

procedure TForm1.CheckBox9Click(Sender: TObject);

begin

        Timer1.Enabled:=CheckBox9.Checked;

end;
 

  编译运行程序,点击“监控并口”,就可以监控并口LPT1数据端口378H的状态,并可以实时地修改它的状态。

  为了方便查看、验证数据端口378H的状态,我做了一个小小的并口测试电路,该电路使用了一个打印接口、8个LED(发光二极管)和8个1K的电阻,连接线路如图所示:

 


  按照电路图制作完成后,安装到电脑的并口上,运行编写好的程序就可以方便地查看数据端口378H的各个位的电位高低了。

  最后,我们再来做一个走马灯实验。

  先声明一个全局变量 tb:在“Form1:TForm1”的下面加上“tb:BYTE”:

var

Form1: TForm1;

tb:BYTE;

  再在Form1中加入一个Timer和一个CheckBox,修改Timer2的Enabled属性为False,修改Interval属性为300,双击Timer2,在它的OnTimer事件中加入:

procedure TForm1.Timer2Timer(Sender: TObject);

    var

       B:BYTE;

begin

     if tb=0 then

         tb:=1

    else

        tb:=tb * 2;

    WritePort($378,tb);

    B:=ReadPort($378);

    CheckBox1.Checked:=((B or $FE)=$FF);

    CheckBox2.Checked:=((B or $FD)=$FF);

    CheckBox3.Checked:=((B or $FB)=$FF);

    CheckBox4.Checked:=((B or $F7)=$FF);

    CheckBox5.Checked:=((B or $EF)=$FF);

    CheckBox6.Checked:=((B or $DF)=$FF);

    CheckBox7.Checked:=((B or $BF)=$FF);

    CheckBox8.Checked:=((B or $7F)=$FF);

end;

  修改CheckBox10的Caption属性为“走马灯演示”,再双击CheckBox10,在它OnClick事件中加入:

procedure TForm1.CheckBox10Click(Sender: TObject);

begin

         Timer2.Enabled:=CheckBox10.Checked;

end;
 

  编译运行程序。

Java串口并口程序编写(转)

2012-09-13 19:54                  分享到:                                                    ...
  • yuanyuan_186
  • yuanyuan_186
  • 2014年03月14日 15:02
  • 878

对于STM32使用FSMC驱动传统8080并口器件方式(TFT)的理解(上)

大容量且引脚数在100脚的STM32芯片都带有FSMC接口。 一般的
  • u011006705
  • u011006705
  • 2014年11月12日 16:34
  • 3241

win 并口编程

示例工程下载  WinIo库下载   目前,在实验室和工业应用的各种控制系统中,串口是常用的计算机与外部控制系统之间的数据传输通道。由于串行通信方便易行,所以应用广泛。但是使用串行通信,在实时...
  • darling757267
  • darling757267
  • 2013年09月26日 09:32
  • 1118

delphi LPT1端口打印与开钱箱

{设置打印机} Assignfile(RPrinter,'LPT1'); {准备写文件} Rewrite(RPrinter); {向后倒纸} //Writeln(RPrinter,c...
  • zisongjia
  • zisongjia
  • 2017年05月23日 14:47
  • 740

Delphi 操作剪贴板(1)

Delphi操作剪贴板 Windows使用剪贴板观察器和观察链。剪贴板观察器是一个显示剪贴板当前内容的窗口。             通常它应该至少能显示三种普通格式的内容:文字CF_TEXT...
  • lailai186
  • lailai186
  • 2013年04月12日 13:51
  • 1268

从零开始学习VC++6.0之并口控制(第一课 环境配置)

从零开始学习C++6.0之并口控制   第一课 环境配置   1、 软件硬件的准备 我用的是一台旧笔记本(带25针并口),WindowsXP sp3操作系统,Microsoft ...
  • luyejie8888
  • luyejie8888
  • 2013年01月24日 21:31
  • 4396

什么是串并口硬盘 串口与并口硬盘的区别

不经常接触电脑的朋友可能会很多一些电脑小知识不理解,今天编辑在电脑爱好者QQ群中就发现有朋友问了一个比较简单,但新手朋友一般不怎么会关注到的问题:什么是串口硬盘,什么是并口硬盘。两者哪个速度快些等。笔...
  • xiaofei0859
  • xiaofei0859
  • 2015年11月10日 15:57
  • 8552

Delphi开发学习二:使用ADOQuery控件对SQL数据库表进行操作

在delphi学习一中,已经使用ADOConnection控件设置属性连接数据库SQL了。 在这里开始使用ADOQuery控件对SQL数据库表进行操作。 首先我们在SQL中创建数据库名为PERSONN...
  • u011846249
  • u011846249
  • 2015年08月17日 20:28
  • 2697

51单片机系列知识5--并口(2)

2、P1口 P1口对应的专用寄存器的助记符是P1,它是一个8位的专用寄存器,字节地址是90H,它的每一位都有位地址,可以对位进行直接访问。 PI口的位结构如图2-20所示。P1口也是准双向口,它的用途...
  • OurRtems
  • OurRtems
  • 2016年02月22日 13:55
  • 575

Delphi 调用打印机指令ZPL实例--并口

// 通过指令发送数据到打印机 function TForm1.SendToPrinter():Boolean; var hHandle: THandle; hModule: THandl...
  • Tianqin20140902
  • Tianqin20140902
  • 2015年05月23日 14:44
  • 1277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi对并口进行操作!
举报原因:
原因补充:

(最多只允许输入30个字)