CODE SEGMENT ASSUME CS:CODE
INTPORT1 EQU 0020H ;8259口地址1,用来写ICW1
INTPORT2 EQU 0021H ;8259口地址2,用来写ICW2、ICW4 INTQ3 EQU INTERUPT3 INTQ7 EQU INTERUPT7
CONTPORT EQU 00DDH ;8279命令状态口地址 DATAPORT EQU 00DEH ;8279键盘显示数据口地址
DATA1 EQU 0500H ;错误信息显示缓冲区起始地址(0500H-0507H) DATA2 EQU 0508H DATA3 EQU 0518H DATA4 EQU 0520H DATA5 EQU 0528H DATA6 EQU 0529H DATA7 EQU 052AH DATA8 EQU 052BH DATA9 EQU 052CH DATA10 EQU 052EH
ORG 1800H
START: JMP TINT1
TINT1: CALL FORMAT CLD
MOV DX,004BH
MOV AL,0B6H
OUT DX,AL MOV DX,004AH MOV AL,50H
OUT DX,AL MOV AL,0C3H
OUT DX,AL
MOV SI,DATA3
CALL LEDDISP
MOV AX,0H MOV DS,AX
CALL WRINTVER MOV AL,13H MOV DX,INTPORT1 OUT DX,AL MOV AL,08H
MOV DX,INTPORT2 OUT DX,AL
;显示译码表起始地址(0508H-0517H) ;初始状态显示缓冲区(0518H-051FH) ;时间显示缓冲区起始地址(0520H-0527H) ;存放已重新刷新数码管个数 ;存放1/20秒定时中断次数 ;存放时间的小时值 ;存放时间的分值 ;存放时间的秒值
;待更新的显示区内的地址 ;写8253控制字,通道2,方式3 8位 ;计数初值高8位 ;计数初值低 MOV AL,0BH
OUT DX,AL ;写中断控制字 MOV AL,0F7H
OUT DX,AL ;用IR2请求中断 WAITING: STI
JMP WAITING
WRINTVER: MOV AX,0H MOV ES,AX
MOV DI,002CH LEA AX,INTQ3 STOSW
MOV AX,CS STOSW
MOV DI,003CH LEA AX,INTQ7 STOSW
MOV AX,CS STOSW RET
INTERUPT3: CLI MOV AL,DS:[DATA6] INC AL
MOV DS:[DATA6],AL
CMP AL,14H JC PLAY MOV BYTE PTR DS:[DATA6],00H MOV SI,DATA4 CALL LEDDISP CALL NEWTIME CALL CONVERSALL PLAY: MOV AL,20H
MOV DX,INTPORT1 OUT DX,AL STI IRET
INTERUPT7: CLI MOV SI,DATA1 CALL LEDDISP MOV AL,20H
MOV DX,INTPORT1 OUT DX,AL
;中断矢量地址(IR3) ;中断矢量地址(IR7) ;中断3服务程序
;DATA6存放1/20秒定时中断次数 ;判断是否满20次中断 ;否,清零中断次数
;指向时间显示缓冲区首地址 ;数码管显示子程序
;本子程序段按十进制完成时、分、 ;本程序段将秒、分、时值进行显示译码 IRET
LEDDISP: MOV AL,90H ;数码管显示子程序 MOV DX,CONTPORT OUT DX,AL
MOV BYTE PTR DS:[DATA5],00H ;存放已重新刷新数码管个 LED1: CMP BYTE PTR DS:[DATA5],07H ;判断是否已刷新8个数码 JA LED2 ;是,退出本数码管 MOV BL,DS:[DATA5] ;否,刷新本数码管 MOV BH,0H
MOV AL,CS:[BX+SI] MOV DX,DATAPORT OUT DX,AL
ADD BYTE PTR DS:[DATA5],01H JNZ LED1 LED2:
FORMAT: MOV BX,0
MOV WORD PTR DS:[BX+DATA1],5050H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0079H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],063FH ADD BX,2
MOV WORD PTR DS:[BX+DATA1],4F5BH ADD BX,2
MOV WORD PTR DS:[BX+DATA1],6D66H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],077DH ADD BX,2
MOV WORD PTR DS:[BX+DATA1],6F7FH ADD BX,2
MOV WORD PTR DS:[BX+DATA1],7C77H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],5E39H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],7179H ADD BX,2
RET ;未满8位从数据区取数送 ;显示位数加1 ;显示错误“rr” ;显示错误“E” ;显示“10 ” ;显示“32 ” ;显示“54 ” ;显示“76” ;显示“98 ” ;显示“BA ” ;显示“DC ” ;显示“FE ” MOV WORD PTR DS:[BX+DATA1],3F3FH ;显示“00 ” ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F40H ;显示“0— ” ADD BX,2
MOV WORD PTR DS:[BX+DATA1],403FH ;显示“—0 ” ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3FH ;显示“00 ” ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3FH ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F40H ADD BX,2
MOV WORD PTR DS:[BX+DATA1],403FH ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3FH
MOV BYTE PTR DS:[DATA6],00D MOV BYTE PTR DS:[DATA7],00D MOV BYTE PTR DS:[DATA8],00D MOV BYTE PTR DS:[DATA9],00D MOV WORD PTR DS:[DATA10],DATA4 RET
CONVERS1: MOV BH,0H
AND AL,0FH MOV BL,AL
MOV AL,CS:[BX+DATA2]
CONVERS2: PUSH AX CALL CONVERS1 MOV BX,WORD PTR DS:[DATA10] MOV DS:[BX],AL
ADD WORD PTR DS:[DATA10],01H POP AX PUSH CX MOV CL,4H SHR AL,CL POP CX
CALL CONVERS1
MOV BX,WORD PTR DS:[DATA10] MOV DS:[BX],AL RET RET
CONVERSALL: MOV AL,BYTE PTR DS:[DATA9]
CALL CONVERS2 ADD WORD PTR DS:[DATA10],02H MOV AL,BYTE PTR DS:[DATA8] CALL CONVERS2
ADD WORD PTR DS:[DATA10],02H MOV AL,BYTE PTR DS:[DATA7] CALL CONVERS2
MOV WORD PTR DS:[DATA10],DATA4 RET
NEWTIME: CMP BYTE PTR DS:[DATA9],59H JC ADD1
MOV BYTE PTR DS:[DATA9],0D CMP BYTE PTR DS:[DATA8],59H JC ADD2
MOV BYTE PTR DS:[DATA8],0D CMP BYTE PTR DS:[DATA7],23H JC ADD3
MOV BYTE PTR DS:[DATA7],0D JMP OK
ADD1: MOV AL,BYTE PTR DS:[DATA9] ADD AL,1D DAA
MOV BYTE PTR DS:[DATA9],AL JMP OK
ADD2: MOV AL,BYTE PTR DS:[DATA8] ADD AL,1D DAA
MOV BYTE PTR DS:[DATA8],AL JMP OK
ADD3: MOV AL,BYTE PTR DS:[DATA7] ADD AL,1D DAA
MOV BYTE PTR DS:[DATA7],AL OK: RET
CODE ENDS END START
四.实验体会
本实验使自己对中断的概念认识更深了,首先这次实验程序实现