实现结果
程序的启动有点像小霸王游戏机的游戏,喜欢汇编的朋友可以发信与我一起讨论,发声程序参考的是一本汇编教材,程序写作和上传相隔有点久远,记不太清,千行代码,算是学生时代一个比较得意的课设
编译器下载
编译器可在我的上传资源中查找,已注明:汇编编译器
https://download.csdn.net/download/m0_37772174/10837741
注意事项
输入严格区分大小写,启动时应输入大写来C启动复杂版钢琴
汇编代码
;作者:cclplus
;仅供学习交流使用
DATA SEGMENT
MEM1 DW 200 DUP(0)
MEM2 DW 200 DUP(0);用于记录输入
Gao1 DB 0AH, 0DH, 'Hello User.THIS IS GMusic!'
DB 0AH, 0DH, 'Enjoy music!$'
Gao2 DB 0AH, 0DH, 'INPUT ERROR!$'
Gao3 DB 0AH, 0DH, 'PLEASE INPUT AGAIN!$'
Cue_list DB 0AH, 0DH, '*****************************'
DB 0AH, 0DH, 'PressB Begin your music lite'
DB 0AH,0DH,'PressC Begin your music Gao'
DB 0AH, 0DH, 'PressP Play back'
DB 0AH, 0DH, '*****************************'
DB 0AH, 0DH, '$'
soundcolor dw 0 ;音色缓存,用于改变播放或弹奏时琴上音响和琴面上点阵的颜色
key_tune dw 0 ;按键状态缓存,用于判断是否有手动按键,1为有,0为无
keynum dw 1 ;按键编号缓存,用于提取对应的按键位置
delay_time dw 7000 ;延时缓存,用于播放时存入bx中来计数
count dw 0;
;------------------------------进度条字符-----------------------
st_load db 10 ;起始行
db 4 ;起始列
db 0bh ;字体颜色
db 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII'
db 00
;------------------------------字符定义-----------------------
start_col db ? ;存储起始行
text db 14 ;起始行
db 2 ;起始列
db 0fh ;字体颜色
db 'MUSIC ^_^',0ffh,0ffh ;显示字
db ' HAVE A GOOD TIME!',0ffh ;以0ffh来判断是否换行
db ' [-1-2-3-4-5-6-7-8-]',0ffh
db 'Press p: replay',0ffh
db 'Press Esc: exit',0ffh
db 00
d_text db 14 ;起始行
db 2 ;起始列
db 0fh ;字体颜色
db 'MUSIC ^_^',0ffh,0ffh ;显示字
db ' HAVE A GOOD TIME!',0ffh ;以0ffh来判断是否换行
db ' [-1-2-3-4-5-6-7-]',0ffh
db 'g [ q w e r t y u ] p:replay ',0ffh
db 'z [ a s d f g h j ] enter: stop',0ffh
db 'd [ z x c v b n m ] Esc: exit',0ffh
db 00
;------------------------------高级版白色琴键坐标-------------------
d_st_lx dw 50,61,72,83,94,105,116 ;起点横坐标
dw 127,138,149,160,171,182,193
dw 204,215,226,237,248,259,270
d_st_y dw 50 ;起点纵坐标
d_ed_lx dw 60,71,82,93,104,115,126 ;终点横坐标
dw 137,148,159,170,181,192,203
dw 214,225,236,247,258,269,280
d_ed_y dw 90 ;终点纵坐标
;------------------------------高级版黑色琴键坐标--------------------------
d_bt_x dw 57,68,90,101,112 ;起点横坐标
dw 134,145,167,178,189
dw 211,222,244,254,265
d_bt_y dw 50 ;起点纵坐标
d_bd_x dw 64,75,97,108,119 ;终点横坐标
dw 141,152,174,185,196
dw 218,229,251,262,273
d_bd_y dw 70
;----------------------------简版乐器白色琴键坐标-------------------
st_lx dw 50,80,110,140,170,200,230,260 ;起点横坐标
st_y dw 50 ;起点纵坐标
ed_lx dw 70,100,130,160,190,220,250,280 ;终点横坐标
ed_y dw 90 ;终点纵坐标
;----------------------------简版乐器黑色琴键坐标--------------------------
bt_x dw 71,101,131,161,191,221,251 ;起点横坐标
bt_y dw 50 ;起点纵坐标
bd_x dw 79,109,139,169,199,229 ,259 ;终点横坐标
bd_y dw 70 ;终点纵坐标
;频率列表
;---------------------------高级版音乐频率值----------------------------
d_tune dw 220,247,278,294,330,371,416 ;低音
dw 441,495,556,589,661,742,833 ;中音
dw 882,990,1112,1178,1322,1484,1655 ;高音
;---------简版
TUNE DW 262, 294, 330, 347, 392, 440, 494, 523
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
STA DB 300 DUP('STACK')
STACK ENDS
CODE SEGMENT
ASSUME DS: DATA, SS: STACK, CS: CODE, ES: DATA
START: MOV DI ,0H
MOV AX, DATA
MOV DS, AX
MOV ES, AX
MOV AX, STACK
MOV SS, AX
SHOW MACRO B
MOV DX, OFFSET B
MOV AH, 09H
INT 21H;显示字符串
ENDM
SHOW Gao1 ;显示Gao1中的内容
LOP: SHOW Cue_list;显示操作提示清单
MOV AH, 01H
INT 21H;从键盘上输入一个字符,将其对应字符的ASCII码送入AL中
;并在屏幕上显示该字符
CMP AL, 42H ;判断键盘上的值是否为B(区分大小写)
JNZ sc;如果键盘上的内容不是B,检查是否是C
JMP LITE_v;如果输入了B,那么我们进入简版的音乐演奏器
SC: cmp al,43h;判断键盘上的值是否是C,如果是C,进入高级音乐演奏器
JNE LEXIT;
;高级音乐演奏器启动
GAO_V:
;---依次调用:开场效果--初始化--键盘扫描--按键处理程序-------------
call show_load