📄 pcclk.asm
字号:
;FILENAME: PCCLK.ASM
;内容: 硬件中断时间显示 8253 10MS INTERRUPT
PAGE 60,78
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(0)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'
COUNT DB 100
TENH DB '2'
HOUR DB '3:'
TENM DB '5'
MINUTE DB '9'
DB ':'
TENS DB '5'
SECOND DB '0', 0DH ,'$'
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
START PROC FAR
ASSUME CS:CODE
PUSH DS
MOV AX,0
PUSH AX
MOV AH, 01H ;等待键按下,AL=字符的ASCII码
INT 21H
CLI
CLD
MOV AX, 0000H
MOV DS, AX
MOV SI, 0020H ;DS:SI指向08H中断向量
LODSW ;取08中断入口的偏移地址
MOV BX,AX
LODSW ;取08中断入口段地址
PUSH AX ;压栈保护
PUSH BX
MOV AX,DATA ;建立数据段的可寻址性
MOV DS, AX
ASSUME DS:DATA
MOV AX, 0000H
MOV ES, AX
MOV DI, 0020H ;ES:DS指向08中断向量存放地址
MOV AX,OFFSET TIMER
STOSW ;写入偏移地址
MOV AX,CS
STOSW ;写入段地址
MOV AL,00110110B ;8253初始化,0通道,3方式,HEX
OUT 43H,AL
MOV AX,11932 ;初值=11932
OUT 40H, AL
MOV AL ,AH
OUT 40H, AL
IN AL,21H ;读8259的中段屏蔽寄存器IMR
PUSH AX ;压栈保护
MOV AL, 0FCH
STI
FOREVER:
MOV DL,0FFH ;有键按下吗?
MOV AH, 06H
INT 21H
JZ DISP ;无键按下则转显示DISP
CMP AL, 20H ;是空格键吗?
JZ EXIT ;是则退出
DISP: MOV DX, OFFSET TENH ;不是则显示时间
MOV AH, 09H
INT 21H
MOV AL, SECOND ;取秒单元值
WAITCHA:
CMP AL,SECOND ;改变否?
JZ WAITCHA ;没变则等待
JMP FOREVER ;变则转FOREVER
EXIT: CLI ;有空格键按下退出
CLD
POP AX
OUT 21H,AL ;恢复IMR
MOV AL, 36H ;8253初始化,55ms
OUT 43H,AL
MOV AL, 0
OUT 40H,AL
OUT 40H,AL
MOV AX,0 ;恢复08H中断中断向量
MOV ES, AX
MOV DI, 4*8
POP AX
STOSW
POP AX
STOSW
STI
RET
TIMER PROC FAR
PUSH AX
DEC COUNT
JNZ L2 ;不到1秒L2
MOV COUNT, 100 ;到1秒,重置COUNT,并修改时间
INC SECOND
CMP SECOND,'9'
JLE TIMEXT
MOV SECOND,'0'
INC TENS
CMP TENS,'6'
JL TIMEXT
MOV TENS,'0'
INC MINUTE
CMP MINUTE,'9'
JLE TIMEXT
MOV MINUTE ,'0'
INC TENM
CMP TENM,'6'
JL TIMEXT
MOV TENM,'0'
JMP L3
L2: JMP TIMEXT
L3: MOV AL ,HOUR
AND AL, 0FH
MOV AH, TENH
AND AH, 0FH
MOV CL, 4
ROR AH,CL
OR AL,AH
ADD AL, 1
DAA
CMP AL, 24
JL L1
MOV TENH,'0'
MOV HOUR ,'0'
JMP TIMEXT
L1: MOV AH,AL
AND AL, 0FH
OR AL, 30H
MOV HOUR, AL
MOV CL,4
ROR AH,CL
AND AH, 0FH
OR AH, 30H
MOV TENH,AH
TIMEXT:
MOV AL, 20H
OUT 20H, AL ;发中断结束命令
POP AX
IRET
TIMER ENDP
START ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -