📄 xt00.txt
字号:
;第七章习题11:用8086,8255,8259和8254构造系统实现对指示灯控制。
;8255的PA0,PA1,PA2的三位DIP开关,通过DIP开关的闭合状态决定接在
;PB口上的八个指示灯之一闪烁。如PA2,PA1,PA0为000时,PB0上所接的指
;示灯闪烁,其余灯熄灭。要求闪烁频率为每秒10次。设8259地址为20H和
;21H,8255地址为60H~63H,8254地址为40H~43H,时钟频率为50KHz,
;8259中断向量号为70H和71H.试设计硬件连接电路,填写中断向量表,编
;写全部初始化程序,完成控制程序编写。
;解:
;全局定义为了便于在实验机上调试,现将地址改成可以在实验机上调试的地址
;中断矢量号从20H开始,8254工作方式3.
D8255A EQU 60H
D8255B EQU 61H
D8255C EQU 62H
Z8255 EQU 63H
D8254_0 EQU 40H
D8254_1 EQU 41H
D8254_2 EQU 42H
Z8254 EQU 43H
INT0 EQU 70H
INT1 EQU 71H
STACK SEGMENT STACK
STA DW 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,SS:STACK
ORG 1000H
START: ;初始化
;8255
;PA口方式0输入,PB口方式0输出,C口上半口输出,下半口输出
MOV AL, 10010000B
MOV DX, Z8255
OUT DX, AL
;MOV AL,0FFH
MOV AL, 00H
MOV DX, D8255B
OUT DX, AL
;8254
;用#0计数器计数,工作方式3产生中断,计数初值为2500,16进制计数
MOV AL,00111110B
MOV DX,Z8254
OUT DX,AL
MOV AL,0c4H
MOV DX,D8254_0
OUT DX,AL
MOV AL,9H
OUT DX,AL
;8259
; 设置中断的入口地址
xor bx,bx
push bx
pop ds
CLI ;关中断
;以下3个中断向量分别分配给IRQ0
LEA AX,IRQ0_INTERRUPT;中断向量20H
MOV ds:WORD PTR[80H],AX
MOV ds:WORD PTR[82H],CS
NOP
push cs
pop ds
;ICW1,采用单片8259,边缘触发,需要ICW4
MOV AL,00010011B
MOV DX,INT0
OUT DX,AL
;ICW2,中断起始矢量号为70H号
MOV AL,70H
MOV DX,INT1
OUT DX,AL
;ICW4,指定非特殊中断结束
MOV AL,01H
OUT DX,AL
;8259操作命令
;OCW1: 特征 A0 = 1 按顺序判断
; 初始化结束后,只有OCW1要求A0=1
; 其它操作命令OCW2,OCW3 都要求A0=0
MOV AL,0FEH ;开放0中断
OUT DX,AL
;OCW2: 特征 A0 = 0 ,D4=0,D3=0
MOV AL, 20H ;非特殊EOI结束中断
MOV DX,INT0
OUT DX,AL
sti
;主程序
mov PBOFF,0
MAIN:
;不做任何事情
JMP MAIN
;数据区
; PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7 显示码
PBFLASH DB 01H,02H,04H,8H,10H,20H,040H,080H
PBOFF db 0
PA8255 db 0
; 外部硬件中断处理程序
;
;************************************************
IRQ0_INTERRUPT PROC NEAR
PUSH AX
PUSH BX
PUSH DX
; 为保证实时钟计数不开中断
sti ;开中断
MOV AL,PBOFF
CMP AL,01H
JE outpb0
MOV DX,D8255A
in al, DX
and al,07
LEA BX,PBFLASH
XLAT
MOV DX,D8255B
OUT DX,AL
MOV PBOFF,1
JMP EXIT0
outpb0:
MOV DX,D8255B
MOV AL,0H
OUT DX,AL
MOV PBOFF,0
EXIT0: cli ;关中断
;EOI方式
MOV AL, 20H ;不指定EOI结束中断
MOV DX,INT0
OUT DX,AL
POP DX
POP BX
POP AX
IRET
IRQ0_INTERRUPT ENDP
CODE ENDS
END START
//////////////////////////////////////////////////////////////////////
;第七章练习题七:一8255芯片的A口和B口分别与8个LED灯和8个开关连接好,
;通过开关控制LED灯的开和闭。8255的端口地址为40,41,44和46H。画出译
;码电路图,编写初始化程序和控制程序。
;解:
;全局定义
D8255A EQU 40H
D8255B EQU 42H
D8255C EQU 44H
Z8255 EQU 46H
STACK SEGMENT STACK
STA DW 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,SS:STACK
ORG 1000H
START:
;8255 初始化
;8255 A口方式0输出,B口方式0输入,C口上半口输出,下半口输出
MOV AL, 10000010B
OUT Z8255, AL
L1: MOV AL, D8255B
OUT D8255A,AL
MOV CX, 0FFH
JMP L1
CODE ENDS
END START
/////////////////////////////////////////////////////////////////////
;习题6第7题:某系统中8254芯片的通道0~通道2和控制字端口分别为
;FFF0H~FFF2H,定义通道0工作方式2,CLK0=5MHz,要求输出OUT0=1kHz
;方波;定义通道1工作在方式4,用OUT0作为计数脉冲,计数值为1000,
;计数器计到0向CPU发中断请求,CPU响应这一中断后继续写入计数值
;1000,重新开始计数,保持1秒钟向CPU发出一次中断请求。请画出硬件
;链接图,并编写初始化程序。
;解:
INT0 EQU 20H
INT1 EQU 21H
C8254 EQU 0FFF3H
D8254 EQU 0FFF0H
STACK SEGMENT STACK
STA DW 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ORG 1000H
ASSUME CS:CODE,DS:CODE,SS:STACK
START: ;初始化
;设置中断的入口地址
XOR BX,BX
PUSH BX
POP DS ;将DS清零
CLI ;关中断
;如果设置8259的起始中断向量号为8
;以下6个中断向量分别分配给IRQ0.
LEA AX,IRQ0_INTERRUPT ;中断向量8H
MOV DS:WORD PTR[32],AX
MOV DS:WORD PTR[34],CS
NOP
PUSH CS ;将CS中的内容传到DS
POP DS
;初始化8259
CLI ;关中断
;ICW1: 特征 A0 = 0 , D4 = 1
;边沿触发要求上升沿后保持高电平,
MOV AL, 00010011B ;边沿触发,单片使用,需要ICW4
OUT INT0, AL
JMP $+2 ;延时
;ICW2: 特征 A0 = 1 按顺序判断
MOV AL, 00001000B ;中断矢量从08H号开始
OUT INT1, AL
JMP $+2
;ICW4: 特征 A0 = 1 按顺序判断,ICW1设置要ICW4
;EOI,全嵌套方式,非缓冲,86/88系统
MOV AL, 00000001 ;采用全嵌套,非缓冲,非自动结束,16位微机处理
OUT INT1, AL
JMP $+2
;8259操作命令
;************************************************
;OCW1: 特征 A0 = 1 按顺序判断
; 初始化结束后,只有OCW1要求A0=1
; 其它操作命令OCW2,OCW3 都要求A0=0
;************************************************
MOV DX,INT1
MOV AL,0FEH ;假设只用1个可屏蔽中断,开放1个可屏蔽中断
OUT DX,AL
MOV CX,0FFFH
LOOP $
;************************************************
;OCW2: 特征 A0 = 0 ,D4=0,D3=0
;************************************************
MOV DX,INT0
MOV AL,20H ;00100000B,非特殊EOI结束中断
OUT DX,AL
MOV CX,0FFFH
LOOP $
;************************************************
;OCW3: 特征 A0 = 0 ,D4=0,D3=1
;************************************************
;初始化8254
MOV AL, 00110101B ;写8254控制字,定义计数器0#工作方式2,使用16
;位BCD计数方式
MOV DX, C8254 ;地址数据太大,采用寄存器间接寻址
OUT DX, AL
MOV AX, 5000 ;为计数器0送计数初值,先送低8位,5000000HZ/1000Hz=5000
MOV DX, D8254
OUT DX, AL
MOV AL, AH
OUT DX, AL
MOV AL, 01111001B ;写8254控制字,定义计数器1#工作方式4,使用16
MOV DX, C8254 ;位BCD计数方式
OUT DX, AL
RECOUNT: MOV AX, 1000 ;为计数器1送计数初值,先送低8位,1000Hz/1Hz=1000
MOV DX, D8254
INC DX
OUT DX, AL
MOV AL, AH
OUT DX, AL
IRQ0_INTERRUPT PROC NEAR
PUSH AX
PUSH DX
STI ;开中断
MOV DX, INT0
MOV AL, 20H ;结束中断
OUT DX, AL
MOV AX, 1000 ;为计数器1送计数初值,先送低8位,1000Hz/1Hz=1000
MOV DX, D8254
INC DX
OUT DX, AL
MOV AL, AH
OUT DX, AL
CLI ;关中断
POP DX
POP AX
IRET
IRQ0_INTERRUPT ENDP
CODE ENDS
END START
//////////////////////////////////////////////////////////////////////////////////////
;第6章第4题:用8254作为某数据采集系统的定时器,每隔10ms用中断方式采集一次
;数据,已知输入时钟频率为10kHz,8259端口地址为20~21H,中断类型号为13H,
;8254端口地址为40~43H,请为8259和8254编制初始化程序。
;解:
INT0 EQU 20H
INT1 EQU 21H
D8254 EQU 43H
D8254A EQU 40H
STACK SEGMENT STACK
STA DW 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ORG 1000H
ASSUME CS:CODE,DS:CODE,SS:STACK
START: ;初始化
;设置中断的入口地址
XOR BX,BX
PUSH BX
POP DS ;将DS清零
CLI ;关中断
;如果设置8259的起始中断向量号为10
;以下6个中断向量分别分配给IRQ0、IRQ1、IRQ2、IRQ3.
LEA AX,IRQ0_INTERRUPT ;中断向量10H
MOV DS:WORD PTR[64],AX
MOV DS:WORD PTR[66],CS
NOP
LEA AX,IRQ1_INTERRUPT ;中断向量11H
MOV DS:WORD PTR[68],AX
MOV DS:WORD PTR[70],CS
NOP
LEA AX,IRQ2_INTERRUPT ;中断向量12H
MOV DS:WORD PTR[72],AX
MOV DS:WORD PTR[74],CS
NOP
LEA AX,IRQ3_INTERRUPT ;中断向量13H
MOV DS:WORD PTR[76],AX
MOV DS:WORD PTR[78],CS
NOP
PUSH CS ;将CS中的内容传到DS
POP DS
;初始化8259
CLI ;关中断
;ICW1: 特征 A0 = 0 , D4 = 1
;边沿触发要求上升沿后保持高电平,
MOV AL, 00010011B ;边沿触发,单片使用,需要ICW4
OUT INT0, AL
JMP $+2 ;延时
;ICW2: 特征 A0 = 1 按顺序判断
MOV AL, 00010000B ;中断矢量从10H号开始
OUT INT1, AL
JMP $+2
;ICW4: 特征 A0 = 1 按顺序判断,ICW1设置要ICW4
;EOI,全嵌套方式,非缓冲,86/88系统
MOV AL, 00000001 ;采用全嵌套,非缓冲,非自动结束,16位微机处理
OUT INT1, AL
JMP $+2
;8259操作命令
;************************************************
;OCW1: 特征 A0 = 1 按顺序判断
; 初始化结束后,只有OCW1要求A0=1
; 其它操作命令OCW2,OCW3 都要求A0=0
;************************************************
MOV DX,INT1
MOV AL,0F0H ;假设只用4个可屏蔽中断,四个中断全部开放
OUT DX,AL
MOV CX,0FFFH
LOOP $
;************************************************
;OCW2: 特征 A0 = 0 ,D4=0,D3=0
;************************************************
MOV DX,INT0
MOV AL,20H ;00100000B,非特殊EOI结束中断
OUT DX,AL
MOV CX,0FFFH
LOOP $
;************************************************
;OCW3: 特征 A0 = 0 ,D4=0,D3=1
;************************************************
;初始化8254
MOV AL, 00110001B;82540号计数器,工作方式0,16位数,二进制
OUT D8254, AL
MOV AX, 100 ;为计数器0送计数初值,先送低8位
OUT D8254A, AL
MOV AL, AH
OUT D8254A, AL ;为计数器0送计数初值高8位
;中断服务程序
IRQ0_INTERRUPT PROC NEAR
PUSH AX
PUSH DX
STI ;开中断
;........不处理返回
;........
CLI ;关中断
POP DX
POP AX
IRET
IRQ0_INTERRUPT ENDP
IRQ1_INTERRUPT PROC NEAR
PUSH AX
PUSH DX
STI ;开中断
;........不处理返回
;........
CLI ;关中断
POP DX
POP AX
IRET
IRQ1_INTERRUPT ENDP
IRQ2_INTERRUPT PROC NEAR
PUSH AX
PUSH DX
STI ;开中断
;........不处理返回
;........
CLI ;关中断
POP DX
POP AX
IRET
IRQ2_INTERRUPT ENDP
IRQ3_INTERRUPT PROC NEAR
PUSH AX
PUSH DX
STI ;开中断
MOV DX,INT0
MOV AL,20H ;结束中断
OUT DX,AL
CLI ;关中断
POP DX
POP AX
IRET
IRQ3_INTERRUPT ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -