PUSH DS MOV AX,0
PUSH AX;使用第一种返回DOS的方式 MOV AX,DAT MOV DS,AX
MOV DX,0E8E0H;输出端口设置 LOOP0:IN AL,DX MOV AH,AL TEST AL,01H
JZ GG;最低位为1则程序结束 TEST AL,02H;检测中间位
JZ LOOP0;若输入端为0则继续等待 TEST AL,04H; JZ RR;跑马灯向右运动 ROL NUM,1;跑马灯向左运动 JMP LOOP2
RR:ROR NUM,1;原数据循环右移,使得跑马灯向右跳转 LOOP2:AND AH,1FH
MOV CL,AH;设置子程序调用的次数,间接控制延迟时间 MOV CH,0; MOV AL,NUM OUT DX,AL
6
INC CX
LOOP1:CALL DELAY;调用延时子程序 LOOP LOOP1
JMP LOOP0;返回等待输入过程 GG:RETF START ENDP ;延时子程序 DELAY PROC PUSH CX
MOV CX,008FFH;外循环过程 D1:PUSH CX
MOV CX,004FFH;内循环过程 D2:LOOP D2 POP CX LOOP D1 POP CX RET
DELAY ENDP; COD ENDS END START
六、思考题:
通过实验说明用 debug 中的 a 命令录入实验中给出的小程序中,有些语句可以不写出“h”
7
字符的原因。
答:在DEBUG环境下,地址都是默认以16进制显示的,所以当语句中的数据是地址时,可以不加H,如果输入的不是地址而是数据时,就要加上H以表示为十六进制数。
七、实验收获和体会:
本次试验涉及到了计算机对于外部设备的控制的基本过程,我们主要学会如何在debug环境下编写I/O命令对于外部设备进行输入和输出。具体而言,利用命令点亮了LED灯,以及读取了拨码开关的状态。通过上述读写的操作,以及编写子程序等过程完成了跑马灯的实现。由于电路板的时钟信号周期很小,在完成一层循环时,形成的跑马灯无法被人眼识别捕捉,呈现出了八个LED灯都亮的状态,不符合要求。于是我们将循环延迟的子程序改成了两层,并且由于输入端的拨码开关一共有三个可以控制跑马灯的模式,其中一个控制开关,另一个控制方向(可左可右),另一个辅助控制跑马灯的速度。实际上我们在跑马灯开启状态下,读入三个拨码开关的状态并且将其转化为三位的二进制数,并且将这个二进制数作为控制延迟子程序的调用次数,从而实现了两种方向下七种速度的实现(本应该有八种,但是一种是关闭状态)。实现了功能的拓展和创新。我们通过本次实验,基本学会了汇编语言代码的编写,熟悉了DEBUG的工作环境和调试过程,并且对于计算机控制外部设备有了更客观清醒的认识,为今后汇编学习做了更充分的准备。
实验二 8255A并行接口应用
一、 实验目的:
1.掌握 8255A 的功能及方式 0、1 的实现
2.熟悉 8255A 与 CPU 的接口,以及传输数据的工作原理及编程方法。 3.了解七段数码管显示数字的原理。 4.掌握同时显示多位数字的技术。
二、实验内容:
在实验一的基础上学习 PIO 芯片(8255)编程应用,熟悉平台的主要内容。 CS 用 Y0 (E800H) (一) 简要说明:
在方式 0(输入/输出)下,以 A 口为输出口,B 口为输出口, A 口接六个共阴极数码 管的八位段码,高电平点亮数码管的某一段, B 口接数码管的位选(即要使哪个数码管亮), 高电平选中某一位数码管点亮。 8255A 中
8
A 端口地址 E800H B 端口地址 E801H C 端口地址 E802H
控制地址 E803H 八段数码管的显示规律及数码管的位选规律自己查找,可用实验一中,学过的 I、O 命令来做。
三、程序流程图: 软件程序流程图:
程序一:静态显示学号
开始 8255初始化 待显示字符地址给BX 点亮第一个字符 熄灭 N 依次点亮后面的字符 检测键盘 Y 返回DOS
程序二:动态显示hello
9
8255初始化 从端口读入数据,改变速度 显示所需字符 所需显示字符的地址加1或者N 键盘是否有输入 Y 程序结束,返回DOS
硬件连线图:
10