实验2 I/O端口地址译码 & 并行接口输入输出
一、实验目的
1:掌握I/O端口地址译码电路的工作原理。
2:掌握简单并行接口的工作原理及使用方法。
二、实验内容
1:I/O端口地址译码实验
I/O地址译码电路不仅与地址信号有关,而且与控制信号有关。参加译码的控制信号有AEN、/IOR、/IOW。
其中AEN信号表示是否采用DMA方式传输,AEN=1时,为DMA方式,系统总线由DMA控制器占用;AEN=O时,为非DMA方式,系统总线由CPU占用。因此当采用查询和中断方式时,就要使AEN信号为逻辑0,并参加译码,作为译码有效选中 I/0端口的必要条件。
/IOR、/IOW可作为译码电路的输入线参加译码,来控制端口的读/写;也可不参加译码,而作为数据总线上的缓冲器74LS244/245的方向控制线,来控制端口的读/写。
实验电路如图所示,其中74LS74为D触发器,可直接使用实验台上的D触发器,74LS138为地址译码器。译码输出端Y0~Y7在实验台上“I/O地址”输出端引出,每个输出端包含8个地址,Y0:280H~287H,Y1:288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、…),时间间隔通过软件延时实现。即实验电路中D触发器CLK端输入脉冲时,上升沿使Q端输出高电平L7发光,CD端加低电平L7灭。
接线表如下所示:
待接线1 | 待接线2 |
I/O地址的Y2(290H——297H) | D触发器的CLK端 |
I/O地址的Y4(2A0H——2A7H) | D触发器的CD端 |
D触发器的D端 | D触发器的SD端 |
D触发器的Q端 | L7 |
D触发器的SD端 | VCC(+5V) |
流程图如下所示:
2:并行接口输入/输出实验
实验电路如图所示,简单并行输出接口电路图连接电路74LS273、74LS32。74LS273为八D触发器,8个D输入端分别接数据总线DO~D7,8个Q输出端接LED显示电路LO~L7。编程从键盘输入一个字符或数字,将其ASCII码通过这个输出接口输出,根据8个发光二极管发光情况验证正确性。
实验电路如图所示,简单并行输入接口电路图连接电路74LS244、74LS32。74LS244为八缓冲器,8个数据输入端分别接逻辑电平开关输出KO~K7,8个数据输出端分别接数据总线DO~D7。用逻辑电平开关预置某个字母的ASCII码,编程输入这个ASCII码,并将其对应字母在屏幕上显示出来。
接线表如下所示:
待接线1 | 待接线2 |
I/O-in的接口 | 8位逻辑开关的接口 |
输入的CS端 | I/O译码的Y4 |
I/O-out的接口 | 8位LED灯的接口 |
输出的CS端 | I/O译码的Y5 |
流程图如下所示:
三、源程序(含注释)
实验内容1:
OUTPORT1 EQU 2A0H OUTPORT2 EQU 2A8H CODE SEGMENT ASSUME CS:CODE START: MOV DX,290H OUT DX,AL ; 向 DX (290H, CLK) 输出一个负脉冲,将触发器置 1 CALL DELAY ; 调延时子程序 MOV DX,2A0H OUT DX,AL ; 向 DX (2A0H, CD) 输出一个负脉冲,将触发器复位 CALL DELAY ; 调延时子程序 MOV AH,1 ; 功能 1:读取键盘 INT 16H ; 调用中断 JE START ; if 没有读取到按键 goto START MOV AH,4CH ; 功能 4CH:程序结束 INT 21H ; 调用中断,结束程序 DELAY PROC NEAR ; 延时子程序 MOV BX,200 ; BX <- 200 L1: MOV CX,0 ; CX <- 0 L2: LOOP L2 ; 若 CX == 0,跳出循环,所以相当于 NOP DEC BX ; BX-- JNE L1 ; if BX != 0 goto 111 RET ; return DELAY ENDP CODE ENDS END START |
实验内容2:
简单输出接口 |
LS273 EQU 2A8H CODE SEGMENT ASSUME CS:CODE START: MOV AH,0 ;调用0号功能 INT 16H ; 等待键盘输入 DEC AH ; AH-- JZ EXIT ; if AH == 0 goto EXIT ; 此时 AL 已经是输入的 ASCII 码 MOV DX,LS273 OUT DX,AL ; 将 ASCII 码输出到 LS273 MOV AH,02 ; 调用2号功能 MOV DL,AL INT 21H ; 输出该字符 JMP START ; 转 START EXIT: MOV AH,4CH ; 返回 INT 21H CODE ENDS END START |
简单输入接口 |
LS244 EQU 2A0H CODE SEGMENT ASSUME CS:CODE START: MOV DX,LS244 IN AL,DX ; 从 LS244 输入一个字符 MOV AH,02 ; 调用2号功能 MOV DL,AL INT 21H ; 输出该字符 MOV DL,0DH INT 21H ; 输出回车 MOV AH,1 ; 调用1号功能 INT 16H ; 检测键盘输入 JE START ; if 无输入 goto START EXIT: MOV AH,4CH ; 返回 INT 21H CODE ENDS END START |
四、遇到的问题和解决过程
问题1:实验1的参考代码中,代码段标签出现问题。汇编程序中不能使用数字作为标签名称,例如下图中的【111:】和【11:】。
解决1:将标签名称更改为字母组成的字符串,例如下图中的【L1:】和【L2:】。
问题2:在完成实验1的过程中,编译运行程序时出现写和读的报错。例如【An error occurred during tpca write at 290】。
解决2:一开始进行了电路连接的检查,我们并没有发现导线连接上的错误。接着我们怀疑是读写口处的接线存在接触不良的情况,因此重新更换了导线并插紧。后续编译运行不存在进一步的报错。
五、实验结果
实验内容1:
由上图可知,L7闪烁的程序成功编译并运行。
L7亮起状态如上图所示。
L7熄灭状态如上图所示。
随着时间的流逝,L7不断地进行亮起和熄灭状态之间的切换,直至用户按下键盘任意按键为止。
最终实验结果如视频附件2-1.mp4所示。
实验内容2:
【输出】
由上图可知,简单并行接口输出的程序成功编译并运行。
输入【0】字符后,LED灯的亮起情况如上图所示。
输入【1】字符后,LED灯的亮起情况如上图所示。
输入【2】字符后,LED灯的亮起情况如上图所示。
最终实验结果如视频附件2-2-out.mp4所示。
【输入】
由上图可知,简单并行接口输入的程序成功编译并运行。
如上图所示,先在拨码开关处输入【A】字符的ASCII码。
屏幕上显示出拨码开关处输入的字符,结果如上图所示。(后续我们增加了回车0dH,避免了字符的刷屏,结果如【输入】部分的第一张图所示)
最终实验结果如视频附件2-2-in.mp4所示。
六、体会与总结
1:使用试验箱时,需要断掉电源之后才能进行接口之间的插线工作,否则有可能会损坏实验箱及其功能部件。
2:如果环境出现读/写口处的报错,可以优先考虑是不是接线端存在接触不良的情况,选择换线或插紧。
3:学习了I/O地址译码的作用,并体会了其产生的实际效果。每个设备或端口都有一个特定的地址,译码器负责将CPU的指令定向到正确的地址。在此次实验的第一部分,我们通过Y2向CLK输出一个信号,使得D触发器工作且L7亮起,同时通过Y4向CD输出一个信号,使得D触发器复位且L7熄灭。
4:在进行接口连线时,不要完全依赖实验指导书的接线提示,需要自己理解各部分端口的关联内容,才能完成接线的工作。例如在此次实验的第二部分,我们需要理解逻辑开关处是与I/O的输入端口相连,LED显示处是与I/O的输出端口相连,而不是一味地寻找JP1接口和JP2接口的位置。
5:通过调用回车功能,可以消除字符刷屏的现象。
6:此次实验的第一部分中的参考代码给出了如何判断键盘按键是否按下,这块代码后续可以复用至第二部分中。