📄 终结版.asm
字号:
;main.asm
;******************************************************
;* 堆栈段
.286;******************************************************
STACK_SEG SEGMENT STACK
STACK_BUF DW 120 DUP(?)
TOP EQU $-STACK_BUF
DB 64 DUP('STACK_SEG')
STACK_SEG ENDS
;******************************************************
;* 数据段
;******************************************************
DATA_SEG SEGMENT PARA
;*********定义 年、月、日、时、分、秒**********
YEAR DW ?
YEAR_H DB ?
YEAR_L DB ?
MONTH DB ?
DATE DB ?
HOUR1 DB ?
MIN1 DB ?
SEC1 DB ?
;------------------------------------------------------
;**********定义闹钟时间--时、分、秒************
AL_HOUR DB 16
AL_MIN DB 26
AL_SEC DB 0
;-------------------------------------------------------
NOTE1 DB 0AH,0DH,'-----TIME-----',0AH,0DH,'$'
NOTE2 DB 0AH,0DH,'$'
NOTE12 DB 0AH,0DH,'-----ALARM-----','$'
;------------------------------------------------------
CHAR1 DB '-','$';
CHAR2 DB ':','$'
;-------------------------------------------------------
BUF0 DB 7 DUP(0)
;-----------------------------------------------------
;************定义光标的相关属性*******************
ROW DB ? ;行
COL DB ? ;列
PAG DB 00H ;页
;------------------------------------------------------
; TODO: 数据的定义及存储器的分配
ts1 DB 0
quitbuf DB 'welcome you to run this programme.'''
quitbuf2 DB 'C: change color; B:extend the colck; S:reduce the clock'''
quitbuf3 DB 'Press q to quit '''
sigle DB 80h
absx DW 0
absy DW 0
sut DW 0
erroybz DB 0
r0 DW 80
x0 DW 320
y0 DW 250
count0 db 0
count_hour DB 11
count_minute DB 11
yuanxinx DW 0
yuanxiny DW 0
s DB 0
s2 DB 0
s3 DB 0
hour DW 0
hour2 DW 0
minute DW 0
minute2 DW 0
second DB 0
second2 DB 0
sin_x DW 0
sin_xx DW 0
x DW 0
y DW 0
x1 DW 0
xminy DW 0
yminx DW 0
xmax DW 0
ymax DW 0
ymin DW 0
xmin DW 0
sjx_xminy DW 0
sjx_yminx DW 0
sjx_xmax DW 0
sjx_ymax DW 0
sjx_ymin DW 0
sjx_xmin DW 0
yuanx DW 0
yuany DW 0
y1 DW 0
x2 DW 0
y2 DW 0
x3 DW 0
y3 DW 0
DIancolor DB 0
color DB 2
color_hour DB 6
color_min DB 10
color_second DB 9
color4 DB 6
color5 DB 2
color6 DB 12
backgroundcolor DB 1
page1 DB 0
y2y1 DW 0
x2x1 DW 0
sjx_y2y1 DW 0
sjx_x2x1 DW 0
;**********与闹钟相关的频率和时间**************
MUS_FREQ DW 330, 294, 262, 294, 3 DUP (330)
DW 3 DUP (294), 330,392,392
DW 330, 294, 262, 294, 4 DUP (330)
DW 293, 294, 330, 294, 262,-1
MUS_TIME DW 6 DUP (25*8), 50*8
DW 2 DUP (25*8, 25*8, 50*8)
DW 12 DUP (25*8), 100*8
FLAG DB 1
;------------------------------------------------------
DATA_SEG ENDS
;******************************************************
;* 代码段
;******************************************************
CODE_SEG SEGMENT PARA
;------------------------------------------------------
MAIN PROC FAR
ASSUME CS:CODE_SEG,DS:DATA_SEG
ASSUME SS:STACK_SEG
START:
MOV AX,STACK_SEG
MOV SS,AX
MOV SP,TOP
MOV AX,DATA_SEG
MOV DS,AX
;------------------------------------------------------
; TODO: 从这里开始您的代码
;------------------------------------------------------
beg: MOV AX,0012h
INT 10h
MOV DX,0010h
CALL b1002
LEA BP,quitbuf
MOV DX,010ah
LEA BP,quitbuf2
MOV DX,020ah
LEA BP,quitbuf3
CALL msg
beg2: CALL skin
CALL skin2
CALL skin3
CALL CLk
MOV second,DH
MOV second2,DH
MOV count_minute,11
CALL minute_lin
XOR DX,DX
MOV AX,minute2
MOV CX,12
DIV CX
MOV CX,AX ;minurte2/12
POP AX
ADD AX,CX
MOV hour2,AX
MOV count_hour,11
CALL hour_lin
CALL CLk
MOV DL,DH
CALL bcd2
XOR AH,AH
MOV CL,12
DIV CL
MOV count_minute,AH ;second%12初始值
DEC count_minute
XOR DX,DX
MOV AX,minute2
MOV CX,12
DIV CX ;minurte2%12
MOV count_hour,DL
DEC count_hour
INC second2
kk3: CLI
CALL second_lin
STI
;**************************************************-------------------------
MOV BH,PAG ;显示页号
MOV DH,03H ;
MOV DL,00H ;列
MOV AH,02H;设置光标位置
INT 10H
LEA DX,NOTE1;显示提示性语句"-----TIME-----"
MOV AH,09H
INT 21H
CALL BACK_LOOP;返回原位置显示使时钟在原位置走时
;**************************************
CALL CLOCK ;调用电子时钟显示程序
CALL DIS_ALARM1
CALL ALARM_START
;**************************************************-------------------------
JMP ks
ks: MOV AH,1
INT 16h
JZ kk3
MOV AH,8
INT 21h
CMP AL,'q'
JE quit
CMP AL,'Q'
JE quit
JMP kk3
CHange_color: LEA SI,color_hour
MOV CX,6
CHange_kk1: MOV AL, [SI]
INC AL
CMP AL,15
JC CHange_color_kk2
MOV AL,1
CHange_color_kk2:
MOV [SI],AL
INC SI
LOOP CHange_kk1
JMP tobeg2
a0:
tobeg2: CALL CLear
JMP beg2
quit: MOV AX,4C00H
INT 21H
;*************************************
hour_lin PROC NEAR
PUSHa
CMP count_hour,11
JB tohour_yl
JMP hour_lin_next
tohour_yl: MOV SIgle,3
JMP hour_yl
hour_lin_next:
MOV count_hour,0
MOV SIgle,5
CALL CLk
MOV DL,CH
CALL bcd2
CMP AL,12
JB hour_kk1
SUB AL,12
hour_kk1: MOV CL,30
MUL CL
PUSH AX
XOR DX,DX
MOV AX,minute2
MOV CX,12
DIV CX
MOV CX,AX ;minurte2/12
POP AX
ADD AX,CX
MOV hour2,AX
;擦掉
MOV Color,0
MOV AX,hour
MOV BX,r0
ADD BX,20
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,270
ADD BX,400 ;90
CALL renovate
MOV DX,yuanx ;擦掉
MOV x2,DX
MOV DX,yuany
MOV y2,DX
MOV DX,x0
MOV x1,DX
MOV DX,y0 ;擦掉
MOV y1,DX
CALL sjx
ADD AX,180
CALL renovate
MOV DX,yuanx ;擦掉
MOV x2,DX
MOV DX,yuany
MOV y2,DX
SUB BX,100
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX ;擦掉
CALL sjx
MOV SIgle,4
;***************************;; ;重写
hour_yl: MOV AL,color_hour
MOV color,AL
MOV AX,hour2
MOV BX,r0
ADD BX,70
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,90
ADD BX,600 ;90
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX ;重写
ADD AX,180
CALL renovate
MOV DX,yuanx
MOV x1,DX
MOV DX,yuany
MOV y1,DX
CALL sjxx
CALL sjxy
ADD AX,270
SUB BX,100
CALL renovate
MOV DX,yuanx
MOV x3,DX ;重写
MOV DX,yuany
MOV y3,DX
CALL sjx
CALL sjxx
CALL sjxy
MOV CX,hour2
MOV hour,CX
hour_quit: POPa
RET
hour_lin ENDP
;********************************
minute_lin PROC NEAR
PUSHa
CMP count_minute,11
JB tominute_yl ;仍是原来的一个
JMP minute_lin_next
tominute_yl: MOV SIgle,0
JMP minute_yl
minute_lin_next:
INC count_hour
CALL CLk
MOV DL,CL
CALL bcd2 ;bcd->16
MOV CL,6
MUL CL ;al*cl
PUSH AX
MOV DL,second2
CALL bcd2
XOR AH,AH
MOV CL,12
DIV CL
MOV CL,AL ;second2/12
POP AX
MOV CH,0
ADD AX,CX
MOV minute2,AX
AAAa1:
MOV SIgle,2
MOV Color,0
MOV AX,minute
MOV BX,r0
ADD BX,10
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,268
ADD BX,800 ;90
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
MOV DX,x0
MOV x1,DX
MOV DX,y0
MOV y1,DX
CALL sjx
ADD AX,180
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
ADD AX,90
SUB BX,200
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
CALL sjx
inc count0
cmp count0,5
jnz minute_yl
mov count0,0
;**********************************重写
minute_yl: MOV sigle,1
MOV AL,color_min
MOV color,AL
MOV AX,minute2
MOV BX,r0
ADD BX,30
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,90
ADD BX,900 ;90
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
ADD AX,180
CALL renovate
MOV DX,yuanx
MOV x1,DX
MOV DX,yuany
MOV y1,DX
CALL sjxx
CALL sjxy
ADD AX,270
SUB BX,200
CALL renovate
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -