⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daytime1.asm

📁 日历 上学期帮人做的课程设计,由于打游戏,没做完,基本功能应该没什么问题,
💻 ASM
字号:
PRINT 	MACRO X				;输出(不带换行)宏
	PUSH	AX
	PUSH	DX
	MOV	DL,X
	MOV	AH,2			
	INT 21H
	POP	DX
	POP	AX
ENDM
PRINT1 	MACRO X				;输出(不带换行)宏
	PUSH	AX
	PUSH	DX
	LEA	DX,X
	MOV	AH,9			
	INT 21H
	POP	DX
	POP	AX
ENDM
STACK SEGMENT STACK
      DW 200 DUP (?)
STACK ENDS
DATA SEGMENT
	ERORRMES_1 DB	'WRONG SET!$'
      RMES_1 	DB 	'OK!$'
      SPACE DB 1000 DUP (' ')
      PATTERN DB 6 DUP (' '),0C9H,26 DUP (0CDH),0BBH,6 DUP (' ')
              DB 6 DUP (' '),0BAH,26 DUP (20H),0BAH,6 DUP (' ')
              DB 6 DUP (' '),0C8H,26 DUP (0CDH),0BCH,6 DUP (' ')
      DBUFFER DB 8 DUP (':'),12 DUP (' ')
      COUNT	DB $-DBUFFER
      CLOCK_1 DB 8 DUP (':'),12 DUP (' ')
      DBUFFER1 DB 20 DUP (' ')
      YEAR   DW 2008
      MOnth  DB 01
      DAY   DB 01
      HOUR   DB 0
      MINUTE  DB 0
      SECD   DB 0
      STR  DB 0DH,0AH, 'PLEASE INPUT DATE(D) OR TIME(T) OR QUIT(Q): $'
      TEMP DW	4 DUP(?)
DATA ENDS
CODE SEGMENT

      ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
	MOV DS,AX
	MOV ES,AX
	MOV AX,0001H          ;设置显示方式为40*25彩色文本方式            
       INT 10H
       MOV AX,DATA
       MOV DS,AX
       MOV ES,AX
       MOV BP,OFFSET SPACE       
       MOV DX,0B00H
       MOV CX,1000
       MOV BX,0040H
       MOV AX,1300H
       INT 10H
       MOV BP,OFFSET PATTERN ;显示矩形条     
       MOV DX,0B00H
       MOV CX,120
       MOV BX,004EH
       MOV AX,1301H
       INT 10H
	MOV AX,DATA
	MOV DS,AX
	MOV ES,AX
MES:    LEA DX,STR            ;显示提示信息
       MOV AH,9
       INT 21H
       MOV AH,3
	INT 10H
	MOV TEMP,DX		
     	MOV AH,1              ;从键盘输入单个字符
     	INT 21H
       	CMP AL,'M'            ;AL='M'?
      	JNE A1
A:     	CALL DATE             ;显示系统日期
   	JMP	A1
A1:	MOV	AH,8
	INT 21H
	CMP	AL,'M'		;AL='M'?
	JNZ	A2	
	CALL TIME		;显示时间
	JMP	A2
A2:	MOV	AH,8
	INT 21H
	CMP	AL,'M'
	JNZ	A3
	CALL	CLOCK
	JMP	START
A3:	CMP AL,51H            ;AL='Q'?            
       JNE MES
       MOV AH,4CH            ;返回dos状态
       INT 21H

DATE   PROC NEAR             ;显示日期子程序
DISPLAY:MOV AH,2AH           ;取日期
       INT 21H
       MOV SI,0
       MOV AX,CX
       MOV BX,100
       DIV BL
       MOV BL,AH
       CALL BCDASC1         ;日期数值转换成相应的ASCII码字符
       MOV AL,BL
       CALL BCDASC1
       INC SI
       MOV AL,DH
       CALL BCDASC1
       INC SI
       MOV AL,DL
       CALL BCDASC1
       MOV BP,OFFSET DBUFFER1
       MOV DX,0C0DH
       MOV CX,20
       MOV BX,004EH
       MOV AX,1301H
       INT 10H
       MOV AH,02H          ;设置光标位置
       MOV DX,0300H
       MOV BH,0
       INT 10H
       MOV AH,01H          ;读键盘缓冲区字符到AL寄存器
       INT 16H
       JE  DISPLAY
	CMP	AL,'A'
	JNZ	C1
	CALL CHANGE
	RET
 C1:   CMP	AL,'M'
	JNZ	C4
	RET
C4:	JMP START
       MOV AX,4C00H
       INT 21H
       RET
DATE  ENDP

TIME   PROC NEAR        ;显示时间子程序
DISPLAY1:MOV SI,0
       MOV BX,100
       DIV BL
       MOV AH,2CH       ;取时间
       INT 21H
       MOV AL,CH
       CALL BCDASC      ;将时间数值转换成ASCII码字符
       INC SI
       MOV AL,CL
       CALL BCDASC
       INC SI
       MOV AL,DH
       CALL BCDASC
	LEA	SI,DBUFFER
	LEA	DI,CLOCK_1
	MOV	CH,0
	MOV	CL,COUNT
BLP:	MOV	BL,[SI]
	CMP	BL,[DI]
	JNZ	B1
	INC	DI
	INC	SI
	LOOP	BLP
	CALL	SOUND
B1:    MOV BP,OFFSET DBUFFER
       MOV DX,0C0DH
       MOV CL,COUNT
       MOV BX,004EH
       MOV AX,1301H
       INT 10H
	MOV AH,02H
       MOV DX,0300H
       MOV BH,0
       INT 10H
       MOV AH,01H
       INT 16H
       JE  DISPLAY1
	CMP AL,'A'
	JNZ C2
	CALL CHANGE1 
	RET
C2:    CMP AL,'M'
	JNZ C3
	RET
C3:	JMP START
       MOV AX,4C00H
       INT 21H
       RET
TIME  ENDP

CLOCK	PROC
DISPLAY2:LEA BP,CLOCK_1	
       MOV DX,0C0DH			;输出当前设置的闹铃时间
       MOV CL,COUNT
       MOV BX,004EH
       MOV AX,1301H
       INT 10H
	MOV AH,02H			;设置光标
       MOV DX,0300H
       MOV BH,0
       INT 10H
       	MOV AH,01H			;读取缓冲区,查看是否 有按键
       	INT 16H
       	JE  DISPLAY2
	CMP AL,'A'
	JNZ C6
	CALL CHANGE2 			;调用改变时间宏(不设定系统时间)
	RET
C6:    	CMP AL,'M'
	JNZ C5
	RET
C5:	JMP START
       MOV AX,4C00H
       INT 21H
       RET
clock endp
;---------------------

BCDASC PROC NEAR                ;时间数值转换成ASCII码字符子程序
       PUSH BX
       CBW
       MOV BL,10
       DIV BL
       ADD AL,'0'
       MOV DBUFFER[SI],AL
       INC SI
       ADD AH,'0'
       MOV DBUFFER[SI],AH
       INC SI
       POP BX
       RET
BCDASC ENDP

BCDASC1 PROC NEAR              ;日期数值转换成ASCII码字符子程序
       PUSH BX
       CBW
       MOV BL,10
       DIV BL
       ADD AL,30H
       MOV DBUFFER1[SI],AL
       INC SI
       ADD AH,30H
       MOV DBUFFER1[SI],AH
       INC SI
       POP BX
       RET
BCDASC1 ENDP
;-------------------------------

CHANGE	PROC	
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	LEA	SI,DBUFFER1
BB2:	MOV DX,0C0DH			;设置光标
BB3:	MOV AH,2
        INT 10H
	MOV	AH,8
	INT 21H			
	CMP	AL,'I'
	JNZ	BB4
	MOV	BL,[SI]
	CMP	DL,12H
	JNZ	B_4
	CMP	BL,30H
	JNA	B_4
	MOV	BL,2FH
	JMP	BB5
B_4:	CMP	DL,15H	
	JNZ	B_7
	CMP	BL,32H
	JNA	B_7
	MOV	BL,2FH
B_7:	CMP 	BL,2FH	;<-	让输入的数在0~9之间
	JNB	B_5
	MOV	BL,2FH
B_5:	CMP	BL,39H
	JB	BB5
	MOV 	BL,2FH	;->	
BB5:	INC	BL
	MOV	[SI],BL
	PRINT [SI]
	JMP	BB3
BB4:	CMP	AL,'Q'
	JNZ	BB1
exit_1:	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET
BB1:	CMP	AL,'A'
	JNZ	B_6
	INC	SI
	MOV	AH,3
	INT 10H
	INC	DL
B_1:	CMP	DL,11H		;年与月之间的空格
	JNZ	B_2
	INC	DL
	INC	SI
	JMP	BB3
B_2:	CMP	DL,14H		;月与日之间的空格
	JNZ	B_3
	INC	DL
	INC	SI		
	JMP	BB3
B_3:	CMP	DL,16H
	JA	BB2
	JMP  BB3
B_6:	CMP	AL,0DH
	JNZ	BB2
	MOV	DX,TEMP	
	MOV BX,004EH
	MOV	AH,2
	INT 10H
	CALL	compute_1
	JMP exit_1	
CHANGE	ENDP

COMPUTE_1 PROC	
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
LEA	SI,DBUFFER1
	MOV	BX,000AH
	MOV	DX,0
	MOV	AH,0
	MOV	CX,3
	MOV	AL,[SI]
	SUB	AL,30H
LP1:	MUL	BX
	INC	SI
	MOV	DL,[SI]
	SUB	DL,30H
	ADD 	AX,DX
	LOOP	LP1	
LP_1:	MOV	WORD PTR YEAR,AX
	INC	SI
	INC	SI
	MOV	CX,1
	MOV	AX,0
	MOV	AL,[SI]
	SUB	AL,30H
LP2:	MUL	BX
	INC	SI
	MOV	DL,[SI]
	SUB	DL,30H
	ADD 	AX,DX
	LOOP	LP2
LP_2:	MOV	MONTH,AL
	INC	SI
	INC	SI
	MOV	CX,1
	MOV	AX,0
	MOV	AL,[SI]
	SUB	AL,30H
LP3:	MUL	BX
	INC	SI
	MOV	DL,[SI]
	SUB	DL,30H
	ADD 	AX,DX
	LOOP	LP3
LP_3:	MOV	DAY,AL
	MOV	CX,YEAR
	MOV	DH,MONTH
	MOV	DL,DAY
	MOV	AH,2BH
	INT 21H
	CMP	AL,0FFH
	JNZ	S_1
	PRINT1 ERORRMES_1
	JMP	RET_1
S_1:	CMP	AL,0
	JNZ	RET_1
	PRINT1	RMES_1
RET_1:	MOV	AH,1
	INT 21H	
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET		
COMPUTE_1 ENDP
;----------------------------------------

CHANGE1	PROC
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	LEA	SI,DBUFFER
CB2:	MOV DX,0C0DH			;设置光标
CB3:	MOV AH,2
        INT 10H
	MOV	AH,8
	INT 21H			
	CMP	AL,'I'
	JNZ	CB4
	MOV	BL,[SI]
	CMP	DL,0DH	;->	小时的十位设置
	JNZ	C_4
	CMP	BL,31H
	JNA	C_4
	MOV	BL,2FH
	JMP	CB5
C_4:	CMP	DL,10H		
	JNZ	C_7
	CMP	BL,34H
	JNA	C_7
	MOV	BL,2FH
C_7:	CMP	DL,13H
	JNZ	C_8
	CMP	BL,34H
	JNA	C_8
	MOV	BL,2FH
C_8:	CMP 	BL,2FH	;<-     输入的数在0~9之间
	JNB	C_5
	MOV	BL,2FH
C_5:	CMP	BL,39H
	JB	CB5
	MOV 	BL,2FH	;->
CB5:	INC	BL
	MOV	[SI],BL
	PRINT [SI]
	JMP	CB3
CB4:	CMP	AL,'Q'
	JNZ	CB1
exit_2:	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET
CB6:	JMP	CB2
CB7:	JMP	CB3
CB1:	CMP	AL,'A'
	JNZ	C_6
	INC	SI
	MOV	AH,3
	INT 10H
	INC	DL
C_1:	CMP	DL,0FH		;时与分之间的冒号
	JNZ	C_2
	INC	DL
	INC	SI
	JMP	CB7
C_2:	CMP	DL,12H		;分与秒之间的冒号
	JNZ	C_3
	INC	DL
	INC	SI		
	JMP	CB7
C_3:	CMP	DL,14H
	JA	CB6
	JMP  CB7
C_6:	CMP	AL,0DH
	JNZ	CB6
	MOV	DX,TEMP	
	MOV BX,004EH
	MOV	AH,2
	INT 10H
	CALL	compute_2
	JMP exit_2	
CHANGE1	ENDP

COMPUTE_2 PROC	
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	LEA	SI,DBUFFER-1
	MOV	BX,000AH
	MOV	DX,0
	MOV	AH,0
	MOV	CX,1
	MOV	AL,[SI]
	SUB	AL,30H
CP1:	MUL	BX
	INC	SI
	MOV	DL,[SI]
	SUB	DL,30H
	ADD 	AX,DX
	LOOP	CP1	
CP_1:	MOV	WORD PTR HOUR,AX
	INC	SI
	INC	SI
	MOV	CX,1
	MOV	AX,0
	MOV	AL,[SI]
	SUB	AL,30H
CP2:	MUL	BX
	INC	SI
	MOV	DL,[SI]
	SUB	DL,30H
	ADD 	AX,DX
	LOOP	CP2
CP_2:	MOV	MINUTE,AL
	INC	SI
	INC	SI
	MOV	CX,1
	MOV	AX,0
	MOV	AL,[SI]
	SUB	AL,30H
CP3:	MUL	BX
	INC	SI
	MOV	DL,[SI]
	SUB	DL,30H
	ADD 	AX,DX
	LOOP	CP3
CP_3:	MOV	SECD,AL
	MOV	CH,HOUR
	MOV	CL,MINUTE
	MOV	DH,SECD
	;MOV	DL,0
	MOV	AH,2DH
	INT 21H
	CMP	AL,0FFH
	JNZ	V_1
	PRINT1 ERORRMES_1
	JMP	RET_2
V_1:	CMP	AL,0
	JNZ	RET_2
	PRINT1	RMES_1
RET_2:	MOV	AH,1
	INT 21H	
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET		
COMPUTE_2 ENDP

CHANGE2	PROC
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	LEA	SI,CLOCK_1
DB2:	MOV DX,0C0DH			;设置光标
DB3:	MOV AH,2
        INT 10H
	MOV	AH,8
	INT 21H			
	CMP	AL,'I'
	JNZ	DB4
	MOV	BL,[SI]
	CMP	DL,0DH	;->	小时的十位设置
	JNZ	D_4
	CMP	BL,31H
	JNA	D_4
	MOV	BL,2FH
	JMP	DB5
D_4:	CMP	DL,10H		
	JNZ	D_7
	CMP	BL,34H
	JNA	D_7
	MOV	BL,2FH
D_7:	CMP	DL,13H
	JNZ	D_8
	CMP	BL,34H
	JNA	D_8
	MOV	BL,2FH
D_8:	CMP 	BL,2FH	;<-     输入的数在0~9之间
	JNB	D_5
	MOV	BL,2FH
D_5:	CMP	BL,39H
	JB	DB5
	MOV 	BL,2FH	;->
DB5:	INC	BL
	MOV	[SI],BL
	PRINT [SI]
	JMP	DB3
DB4:	CMP	AL,'Q'
	JNZ	DB1
exit_3:	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET
DB6:	JMP	DB2
DB7:	JMP	DB3
DB1:	CMP	AL,'A'
	JNZ	D_6
	INC	SI
	MOV	AH,3
	INT 10H
	INC	DL
D_1:	CMP	DL,0FH		;时与分之间的冒号
	JNZ	D_2
	INC	DL
	INC	SI
	JMP	DB7
D_2:	CMP	DL,12H		;分与秒之间的冒号
	JNZ	D_3
	INC	DL
	INC	SI		
	JMP	DB7
D_3:	CMP	DL,14H
	JA	DB6
	JMP  DB7
D_6:	CMP	AL,0DH
	JNZ	DB6
	MOV	DX,TEMP	
	MOV BX,004EH
	MOV	AH,2
	INT 10H
	JMP exit_3	
CHANGE2	ENDP
SOUND PROC	NEAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	IN 	AL,61H		;读取扬声器状态	,防止输入的第一个音符不发声,所以先开扬声器再置初值
	MOV	AH,AL		;保存扬声器状态
     	OR	AL,3		;打开扬声器
	OUT	61H,AL
	PUSH	AX	
	MOV 	AL,0B7H 		; 设置8253控制字(通道2#)10110111
	OUT 	43H,AL
	MOV	AX,4553
	OUT	42H,AL
	MOV	AL,AH
	OUT 	42H,AL
	MOV	DX,200
WAIT1: 	MOV 	CX,8FF0H
BL1:     LOOP BL1
	DEC DX
	JNZ WAIT1
	POP	AX
	MOV	AH,AL
	OUT 61H,AL
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET
SOUND	ENDP


CODE   ENDS
	END	START


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -