📄 计时器.asm
字号:
;*---------------------------------------------------------*
;* 8255、8259综合应用实验-用彩灯显示计时情况 *
;* 彩灯点亮显示时间程序source file *
;* 运行步骤:1. 按下sw3开始计时 *
;* 2.再次按下SW3,申请1次中断,暂停 *
;* 使LED灯点亮显示当前时间 *
;* 3.再次按下SW3,继续计时 *
;* 4.再按下则清0. *
;* *
;*---------------------------------------------------------*
STACK1 SEGMENT STACK
DW 200 DUP(?)
STACK1 ENDS
DATA SEGMENT
MESG1 DB 'Press SW3 one time to invoke interrupt one time,and to light one of LEDs',0ah,0dh
DB 'Exit with q/Q',0ah,0dh,'$'
NUM db(0)
;flag db(0)
INT0A_OFF DW(?)
INT0A_SEG DW(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MESG1
INT 21h ;显示提示信息
MOV DX,303H ;初始化8255
MOV AL,83H
OUT DX,AL
MOV DX,300H ;LED灯熄灭
MOV AL,00H
OUT DX,AL
MOV DX,303H ;8255命令口
NOP
MOV AX,3572H ;获取原中断向量
INT 21H
MOV INT0A_OFF,BX ;保存原中断向量
MOV BX,ES
MOV INT0A_SEG,BX
CLI ;关中断
MOV AX,2572H
MOV DX,SEG LEDLIGHT ;设置新的中断向量
PUSH DS
MOV DS,DX
MOV DX,OFFSET LEDLIGHT
INT 21H
POP DS
STI ;开中断
IN AL,0A1H ;打开IRQ10
AND AL,0FBH
OUT 0A1H,AL
IN AL,21H ;打开IRQ2
AND AL,0FBH
OUT 21H,AL
L1:
MOV DX,302H ;查PC2是否为0,即是否有键按下
IN AL,DX
AND AL,04H
JNZ L1
lp1:
in al,dx
test al,04h
jz lp1 ;循环检测直至放开
L2:
add num,01h
mov al,num ;开始计时
mov dx,300h
out dx,al
call delay
L3: MOV DX,302H ;查PC2是否为0,即是否有键按下
IN AL,DX
AND AL,04H
JZ L5
lp2: in al,dx
test al,04h
jz lp2 ;循环检测直至放开
L4: add num,01h
mov al,num
mov dx,300h
out dx,al
call delay
jmp L3
L5: in al,dx
test al,04h
jz L5 ;循环检测直至放开
MOV DX,303H ;按下SW3,则PC4=1申请中断
MOV AL,09H
OUT DX,AL
PUSH CX
MOV CX,100
WT: LOOP WT
POP CX
MOV DX,303H ;置PC4=0
MOV AL,08H
OUT DX,AL
L6: MOV DX,302H ;查PC2是否为0,即是否有键按下
IN AL,DX
AND AL,04H
JnZ L6
lp3: in al,dx
test al,04h
jz lp3 ;循环检测直至放开
L9: add num,01h
mov al,num
mov dx,300h
out dx,al
call delay
MOV DX,302H ;查PC2是否为0,即是否有键按下
IN AL,DX
AND AL,04H
lp4: in al,dx
test al,04h
jz lp4 ;循环检测直至放开
mov num,00h
mov al,num
mov dx,300h
out dx,al
jmp L1
EXIT:
MOV AX,2572H ;恢复中断向量
MOV DX,INT0A_SEG
PUSH DS
MOV DS,DX
MOV DX,INT0A_OFF
INT 21H
POP DS
IN AL,0A1H ;屏蔽IRQ10
OR AL,04H
OUT 0A1H,AL
IN AL,21H ;屏蔽IRQ2
OR AL,04H
OUT 21H,AL
MOV AX,4C00H ;程序退出
INT 21H
LEDLIGHT PROC FAR ;中断服务程序
PUSH SI
PUSH AX
PUSH DX
CLI ;关中断
mov al,num ;暂停
mov dx,300h
out dx,al
here:
MOV AL,62H ;发中断结束命令
MOV DX,0A0H
OUT DX,AL ;向从片8259发EOI命令
OUT 020H,AL ;向主片8259发EOI命令
STI ;开中断
POP DX
POP AX
POP SI
IRET
LEDLIGHT ENDP
DELAY PROC
PUSH CX
PUSH BX
MOV CX,0FFFH
DL2: MOV BX,0FFFFH
DL1: DEC BX
JNZ DL1
DEC CX
JNZ DL2
POP BX
POP CX
RET
DELAY ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -