并口的IO读写操作
在PC中,一般都有两个并口,两个并口的基地址BASE ADDRESS分别为0x378,0x278。以第一个并口为例,0x378为数据寄存器地址(读写),0x379为状态寄存器地址(只读),0x37a为控制寄存器地址(读写)。定义如下
outportb(0x378, 255);
即可把所有8位输出高电平。
但是要把8位数据位做输入,就比较麻烦,如果直接读端口,比如
inportb(0x378);
只会得到上一次的输出,如果以前没有对其输出,那么得到的是0。
一个简单的利用并口做IO输入的方法,是利用其状态寄存器进行输入。
比如在我的系统中,读状态寄存器,正常情况下用inportb(0x379)得到的结果是127,但是此时如果我将状态寄存器的某个引脚接地,那么得到的结果就改变,因为某一位的值变成0。
在Windows下如果用VC进行IO编程,可以调用_inp和_outp等IO函数,或者嵌入汇编代码实现IO功能,但对于Windows NT以上系统,这样做会出错,必须写成驱动程序,或者嵌入winio库来实现。
BASE ADDRESS
(PDR) Data register (Read or Write)
Bit 0 Pin 2 Data Output
Bit 1 Pin 3 Data Output
Bit 2 Pin 4 Data Output
Bit 3 Pin 5 Data Output
Bit 4 Pin 6 Data Output
Bit 5 Pin 7 Data Output
Bit 6 Pin 8 Data Output
Bit 7 Pin 9 Data Output
BASE ADDRESS + 1
(PSR) Status register (Read Only)
Bit 0 Not used
Bit 1 Not used
Bit 2 Not used
Bit 3 Pin 15 ERROR Input
Bit 4 Pin 13 SELECT Input
Bit 5 Pin 12 PAPER END Input
Bit 6 Pin 10 ACKNOWLEDGE Input
Bit 7 Pin 11 BUSY Input
BASE ADDRESS + 2
(PCR) Control register (Read or Write)
要进行IO输出时,很简单,直接往基地址,也就是数据寄存器地址输出即可,比如TurboC中,用
Bit 0 Pin 1 DATA STROBE Output
Bit 1 Pin 14 AUTO LINE FEED Output
Bit 2 Pin 16 INITIALIZE PRINTER Output
Bit 3 Pin 17 SELECT INPUT Output
Bit 4 0 = disable interrupt, 1 = enable interrupt
Bit 5
Bit 6
Bit 7
outportb(0x378, 255);
即可把所有8位输出高电平。
但是要把8位数据位做输入,就比较麻烦,如果直接读端口,比如
inportb(0x378);
只会得到上一次的输出,如果以前没有对其输出,那么得到的是0。
一个简单的利用并口做IO输入的方法,是利用其状态寄存器进行输入。
比如在我的系统中,读状态寄存器,正常情况下用inportb(0x379)得到的结果是127,但是此时如果我将状态寄存器的某个引脚接地,那么得到的结果就改变,因为某一位的值变成0。
在Windows下如果用VC进行IO编程,可以调用_inp和_outp等IO函数,或者嵌入汇编代码实现IO功能,但对于Windows NT以上系统,这样做会出错,必须写成驱动程序,或者嵌入winio库来实现。
标签: programming
0 条评论:
发表评论
订阅 博文评论 [Atom]
<< 主页