📄 ledirq0.asm
字号:
INTA00 EQU 20H
INTA01 EQU 21H
PORTSEG EQU 209H
PORTBIT EQU 208H
STACK SEGMENT STACK 'STACK'
DW 512 DUP (?)
STACK ENDS
DATA SEGMENT
MIN1 DB 0
MIN2 DB 0
DB 10
DB 10
SEC1 DB 0
SEC2 DB 0
INTMASK DB ?
CSREG DW ?
IPREG DW ?
COUNT DB 0
LED DB 3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH,40H
MES DB 'DISPLAY THE LEDS,PRESS ANY KEY TO DOS!'
DB 0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES
MOV AH,09
INT 21H
CLI ;关中断
MOV AX,3508H
INT 21H
MOV AX,ES
MOV CSREG,AX
MOV IPREG,BX
PUSH BX
PUSH DS ;接到8259的irq0
MOV AX,CS
MOV DS,AX
MOV DX,OFFSET INT_PROC ;设置新中断向量
MOV AX,2508H
INT 21H
POP DS
MOV DX,INTA01 ;8259的21端口
IN AL,DX
MOV INTMASK,AL
AND AL,0FEH ;允许08号中断
OUT DX,AL
;
MOV AL,36H ;8253初始化
OUT 43H,AL
MOV AL,34H
OUT 40H,AL
MOV AL,5DH ;5D34h对应50ms
OUT 40H,AL
;
STI
AGAIN: CALL DISP
MOV AH,01
INT 16H
JZ AGAIN
CLI
POP BX
MOV DX,INTA01
MOV AL,INTMASK
OUT DX,AL
MOV DX,IPREG
MOV AX,CSREG
MOV DS,AX
MOV AX,2508H
INT 21H
STI
MOV AX,4C00H
INT 21H
;
DISP PROC NEAR
MOV DI,OFFSET MIN1
MOV CL,01
DIS1: MOV AL,[DI] ;显示程序
MOV BX,OFFSET LED
XLAT
MOV DX,PORTSEG ;209端口
OUT DX,AL
MOV AL,CL
MOV DX,PORTBIT ;208端口
OUT DX,AL
PUSH CX
MOV CX,350H
DELAY: LOOP DELAY ;延时
POP CX
CMP CL,20H ;判断6位是否显示完
JZ CHG
INC DI
SHL CL,1
MOV AL,00 ;让led灭一下
OUT DX,AL
JMP DIS1
CHG: RET
DISP ENDP
;
INT_PROC:PUSH AX
PUSH CX
PUSH DX
PUSH DI
INC COUNT
CMP COUNT,50
JL QUIT
MOV COUNT,0
INC SEC2
CMP SEC2,10
JL QUIT
MOV SEC2,0
INC SEC1
CMP SEC1,6
JL QUIT
MOV SEC1,0
INC MIN2
CMP MIN2,10
JL QUIT
MOV MIN2,0
INC MIN1
CMP MIN1,6
JL QUIT
MOV MIN1,0
QUIT: MOV DX,PORTBIT
MOV AL,00
OUT DX,AL
MOV DX,INTA00
MOV AL,20H
OUT DX,AL
POP DI
POP DX
POP CX
POP AX
IRET
;
CODE ENDS
END START
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -