📄 hld.asm
字号:
DATA SEGMENT
LEDTAL DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0H
var DB 3,0,10,10
DATA ENDS
STACK SEGMENT
DW 128 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK,DS:DATA
START:
;初始化
;----------------------------------------------------------
CLI
;填中断向量表——计时中断
XOR AX,AX
MOV DS,AX
MOV AX,OFFSET SEV
ADD AX,2000H
MOV SI,003CH
MOV [SI],AX
MOV AX,00H
MOV [SI+2],AX
;初始化8259
IN AL,21H ;不屏蔽IR7中断请求
AND AL,7fH
OUT 21H,AL
;初始化8255A
;A口输出段码,B口输出位码
MOV AL,80H
OUT 63H,AL
;初始化8253A
;计数器2,方式3,每50毫秒一次中断
MOV AL,0B6H
OUT 43H,AL
MOV AX,59500
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
;----------------------------------------------------------
;主程序
;----------------------------------------------------------
MOV AX,DATA
MOV DS,AX
STI
mov CH,0
MOV CL,20 ;中断20次更改一次时间
MOV AL,11000011B
OUT 61H,AL
;循环显示时间
LOP: CALL DISPLAY ;显示4位七段数码(子程序)
CMP Cl,0
JNZ LOP
MOV Cl,20
CALL UPDATE ;一秒到达,修改分、秒(子程序)
CMP CH,0
JNZ T1
MOV AL,VAR
CMP AL,0
JNZ LOP
MOV AL,VAR+1
CMP AL,0
JNZ LOP
JMP REACH
T1: MOV AL,VAR+2
CMP AL,0
JNZ LOP
MOV AL,VAR+3
CMP AL,0
JNZ LOP
REACH :
CMP CH,0
JNZ N1
MOV CH,1
;------------------
MOV AL,3
MOV VAR+2,AL
MOV AL,0
MOV VAR+3,AL
MOV AL,10
MOV VAR,AL
MOV VAR+1,AL
;------------------
MOV AL,00111100B
OUT 61H,AL
JMP LOP
N1: MOV CH,0
;------------------
MOV AL,3
MOV VAR,AL
MOV AL,0
MOV VAR+1,AL
MOV AL,10
MOV VAR+2,AL
MOV VAR+3,AL
;------------------
MOV AL,11000011B
OUT 61H,AL
JMP LOP
;----------------------------------------------------------
;中断服务子程序
;----------------------------------------------------------
;功能:每50毫秒中断一次 , CX为传递参数
;20次中断后,CX为0,即一秒时间到达,主程序修改一次时间
SEV: CLI
PUSH AX
DEC Cl
mov al,20h
out 20h,al
POP AX
STI
IRET
;----------------------------------------------------------
;----------------------------------------------------------
;时间更新子程序
UPDATE PROC NEAR
CLI
PUSH AX
push DI
CMP CH,0
JNZ U1
MOV DI,OFFSET VAR
JMP U2
U1: MOV DI,OFFSET VAR+2
U2: MOV AL,[DI+1]
CMP AL,0
JZ UP1
DEC AL
MOV [DI+1],AL
JMP TEND
UP1: MOV AL,9
MOV [DI+1],AL
MOV AL,[DI]
CMP AL,0
JZ UP2
DEC AL
MOV [DI],AL
JMP TEND
UP2: MOV AL,3
MOV [DI],AL
TEND: pop DI
pop AX
STI
RET
UPDATE ENDP
;----------------------------------------------------------
;在led上显示时间的子程序
;----------------------------------------------------------
DISPLAY PROC NEAR
PUSH AX
PUSH BX
PUSH DX
PUSH DI
MOV DI, OFFSET var
;显示部分
MOV DL,0FEH ;初始化位码,先点亮最左边显示器
ST1: MOV AL,DL
TEST AL,10H ;最右边显示器亮?
JZ ED ;是,时间显示结束
OUT 62H,AL ;位码送B口
ROL AL,01H ;改变位码
MOV DL,AL
MOV AL,[DI] ;取要显示的字符
MOV BX,OFFSET LEDTAL ;七段码的首址送BX
XLAT ;把显示字符转换成相应的7段码
OUT 60H,al ;显示字符的7段码送端口A
CALL DELAY ;调用延时子程序
INC DI ;地址指针调整
JMP ST1
ED: POP DI
POP DX
POP BX
POP AX
RET
DISPLAY ENDP
;----------------------------------------------------------
;延时服务子程序
;----------------------------------------------------------
DELAY PROC NEAR
PUSH BX
PUSH AX
MOV AX,10
A1: MOV BX,20
A2: DEC BX
JNZ A2
DEC AX
JNZ A1
POP AX
POP BX
RET
DELAY ENDP
;----------------------------------------------------------
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -