第六章 输入输出(3)

2019-03-15 13:00

IN AL,61H ;读取61H端口内容 AND AL,11111100B ;清除P0和P1位 OUT 61H,AL ;关闭与门的输入端B

CALL DELAY ;调用延时子程序,使与门关闭0.001秒 IN AL,61H ;读取61H端口内容 OR AL,00000010B ;使P1位为1

OUT 61H,AL ;使与门的输入端B打开

CALL DELAY ;调用延时子程序,使与门打开0.001秒 LOOP AGAIN ;变化次数不为0则继续开闭与门 MOV AH,4CH

INT 21H ;返回DOS DELAY PROC ;延时子程序 PUSH CX PUSH DX

MOV CX,0FFH ;外循环次数 DELAY2:

MOV DX,0AFFH ;内循环次数 DELAY1:

SUB DX,0001H JNZ DELAY1 LOOP DELAY2 POP DX POP CX RET

DELAY ENDP CSEG ENDS END START

该程序经保存、汇编、连接后,直接输入111文件名即可。

从该例题可以看出,对扬声器的控制是不需要任何条件的,CPU不会查询扬声器是否处于准备好的状态、是否可接收等问题,而是直接对61H端口送入数据,控制与门的开与关,从而使扬声器产生振动,发出声音。

6.3 查询方式输入输出

计算机大部分外设不可能象扬声器那样工作,这些外设处理数据的速度和提供数据的速度往往比主机内部速度慢得多,因而CPU与这类设备进行数据交换前必须先判断它们是否“就绪”。当CPU采用查询方式控制打印机打印一批数据时,每打印一个数据之前,则必须先查询打印机的当前状态是否空闲。如果打印机空闲则将后续的打印数据送打印机打印,否则反复查询打印机状态直至空闲。再比如说,CPU以查询方式将串口数据输入进行处理,则必须在输入之前查询串口是否准备好了数据。如果串口准备好了数据,CPU查询到串口处于“READY”状态,CPU才可以从串口中提取数据,否则必须反复查询。

CPU以查询方式向外设送出一批数据或从外设读取一批数据的流程如图6-7所示。

图6-7 查询方式数据交换流程图

6.3.1查询方式打印输出

打印机是一种可以按照查询方式工作的外设,它与主机通过并行接口连接。并行接口中具有三个端口,分别是:数据端口、状态端口与控制端口。

1. 数据端口(378H)

数据端口占用端口地址378H,该端口专门用于接收CPU需要打印的数据。 2. 状态端口(379H)

状态端口占用端口地址379H,该端口专门用于表示打印机的“闲/忙”等状态。状态端口可以反映打印机的5种状态,各种状态在状态端口中的位置如图6-8所示。

图6-8 状态端口的位功能图

(1)D7位:打印机的“忙/闲”信号位。该位为0,表示打印机处于“忙”状态,为1则表示打印机处于“闲”状态。

(2)D6位:打印机的“确认”信号。当打印机的数据端口正确接收到了一个字节数据后,就向总线返回一个低电平信号,确认数据已经正确接收。

(3)D5位:缺纸信号。该位为1表示打印机纸盒内无纸,无法继续打印,为0表示正常工作。

(4)D4位:联机信号。该位为1表示正处于联机工作状态,为0表示没有联机,这时打印机无法正常工作。

(5)D3位:出错信号。该位为0表示打印机出现内部错误,打印机无法正常工作,为1表示正常。

(6)D2~D0位:无定义。 3. 控制端口(37AH)

控制端口占用端口地址37AH,CPU可以向该端口送入控制命令,打印机根据该端口内容进行工作。控制端口中各位位置如图6-9所示。

图6-9控制端口的位功能图

(1)D4位:允许中断信号位。该位为1允许打印机以中断方式工作,为0则不允许。 (2)D3位:联机命令位。该位为1将设置打印机的联机工作方式。控制打印机时应该将该位设置为1,否则打印机无法正常工作。

(3)D2位:初始化信号。打印机重新初始化时,对该位清0,并保持0.05秒以上,然后再对该位置1,使打印机正常工作。

(4)D1位:自动走纸。该位置1时,打印机在打印完一行后自动走纸,为0时则需要向打印机输出换行符0AH控制走纸。一般该位设置为0。

(5)D0位:选通信号位。CPU通过在这一位上先置1再清0,通知打印机从数据端口中取走一字节打印数据并实施打印。

例6-5 控制打印机以查询方式工作,打印26个英文字母,共打印30行。

解:以查询方式控制打印机,CPU首先发出控制字给打印机控制端口的D3和D2位,使打印机完成联机与初始化工作,然后CPU读取打印机状态端口的D7位,测试打印机是否为“闲”状态,如果为“闲”,则将打印数据送入打印机的数据端口,CPU再发出控制字给打印机控制端口的STB位,通知打印机将数据端口的字节数据取走并进行打印。

程序代码编写如下: DSEG SEGMENT

MESS DB \DSEG ENDS

STACK1 SEGMENT STACK DW 1024 DUP(?) STACK1 ENDS CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG,SS:STACK1 START:

MOV AX,DSEG MOV DS,AX MOV AX,STACK1 MOV SS,AX

MOV DX,037AH ;控制端口地址送DX寄存器 MOV AL,00001000B ;联机位置1,初始化信号位置0 OUT DX,AL ;控制字送打印机控制端口 MOV CX,1000

HERE :LOOP HERE ;使初始化信号位清0时间保持0.05秒时间以上 MOV AL,00001100B ;初始化信号位置1

OUT DX,AL ;控制字送打印机控制端口 MOV CX,30 ;打印30行 AGAIN:

MOV BX,OFFSET MESS ;使BX指针重新指向打印队列第一个字符 NEXT:

MOV DX,0379H ;状态端口地址送DX寄存器

TEST1:

IN AL,DX ;读取状态端口内容

TEST AL,10000000B ;测试状态端口D7位是否为1 JZ TEST1 ;D7位不为1则继续测试

MOV DX,0378H ;测试到D7位为0,将打印数据送数据端口 MOV AL,[BX] OUT DX,AL

MOV DX,037AH ;控制端口地址送DX寄存器 MOV AL,00001101B ;对D0位先置1 OUT DX,AL ;使STB位为1 MOV AL,00001100B ;对D0为置0

OUT DX,AL ;使STB位为0,通知打印机读取数据端口数据 CMP BYTE PTR [BX],0AH ;打印字符与换行符0AH比较

JZ NEWLINE ;相等则转移到NEWLINE标号,使打印机换行 INC BX ;否则,BX指针加1,指向下一打印字符 JMP NEXT ;继续打印 NEWLINE:

LOOP AGAIN ;CX自减1,不为0则转移到AGAIN标号处 MOV AH,4CH

INT 21H ;返回DOS CSEG ENDS END START

该程序经保存、汇编、连接后,直接输入111文件名即可。

注意:在运行该程序之前,应该确保打印机与计算机的并行口连接。当从键盘输入111文件名后,DOS光标符会停在命令的下一行闪烁,同时打印机开始打印,直到打印机打印完所有内容后才会重新出现系统提示符。

6.3.2 读实时钟

RT/CMOS RAM的状态寄存器A的D7位是计时更新标志位,为1表示实时钟正在计时,为0表示实时钟信息可用于读出。所以,在读实时钟前,要查询该标志位是否为0。

例6-6 以查询方式读取实时钟,将读取的秒、分和小时保存到BL、CL、DL中。

解:将RT/CMOS RAM的状态寄存器A的D7位理解为“就绪”位,通过查询该位以决定是否读取实时钟。

程序代码编写如下: CSEG SEGMENT ASSUME CS:CSEG START:

MOV AL,0AH ;状态寄存器A地址送AL OUT 70H,AL ;访问单元地址送70H端口 NOP

NOP ;延时

IN AL,71H ;读状态寄存器A

TEST AL,10000000B ;测试状态寄存器A的D7位是否为1

JNZ START ;为1则转移到START标号,重新测试 MOV AL,00H ;“秒”位移送AL寄存器 OUT 70H,AL NOP NOP

IN AL,71H ;读取00H位移单元的内容 MOV BL,AL ;“秒”送入BL寄存器 MOV AL,02H ;“分钟”位移送AL寄存器 OUT 70H,AL NOP NOP

IN AL,71H ;读取02H位移单元的内容 MOV CL,AL ;“分钟”送入CL寄存器 MOV AL,04H ;“小时”位移送AL寄存器 OUT 70H,AL NOP NOP

IN AL,71H ;读取04H位移单元的内容 MOV DL,AL ;“小时”送入DL寄存器 MOV AH,4CH

INT 21H ;返回DOS CSEG ENDS END START

将以上程序输入完毕后保存为111.ASM文件后,通过MASM程序对其汇编,再通过LINK程序连接成111.exe。输入DEBUG 111.exe命令,使用U命令反汇编后,输入“G 002C”命令执行该程序。结果如图6-10所示。

图6-10 程序调试结果

由图6-10可知,执行该程序时,系统当前时间为下午1点07分28秒。

习题六

1、 主机和外设交换数据的方法有几类?各类的特点是什么?

2、 8086/8088 系统I/O端口地址范围是什么?它们属于何种编址方式?

3、微机系统常采用哪些方式实现输入输出?

4、当端口地址超过0FFH时,在IN指令中,源操作数应该出现哪个寄存器?在OUT指令中,目的操作数又应该出现哪个寄存器?

5、编写一个程序,显示系统当前的时间。

6、编写一个程序,显示系统当前的年月日。

7、将例题6-5的控制走纸改为自动走纸。


第六章 输入输出(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:三年级下学期语文10

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: