资源描述
实验三:利用8259A中断实现LED灯和数码管显示实验
安全0901 王宇航 09283020
实 验 报 告
1. 实验目的:
了解8259中断控制器的基本使用,掌握中断程序编程技术。同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。
2. 实验步骤:
8254A的OUT1输出接到8259A的MIR5上,每秒产生一次中断信号向8259A发出中断请求,在中断程序里将连接在8255A口的LED灯按照中断次数二进制点亮(即中断一次L0亮,中断两次L1亮,中断三次L1L0亮,中断四次L2亮……)。同时在数码管低位上显示中断次数。满10次后停止。
1.8254A在主程序中初始化。
CLK0工作在方式3,则控制字为00110110B,计数常数设为1000;
CLK1工作在方式3,则控制字为01110110B,计数常数设为1000,则OUT1输出为1HZ的方波。
2.8255A在使用前需要在主程序中初始化。
A口方式0输出,B口方式0输入,则控制字为10000011B。
3.8259A不用初始化,但在程序中需要包含以下几个部分:
(1)8259A的MIR5对应的中断向量号为35H,需用此来设置中断入口地址。
(2)设置中断入口地址之后,需设置中断屏蔽字OCW1,使IR5请求被允许,其他请求被禁止。
(3)中断服务程序结束之前写OCW2,送中断结束命令EOI。
4.中断服务程序的主要功能是LED指示灯和数码管显示。
图3-1 实验连线图
注意:实验系统的主8259A的片选信号为20H。
3. 实验代码:
.Model small
.386
DATA SEGMENT
DATA0 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;分别对应字符0-9
COUNT DB 10 ;计数值为10
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX ;DS装入段基址
LEA SI,DATA0 ;取操作数DATA0的16位偏移地址送到寄存器SI中
;8254初始化
MOV DX,203H ;8254命令口
MOV AL,00110110B ;控制字--0通道、方式3(方波发生器)、二进制计数
OUT DX,AL ;将控制字写入命令口
MOV DX,200H ;0通道的数据口
MOV AX,1000 ;计数常数=1000
OUT DX,AL ;先写入低字节
MOV AL,AH
OUT DX,AL ;再写入高字节
MOV DX,203H ;8254命令口
MOV AL,01110110B ;控制字1通道、方式3(方波发生器)、二进制计数
OUT DX,AL
MOV DX,201H ;1通道的数据口
MOV AX,1000 ;计数常数=1000
OUT DX,AL
MOV AL,AH
OUT DX,AL ;8255初始化
MOV DX,213H ;8255命令口
MOV AL,10000011B ;8255控制字--A口方式0输出,B口方式0输入
OUT DX,AL ;将控制字写入命令口
;中断入口地址设置(用串指令)
CLI ;关中断
MOV AX,0
MOV ES,AX ;置附件段基地址为0
MOV DI,4*35H ;置附件段偏移地址到DI
MOV AX,OFFSET INT_35 ;置中断程序首地址的偏移量到AX
CLD
STOSW ;填首地址的偏移量到中断地址表
MOV AX,SEG INT_35 ;置中断程序的段基地址到AX
STOSW ;填段基地址到中断地址表
IN AL,21H ;读中断屏蔽寄存器IMR
AND AL,11011111B ;设置中断屏蔽字OCW1,IR5请求被允许,其他请求被禁止
OUT 21H,AL ;将OCW1写入IMR中
STI ;开中断
WAIT:
CMP COUNT,10 ;判断10次中断是否结束
JNZ WAIT ;未结束,等待
CLI ;10次中断后,关中断
MOV AH,4CH ;结束,返回DOS
INT 21H
;延时程序
DELAY PROC
PUSH CX ;保护现场
MOV CX,100H ;延时时间为处理一次CX自减1的时间乘以100H
DELAY1: LOOP DELAY1
POP CX ;恢复现场
RET ;返回到调用处,继续执行
DELAY ENDP
;中断服务程序
INT_35 PROC
PUSH DX ;保护现场
PUSH AX
PUSH CX
CLI ;关中断
MOV AX,DATA
MOV DS,AX
INC COUNT ;中断次数加1
MOV AL,COUNT ;将中断次数写入AL中
MOV DX,210H ;8255数据口
OUT DX,AL ;将中断次数输出到LED显示灯
MOV CX,680H
CMP COUNT,10
JB GOON
-randomirandom; ;低于10时跳转到GOON
CMP COUNT,10
JNZ L1 ;不等于10(此处即大于10)时跳转到L1
SUB SI,9 ;第10次中断时SI减去9,即归0
L1:
MOV AL,[SI] ;查表,对应0-9
MOV DX,220H ;地址译码器连接六位数码管电路的数据口
OUT DX,AL
MOV DX,221H ;数据口
MOV AL,00000001B ;指定六位数码管在最低位显示0-9
OUT DX,AL
CALL DELAY ;调用延时程序
MOV AL,06H ;对应字符'1'
MOV DX,220H
OUT DX,AL
MOV DX,221H
MOV AL,00000010B ;指定六位数码管在次低位显示1
OUT DX,AL
CALL DELAY
LOOP L1 ;CX=680H
INC SI ;SI加1
JMP L ;跳转至L
GOON:
INC SI ;SI加1
MOV AL,[SI] ;查表
MOV DX,220H
OUT DX,AL
MOV DX,221H
MOV AL,00000001B
OUT DX,AL
L:
MOV AL,20H ;写OCW2,送中断结束命令EOI
OUT 20H,AL
STI ;开中断
POP CX ;恢复现场
POP AX
POP DX
IRET ;中断返回
INT_35 ENDP
CODE ENDS
END START
4. 试验流程图:
主程序流程图
开始
中断次数计数值COUNT=10
将字符0-9对应的操作数的偏移地址送入寄存器SI中
8254初始化
8255初始化
中断入口地址设置
开中断
COUNT=10?
N
中断服务程序
关中断
设置OCW1并写入IMR中,使只有IR5请求被允许
Y
返回DOS
主程序结束
中断服务程序流程图
Y
保护现场
关中断
COUNT+1→COUNT
将中断次数输出到LED显示灯
COUNT<10?
COUNT=10?
查表,使六位数码管在最低位显示中断次数的个位
调用延时程序
使六位数码管在次低位显示1
调用延时程序
SI-9→SI
N
SI+1→SI
Y
N
Y
查表,使六位数码管在最低位显示中断次数
CX-1→CX
CX=0?
写OCW2,送中断结束命令EOI
SI+1→SI
Y
N
开中断
恢复现场
中断返回
展开阅读全文