实验 1 简单 IO 应用—流水灯控制
实验过程需完成内容:
1、亮 4 个灯、暗 4 个灯,1 亮 1 暗均匀分布,且稳定不变;
2、亮 1 个灯,暗 7 个灯,从上到下轮流点亮每一个灯,每次只亮一个灯,
循环间隔约 2 秒;
3、亮 2 个灯,暗 6 个灯,一个灯从上往中间轮流点亮,另一个灯从下往中
间轮流点亮,循环间隔约 1 秒。
4、采用 ROR、ROL 循环移位语句(P77)及 LOOP 语句(P81),实现一个灯从
第 1 个循环点亮到第 8 个,然后从第 8 个循环点亮至第 1 个,一直上下循环。
图 1 实验电路图
一.实验操作流程
1 解压 Proteus 软件(Proteus 7 Professional\BIN\ISIS.EXE),实验时导入 IO 文件夹的*.DSN 文
件 ;
2 参考教材 P349“附录 A x86 汇编语言程序上机过程与调试方法 A.1”编制汇编程序并调试;
3 将生成的*.exe 导入 8086 CPU,并运行;
4 查看结果,修改 ASM 文件程序,调试程序,记录实验现象。
二:实验
实验一: 亮 4 个灯、暗 4 个灯,1 亮 1 暗均匀分布,且稳定
不变
;定义堆栈------------------
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
;定义变量------------------
DATA SEGMENT
CNT DB 10101010B
DATA ENDS
;代码段------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
ORG 0100H
;定义变量 CNT=80H
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CNT
MOV DX,0000H
;这里不用改变
;这里不用改变
;数据段地址
;数据段存入数据段寄存器
;初始 CNT=10000000B 送 AL
;Led 外设的端口地址
;亮 1 桟灯?
LP: OUT DX,AL
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
;添加你的程序
;添加你的程序
;添加你的程序
;其他程序段在理解的情况下可以自己编辑
JMP LP
;调至 LP 再次进入循环
;调用延时子程序
;DELAY 软件延时子程序
;这里用到堆栈
;这里循环了几次?
DELAY PROC
PUSH BX
PUSH CX
MOV BX,2
LP2:MOV CX,0
LP1:LOOP LP1
DEC BX
JNZ LP2
POP CX
POP BX
RET
DELAY ENDP
CODE ENDS
END START
运行结果:
实验二:亮 1 个灯,暗 7 个灯,从上到下轮流点亮每一个灯,
每次只亮一个灯,循环间隔约 2 秒;
汇编代码:
;定义堆栈------------------
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
;定义变量------------------
DATA SEGMENT
CNT DB 10000000B
;定义变量 CNT=80H
DATA ENDS
;代码段------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;这里不用改变
;这里不用改变
ORG 0100H
START:
MOV AX,DATA
MOV DS,AX
MOV AL,CNT
MOV DX,0000H
LP:OUT DX,AL
CALL DELAY
ROL AL,1
JMP LP
;数据段地址
;数据段存入数据段寄存器
;初始 CNT=10000000B 送 AL
;Led 外设的端口地址
;亮 1 桟灯?
;调用延时子程序
;添加你的程序
;添加你的程序
;添加你的程序
;其他程序段在理解的情况下可以自己编辑
JMP LP
;调至 LP 再次进入循环
;DELAY 软件延时子程序
DELAY PROC
;这里用到堆栈
;这里循环了几次?
PUSH BX
PUSH CX
MOV BX,2
LP2:MOV CX,0
LP1:LOOP LP1
DEC BX
JNZ LP2
POP CX
POP BX
RET
DELAY ENDP
CODE ENDS
END START
运行结果:
实验三:亮 2 个灯,暗 6 个灯,一个灯从上往中间轮流点亮,
另一个灯从下往中间轮流点亮,循环间隔约 1 秒。
;定义堆栈------------------
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
;定义变量------------------
DATA SEGMENT
;定义变量 CNT=80H
CNT DB 00000001B
DATA ENDS
;代码段------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
ORG 0100H
;这里不用改变
;这里不用改变
START:
MOV AX,DATA
MOV DS,AX
MOV BL,00000001B
MOV CL,10000000B
MOV AL,CNT
MOV DX,0000H
;数据段地址
;数据段存入数据段寄存器
;初始 CNT=10000000B 送 AL
;Led 外设的端口地址
LP: MOV AL,BL
ADD AL,CL
OUT DX,AL
CALL DELAY
SHL BL,1
SHR CL,1
JMP LP
;添加你的程序
;亮 1 桟灯?
;调用延时子程序
;添加你的程序
;添加你的程序
;其他程序段在理解的情况下可以自己编辑
JMP LP
;调至 LP 再次进入循环
;这里用到堆栈
;这里循环了几次?
;DELAY 软件延时子程序
DELAY PROC
PUSH BX
PUSH CX
MOV BX,2
LP2:MOV CX,0
LP1:LOOP LP1
DEC BX
JNZ LP2
POP CX
POP BX
RET
DELAY ENDP
CODE ENDS
END START
运行结果: