欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 实验三 I/O地址译码

实验三 I/O地址译码

2025/5/22 12:12:33 来源:https://blog.csdn.net/G856569566/article/details/147288095  浏览:    关键词:实验三 I/O地址译码

一、实验目的               

掌握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

设计思路:

  1. 数据段定义(DATAS SEGMENT)

定义了三个字符串:mess1、mess2和mess3。这些字符串用于在屏幕上显示信息。

  1. 代码段定义(code segment)

程序的主体部分,包含了初始化数据段、显示消息、循环输出数据和延时的逻辑。

  1. 初始化数据段(MOV ax,DATAS / MOV ds,ax)

将数据段的地址加载到ax寄存器,然后将ax的值赋给ds寄存器,以便程序可以访问数据段中的数据。

  1. 显示消息(MOV ah,9 / MOV dx,offset mess1 / int 21h)

使用int 21h中断的功能9来显示字符串。首先设置ah为9,然后将字符串的偏移地址赋给dx,最后调用int 21h中断。

  1. 循环输出数据(AG:...)

程序的主要循环部分,通过两个指定的端口(outport1和outport2)输出数据,并在每次输出后调用延时子程序。

  1. 延时子程序(delay proc near)

一个简单的延时子程序,。

  1. 检测键盘输入(mov ah,1 / int 16h)

使用int 16h中断的功能1来检测键盘输入。如果没有键盘输入,程序将继续循环;如果有键盘输入,程序将结束。

  1. 结束程序(mov ah,4ch / int 21h)

使用int 21h中断的功能4ch来结束程序。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词