一、实验目的
掌握I/O地址译码电路的工作原理。
二、实验电路
实验电路如图1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器, Y0:280H~287H,Y1:288H~28FH,Y2:290H~297H,Y3:298H~29FH,Y4:2A0H~2A7H,Y5:2A8H~2AFH,Y6:2B0H~2B7H,Y7:2B8H~2BFH。
三、实验内容
CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。利用这个负脉冲控制L7发光二极管闪烁发光(亮、灭、亮、灭…),时间间隔通过软件延时实现。
四、编程提示
1.实验电路中D触发器CLK端输入脉冲Y4,上升沿使Q端输出高电平L7发光,CD端加低电平L7灭。
2. 执行下面两条指令
MOV DX,2A0H
OUT DX,AL(或IN AL,DX)
Y4输出一个负脉冲。
执行下面两条指令
MOV DX,2A8H
OUT DX,AL(或IN AL,DX)
Y5输出一个负脉冲。
五、实验程序(必须加注释)和结果
; 定义输出端口1的地址
outport1 equ 2a0h
; 定义输出端口2的地址
outport2 equ 2a8h
; 数据段定义
DATAS SEGMENT
; 定义字符串mess1
mess1 DB 'Kruanjian221 Liuxijing 2022900616 AND HuTiaWen2022900615',0DH,0AH,'$'
; 定义字符串mess2
mess2 DB 'end with any key',0DH,0AH,'$'
; 定义字符串mess3
mess3 DB 'over',0DH,0AH,'$'
DATAS ENDS
; 代码段定义
code segment
assume cs:code
start:
; 将数据段地址赋给ax
MOV ax,DATAS
; 将ax的值赋给ds
MOV ds,ax
; 设置ah为9,准备调用21h中断显示字符串
MOV ah,9
; 将mess1的偏移地址赋给dx
MOV dx,offset mess1
; 调用21h中断显示字符串
int 21h
; 设置ah为9,准备调用21h中断显示字符串
MOV ah,9
; 将mess2的偏移地址赋给dx
MOV dx,offset mess2
; 调用21h中断显示字符串
int 21h
AG:
; 将outport1的地址赋给dx
mov dx,outport1
; 将al的值输出到dx指定的端口
out dx,al
; 调用延时子程序
call delay ;调延时子程序
; 将outport2的地址赋给dx
mov dx,outport2
; 将al的值输出到dx指定的端口
out dx,al
; 调用延时子程序
call delay ;调延时子程序
; 设置ah为1,准备调用16h中断读取键盘输入
mov ah,1
; 调用16h中断读取键盘输入
int 16h
; 如果没有键盘输入,跳转到AG标签处继续循环
je AG
; 设置ah为4ch,准备调用21h中断结束程序
mov ah,4ch
; 调用21h中断结束程序
int 21h
; 延时子程序定义
delay proc near ;延时子程序
; 将5000赋给bx
mov bx,5000
lll:
; 将0赋给cx
mov cx,0
ll:
; 循环cx次
loop ll
; bx减1
dec bx
; 如果bx不等于0,跳转到lll标签处继续循环
jne lll
; 子程序返回
ret
delay endp
code ends
; 程序结束
end start
设计思路:
- 数据段定义(DATAS SEGMENT):
定义了三个字符串:mess1、mess2和mess3。这些字符串用于在屏幕上显示信息。
- 代码段定义(code segment):
程序的主体部分,包含了初始化数据段、显示消息、循环输出数据和延时的逻辑。
- 初始化数据段(MOV ax,DATAS / MOV ds,ax):
将数据段的地址加载到ax寄存器,然后将ax的值赋给ds寄存器,以便程序可以访问数据段中的数据。
- 显示消息(MOV ah,9 / MOV dx,offset mess1 / int 21h):
使用int 21h中断的功能9来显示字符串。首先设置ah为9,然后将字符串的偏移地址赋给dx,最后调用int 21h中断。
- 循环输出数据(AG:...):
程序的主要循环部分,通过两个指定的端口(outport1和outport2)输出数据,并在每次输出后调用延时子程序。
- 延时子程序(delay proc near):
一个简单的延时子程序,。
- 检测键盘输入(mov ah,1 / int 16h):
使用int 16h中断的功能1来检测键盘输入。如果没有键盘输入,程序将继续循环;如果有键盘输入,程序将结束。
- 结束程序(mov ah,4ch / int 21h):
使用int 21h中断的功能4ch来结束程序。