📄 codemusic.asm
字号:
;*************
; 口 令 *
;*************
;宏定义
;>>>>>>>>>>>>清屏>>>>>>>>>>>>>>>>>
clear macro al1,ch1,cl1,dh1,dl1,bh1
push ax
push bx
push cx
push dx
mov ah,6
mov al,al1
mov ch,ch1
mov cl,cl1
mov dh,dh1
mov dl,dl1
mov bh,bh1
int 10h
pop dx
pop cx
pop bx
pop ax
endm
;>>>>>>>>>>>>>光标定位>>>>>>>>>>>>>>>>>>>>>>>>
SetGb macro dh1,dl1
push ax
push bx
push dx
mov dh,dh1
mov dl,dl1
mov bh,0
mov ah,02h
int 10h
push ax
push bx
push dx
endm
;>>>>>>>>>>>>>>>>>>提示信息>>>>>>>>>>>>>>>>>>>>>>>
Show_mess macro mess
push ax
push dx
mov ah,09
lea dx,mess
int 21h
pop dx
pop ax
endm
;>>>>>>>>>>>>输出>>>>>>>>>>>>>>>>>>>>>>>>>>
OutPut macro dl1
push ax
push dx
mov ah,02h
mov dl,dl1
int 21h
pop dx
pop ax
endm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
change macro c1,c2,c3
mov al,c1
cbw
div bh
add al,'0'
mov DisTime[c2],al
add ah,'0'
mov DisTime[c3],ah
endm
;数据区
data segment
DisTime db 00,00,':',00,00,':',00,00,'$' ;显示时间
Count db 1 ;统计输入密码的次数
CodeNum1 db 1,2,3,4,5,6 ;保存产生的六位密码
CodeNum2 db 0,0,0,0,0,0 ;保存用户输入密码
right db 0 ;标号 判断两次密码是否一样
;0为一样 1为不一样
mess1 db 'The current time is : $'
mess2 db 'The code number is : $'
mess3 db 'Please input the code number : $'
mess4 db 'The code you have input is wrong ! $'
mess5 db 'You have three times $'
mess6 db 'Locking !!! $'
mess7 db 'Do you want to leave(y or n)? $'
mess8 db 'Music Go! $'
mess9 db 'First Song Input 1 $'
mess10 db 'Second Song Input 2 $'
mess11 db 'Third Song Input 3 $'
mess12 db 'Press any key to begin... $'
mess0 db 'Code And Music $' ;放在最前面有问题,放着就没有了
;自动演奏的歌曲频率和延时
MUS_FREQ1 DW 440,392,330,392,523,440,392,440
DW 330,392,440,392,330,262,220,392
DW 330,2 DUP(294),330,2 DUP(392),440,330
DW 294,262,392,330,294,262,220,262,196
DW -1
MUS_TIME1 DW 37,12,3 DUP(25),2 DUP(12),50
DW 25,2 DUP(12 ),2 DUP(25),4 DUP(12 ),50
DW 37 ,12 ,25,2 DUP(12 ),2 DUP(25),50
DW 37 ,5 DUP(12 ),100
MUS_FREQ2 DW 392,523,392,330,2 DUP(262,330,392),2 DUP(523)
DW 349,3 DUP(440),330,3 DUP(392),294,349,330,294,262
DW 392,523,392,330,2 DUP(262,330,392),2 DUP(523)
DW 349,3 DUP(440),330,3 DUP(392),294,349,330,294,262
DW 392,3 DUP(523),494,587,392,392,3 DUP(587),523,659,392
DW 3 DUP(523),330,3 DUP(392),294,349,330,294,262
DW -1
MUS_TIME2 DW 12 ,3 DUP(25,2 DUP(12 )),2 DUP(25)
DW 2 DUP(19,6,2 DUP(12 )),4 DUP(12 )
DW 25,12 ,3 DUP(25,2 DUP(12 )),2 DUP(25)
DW 2 DUP(19,6,2 DUP(12 )),5 DUP(12 )
DW 2 DUP(19,6,4 DUP(12 ),25)
DW 25,2 DUP(12 ),19,6,6 DUP(12 ),25
MUS_FREQ3 DW 262,262,294,330,330,349,392,440,392,330
DW 392,349,330,294,349,330,294,262
DW 262,262,294,330,330,349,392,440,392,330
DW 392,349,330,294,330,294,262,196
DW 392,349,330,294,196,196,349,330,294,262
DW 392,349,330,294,196,196,349,330,294,262
DW 262,262,294,330,330,349,392,440,392,330
DW 392,349,330,294,330,294,262
DW -1
MUS_TIME3 DW 3 DUP(25,2 DUP(12)),50
DW 2 DUP(25,2 DUP(12),50)
DW 3 DUP(25,2 DUP(12)),50
DW 2 DUP(25,2 DUP(12)),2 DUP (50)
DW 3 DUP(25,2 DUP(12)),50
DW 3 DUP(25,2 DUP(12)),50
DW 3 DUP(25,2 DUP(12)),50
DW 2 DUP(25,2 DUP(12)),50
data ends
;代码段
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
;清全屏
clear 0,0,0,24,79,7
;标题
clear 0,2,25,3,50,04h
SetGb 3,30
Show_mess mess0
;操作区
clear 0,5,15,20,60,68h
clear 0,6,16,19,59,74h
;显示时间
SetGb 8,22
clear 0,7,22,10,50,7ah
Show_mess mess1
SetGb 10,30
call ShowTime
;显示密码
SetGb 12,22
clear 0,11,22,14,50,72h
Show_mess mess2
call SetCode
SetGb 14,30
lea di,CodeNum1
mov cx,6
kk:
mov ah,02h
mov dl,[di]
add dl,30h
int 21h
inc di
loop kk
;jmp music
;输入密码
SetGb 15,22
Show_mess mess3
again:
cmp count,3
ja stop
SetGb 17,30
clear 0,16,30,17,50,70h
call InCode
call CodeCmp ;判断
cmp right,1 ;输入密码错误
je try
jmp music1 ;输入密码正确,开始听歌
stop:
clear 0,16,30,17,40,74h ;清除错误数据
SetGb 17,28
Show_mess mess6 ;提示信息
mov dx,40000 ;延时
d11:
mov cx,20000
d22:
loop d22
dec dx
jnz d11
clear 0,16,25,17,50,74h ;清除提示信息
mov count,1 ;统计输入次数,最多三次
jmp leave
try:
mov right,0 ;默认输入的密码正确
inc count ;统计输入次数,最多三次
clear 0,16,30,17,55,74h ;清除错误数据
SetGb 17,22
Show_mess mess4 ;提示信息
SetGb 18,22
Show_mess mess5
mov dx,40000 ;延时
d211:
mov cx,20000
d222:
loop d222
dec dx
jnz d211
clear 0,16,22,18,59,74h ;清除提示信息,重新开始输入密码
jmp again
leave: ;询问是要离开还是重新开始
clear 0,6,16,19,59,74h
SetGb 10,23
clear 0,9,23,10,59,72h
Show_mess mess7
Get1:
SetGb 12,36
mov ah,01h
int 21h
cmp al,'Y'
je outgo
cmp al,'y'
je outgo
cmp al,'N'
je start3
cmp al,'n'
je start3
mov dx,30000 ;延时
d311:
mov cx,20000
d322:
loop d322
dec dx
jnz d311
jmp Get1
start3:
jmp start
outgo:
jmp exit
music1:
clear 0,6,16,19,59,76h
SetGb 10,30
clear 0,9,30,10,59,74h
Show_mess mess8
GetL:
SetGb 14,25 ;效果
clear 0,7,30,8,59,74h
Show_mess mess12
mov dx,40000 ;延时
d411:
mov cx,20000
d422:
loop d422
dec dx
jnz d411
mov ah,0bh
int 21h
inc al
clear 0,7,30,8,59,7ch
jne GetL
music2:
clear 0,6,16,19,59,74h
SetGb 8,30
clear 0,7,30,8,59,72h
Show_mess mess8 ;开始音乐
SetGb 12,24 ; first song
clear 0,11,24,12,59,76h
Show_mess mess9
SetGb 14,24 ;second song
clear 0,13,24,14,59,79h
Show_mess mess10
SetGb 16,24 ;third song
clear 0,15,24,16,59,74h
Show_mess mess11
Get2:
SetGb 14,50
mov ah,01h
int 21h
cmp al,1bh
je leave3
cmp al,31h
jb Get2
cmp al,33h
ja Get2
cmp al,31h
je first
cmp al,32h
je second
jmp third
first:
lea si,MUS_FREQ1
lea bp,MUS_TIME1
freq1:
mov di,[si]
cmp di,-1
je leave3
mov bx,ds:[bp]
call playmusic
add si,2
add bp,2
mov ah,0bh
int 21h
inc al
jnz freq1
second:
lea si,MUS_FREQ2
lea bp,MUS_TIME2
freq2:
mov di,[si]
cmp di,-1
je leave3
mov bx,ds:[bp]
call playmusic
add si,2
add bp,2
mov ah,0bh
int 21h
inc al
jnz freq2
third:
lea si,MUS_FREQ3
lea bp,MUS_TIME3
freq3:
mov di,[si]
cmp di,-1
je leave3
mov bx,ds:[bp]
call playmusic
add si,2
add bp,2
mov ah,0bh
int 21h
inc al
jnz freq3
leave3:
jmp leave
exit:
mov ah,4ch
int 21h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;显示当前时间
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ShowTime proc
push ax
push bx
push cx
push dx
mov ah,2ch
int 21h
mov bh,10
change ch,0,1
change cl,3,4
change dh,6,7
mov ah,09h
lea dx,DisTime
int 21h
pop dx
pop cx
pop bx
pop ax
ret
ShowTime endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;设置密码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SetCode proc ;产生密码
mov ah,2ch
int 21h
mov bh,10
mov al,dh
cbw
div bh
add al,30h
mov CodeNum1[0],al
add ah,30h
mov CodeNum1[1],ah
mov bh,10
mov al,cl
cbw
div bh
add al,30h
mov CodeNum1[1],al
add ah,30h
mov CodeNum1[2],ah
mov bh,10
mov al,dh
cbw
div bh
add al,30h
mov CodeNum1[3],al
add ah,30h
mov CodeNum1[4],ah
ret
SetCode endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;显示当前时间
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
InCode proc ;从键盘输入密码
lea di,CodeNum2
mov cx,6
Get3:
mov ah,08h
int 21h
OutPut '*' ;输入星号
cmp al,0dh
je qq
mov [di],al
inc di
loop Get3
qq:
ret
InCode endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;密码比较函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CodeCmp proc
lea si,CodeNum1
lea di,CodeNum2
mov cx,6
Get4:
mov al,[si]
add al,30h
cmp al,[di]
jne gg
inc si
inc di
loop Get4
jmp hh
gg:
mov right,1
hh:
ret
CodeCmp endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;音乐函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
playmusic proc
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H
OUT 43H,AL
MOV DX,12H
MOV AX,348CH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,03h
OUT 61H,AL
WAIT1:
CALL WAITF
DEC BX
JNZ WAIT1 ;判断是否播放完毕
MOV AL,AH ;完毕则关闭扬声器
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
ret
playmusic endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;音乐延时函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WAITF PROC NEAR
;延时程序
PUSH AX
MOV CX,18663
WAITF1:
IN AL,61H
AND AL,10H ;检查PB4口
CMP AL,AH ;判断AL变化否
JE WAITF1 ;等待AL变化
MOV AH,AL ;保存PB4的新状态(AL中)
LOOP WAITF1
POP AX
RET
WAITF ENDP
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -