📄 clockr.txt
字号:
CSEG SEGMENT
ASSUME CS:CSEG
TCON EQU 4BH
T2 EQU 4AH
CONTPORT EQU 0DFH
DATAPORT EQU 0DEH
ORG 1000H
START: JMP STA
DATA DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DATA1 DB 3FH,06H,5BH,4FH,66H,6DH
STA:
CLI
MOV AX,0
MOV DS,AX ;修改中断向量
MOV AX,OFFSET INT_PR
MOV WORD PTR DS:[2CH],AX
MOV AX,SEG INT_PR
MOV WORD PTR DS:[2EH],AX
MOV AL,00010011B ;对8259初始化
OUT 20H,AL
MOV AL,08H
OUT 21H,AL
MOV AL,00001111B
OUT 21H,AL
MOV AL,0F7H
OUT 21H,AL
MOV AL,10110110B ;对8253初始化
MOV DX,TCON
OUT DX,AL
MOV AX,2710H
MOV DX,T2
OUT DX,AL
MOV AL,AH
OUT DX,AL
;对数据区500H--501H初始化为0
MOV BX,500H ;用来存放秒的值
MOV BYTE PTR DS:[BX],09h
INC BX
MOV BYTE PTR DS:[BX],05h
MOV CX,0 ;中断计数初值,到100为1秒
CALL CONV ;倒计时从:00开始
CALL LEDDISP ;先让:00显示
STI ;开中断
NOM:CMP CX,100
JZ DENG
JMP NOM
DENG:MOV CX,0 ;到100为1秒,计数器置0
CMP BYTE PTR DS:[500H],0h ;显示值减1秒;秒个位是否为0
JNZ GG ;不为0则继续减计数
MOV BYTE PTR DS:[500H],09h ;为0则赋值9(减至9)
CMP BYTE PTR DS:[501H],0h ;比较十位是否为0
JNZ DD1 ;不为0则继续减计数
MOV BYTE PTR DS:[501H],05h ;十位为0则赋值5
jmp gg2 ;逢九显示
DD1:dec BYTE PTR DS:[501H] ;十位减
jmp gg2 ;逢零显示
GG: dec BYTE PTR DS:[500H] ;个位减
gg2:CALL CONV ;装显示时间数据
CALL LEDDISP ;调用时间显示子程序
JMP NOM
CONV: MOV BH,0 ;将存放在数据区500H--501H的秒值
MOV BL,BYTE PTR DS:[500H] ;转化为存放在数据区700H--701H的数码管显示代码
MOV AL,CS:[BX+DATA]
MOV BYTE PTR DS:[700H],AL
MOV BL,BYTE PTR DS:[501H]
MOV AL,CS:[BX+DATA1]
MOV BYTE PTR DS:[701H],AL
RET
LEDDISP:MOV AL,90H ;显示时间子程序
MOV DX,CONTPORT
OUT DX,AL
MOV BYTE PTR DS:[0600H],00
LED1: CMP BYTE PTR DS:[0600H],01h
JA LED2
MOV BL,DS:[0600H]
MOV BH,0H
MOV AL,DS:[BX+700H]
MOV DX,DATAPORT
OUT DX,AL
ADD BYTE PTR DS:[0600H],01H
JNZ LED1
LED2: RET
INT_PR: CLI ;中断服务程序
INC CX
STI
IRET
CSEG ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -