回 帖 发 新 帖 刷新版面

主题:关于打印机并口的程序,有语句不懂,请求各位大虾帮助分析一下

程序如下,(程序不是我编的,是个老外编的,我工作中用到它),我才开始学basic不久(因为要用才现学的),就看了一本谭浩强的<<QBASIC语言教程>>第二版,从头看到尾,但这本书没怎么介绍涉及硬件端口的语句函数等,所以以下程序我没太看懂(看了basic的关于语句函数的帮助也没太懂),
求助各位大虾,帮忙分析分析,以下程序各个语句以及整体都是干什么用的啊,都什么意思啊??对于您的帮助,非常感谢
SUB findportadd
DEF SEG = 0
CLS
prnport% = 0
FOR q% = 1 TO 4
prnport% = prnport% + (PEEK(1036 - q%) * (256 ^ (4 - q%)))
NEXT q%

statport% = prnport% + 1
ctrlport% = prnport% + 2

prnportval% = INP(prnport%)
statportval% = INP(prnport% + 1)
ctrlportval% = INP(prnport% + 2)

DEF SEG

END SUB

回复列表 (共11个回复)

沙发

还想问一下,哪本关于basic的书介绍硬件端口语句及例子程序多一些啊,哪位大虾给指点指点,如果有电子版本的资料给上传一份啊

板凳

在QB里按F1,找一下关键字inp( )的用法与范例.

3 楼

SUB findportadd
DEF SEG = 0
CLS
prnport% = 0
FOR q% = 1 TO 4
'每一步从0:40B(初值,累减)读取一个   
'值然后与(256 ^ (4- q%)相乘,
'结果累加到prnprot%里,作为端口地址
prnport% = prnport% + (PEEK(1036 - q%) * (256 ^ (4 - q%)))   
NEXT q%                                                      

'这两变量从名字上看似为"状态端口"和"控制端"之意,本应用在下面但
'却没使用?将计算出来的地址分别加1和2得到新的端口地址
statport% = prnport% + 1          
ctrlport% = prnport% + 2          

'从上面计算出来的端口地址中读取一个字节
prnportval% = INP(prnport%)        
'将地址值加1得到新的地址并读取一个字节(估计本应该用statport%)
statportval% = INP(prnport% + 1)   
'将地址值加2得到新的地址并读取一个字节(估计本应该用ctrlport%)
ctrlportval% = INP(prnport% + 2)   

DEF SEG

END SUB

你这程序是读加密狗用的吗?有啥用途?

4 楼

感谢各位慷慨相助,让我受益非浅
这个程序是一个测试变频器的主程序里的一个子程序.是通过计算机并口连接到测试单元电路板上的
我又仔细看了QBASIC的帮助,对于各个语句的语法基本能弄懂了,
但是,对于端口还是有些问题:
    1.打印机并口端口(prnport%)我能理解,电脑机箱后面能看到,但状态端口(statport%)是哪个端口啊?控制端口(ctrlport%)又是哪个端口呢??
    2.各种端口的地址都是从多少到多少啊,为什么语句中用到"(1036 - q%) * (256 ^ (4 - q%))"表达式啊,为什么要用1036啊,又为什么乘以256的4减q%次幂啊,我实在是不懂,QBASIC帮助里也没法查这种帮助啊
    3.还想问一下,哪本关于basic的书介绍硬件端口语句及例子程序多一些啊,哪位大虾给指点指点,如果有电子版本的资料给上传一份啊

5 楼

1.首先这里所指端口并非实际的电脑后面的那个物理端口,而是指逻辑上的地址。如果你这个系统是通过8255A可编程并行接口芯片来作为与设备交流的界面,它就有数据端口和控制状态端口之分。
2.CPU是通过IN,OUT(QB的INP函数和OUT语句即是模仿这两条指令的功能)指令访问端口地址来与外设进行交流的。LPT1的I/O端口地址是3F8H,COM1的I/O端口地址是2F8H,控制系统扬声器的I/O端口地址是61H,都是有约定俗成的规定的。至于你问为什么那个程序要这么做,那只能说取决于具体的软件硬件环境,还有设计者的意图了。就象MOV AL,10 OUT 70,AL OUT 71,AL,这几条指令,在没告诉你具体端口(即70H,71H)有什么用途之前,你知道它做了什么事吗?那是不可能的。其实它是针对CMOS端口的指令,通过往里写数据破坏里面的内容,最后达到使密码失效的作用。所以你可以读完整的源代码,还有它附带的说明,或许可以窥见一些端倪。而QB帮助只能是某函数或语句的具体用法,不包括其它的东西。
3.BASIC端口应用的例子我想不会有太多的,因为BASIC控制硬件本来就不是它所擅长的,一般汇编的例子会比较多。建议你去找微机接口,微机原理之类的书籍来看,或者网上搜索也可以,一般都会有并口编程应用的内容的。

呵呵,罗罗苏苏一大堆,也没有太多实质内容,仅供参考。

6 楼

另外请注意
DEF SEG = 0
PEEK(1036 - q%)
这两条语句,它表示从内存某个地方(即0:40BH,初值)取出一个数值来参与计算端口地址。现在NT,2K,XP都是不允许直接读取端口的,你的程序是工作在纯DOS或WIN9X的DOSBOX下吗?

7 楼

非常感谢楼上慷慨相助,使我受益匪浅,我内心都给评满分30分,但系统提示"一个人在一个主题中所得的专家分最多不能超过50分!"所以没法给评满分了,请见谅!

我现在是在XP系统下看这个程序,测试电路板的时候是在windows95的DOS环境下进行的.
还想问一下:
    6楼所说的"它表示从内存某个地方(即0:40BH,初值)取出一个数值来参与计算端口地址。"这句话里的"0:40BH"中的冒号是什么意思,是从0到40BH吗,还是什么意思,我没太看懂,请再解释解释

8 楼

对了,这个程序是老外94年编的

9 楼

DFE SEG表示定义一个数据段,上面的DFE SEG=0,表示定义数据段为0。PEEK 表示从偏移地址取一个字节。所以DFE SEG=0,PEEK(1036 - q%)表示从0:40B(第一次循环)的内存地址取一个字节。段是“从什么地方开始”,偏移地址是“再过去多少”,合起来就是“从什么地方开始,再过去多少”的意思。


PS:上面写的更改一下,LPT1的I/O端口地址是378H,COM1的I/O端口地址是3F8H,时间久了搞混了:)

10 楼


没注意看本区也有一篇《在qbasic中用并口做的实用电路,可以控制家用电器(详解)》,你也可以作为资料参考一下啊

http://www.programfan.com/club/post-150073.html

我来回复

您尚未登录,请登录后再回复。点此登录或注册