汇编语言编写电子琴的程序.doc_第1页
汇编语言编写电子琴的程序.doc_第2页
汇编语言编写电子琴的程序.doc_第3页
汇编语言编写电子琴的程序.doc_第4页
汇编语言编写电子琴的程序.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

; Win32 Consol .exeinclude io32.inc.data ;add your data hereDRAW MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL DRAW_NEXT;local :避免宏重复调用时,标号的重复;功能:画填充的矩形;使用条件:START_X END_X ,START_Y END_Y PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,0CH ;写像素点 MOV AL,COLOR ;设置颜色 MOV BH,0 ;选用页号0 MOV CX,START_X ;列起始点 MOV DX,START_Y ;行起始点DRAW_NEXT: INT 10H ;画点 INC CX ;画横线 CMP CX,END_X ;比较行是否画完 JNE DRAW_NEXT ;画另一行 MOV CX, START_X ;另一行的起始点 INC DX CMP DX,END_Y ;比较列是否画完 JNE DRAW_NEXT ;未完继续画 POP DX POP CX POP BX POP AX ENDMDRAWSQRE MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL ROW_UP,ROW_DOWN,RANK_LEFT,RANK_RIGHT;功能:画不填充的矩形 PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV AH,0CH MOV AL,COLOR MOV BH,0 MOV CX,START_X MOV DX,START_YROW_UP: ;画上边 INT 10H INC CX CMP CX,END_X JNE ROW_UP RANK_RIGHT: ;画右边 INT 10H INC DX CMP DX,END_Y JNE RANK_RIGHT MOV CX, START_X ;下边起始点 MOV SI,END_X INC SIROW_DOWN: ;画下边 INT 10H INC CX CMP CX,SI JNE ROW_DOWN MOV DX,START_Y ;右边起始点 MOV CX,START_XRANK_LEFT: ;画右边 INT 10H INC DX CMP DX, END_Y JNE RANK_LEFT POP SI POP DX POP CX POP BX POP AX ENDM ;数据段DATA SEGMENT ;定义在屏幕绘制字 START_COL DB ? ;存储起始行 TEXT DB 16 ;起始行 DB 2 ;起始列 DB 06H ;字体颜色 DB Piano XP,0FFH,Copyright(c)Auto-5-5th,0FFH,0FFH ;显示字 DB 10 DUP(2 DUP(0DBH),2 DUP(20H),0FFH ;颜色交叉矩形 DB 10 DUP(2 DUP(20H),2 DUP(0DBH),0FFH DB 10 DUP(2 DUP(0DBH),2 DUP(20H),0FFH DB 10 DUP(2 DUP(20H),2 DUP(0DBH),0FFH DB 10 DUP(2 DUP(0DBH),2 DUP(20H),0FFH DB 10 DUP(2 DUP(20H),2 DUP(0DBH),0FFH DB 00 ;白色琴键坐标 ST_LX DW 50,61,72,83,94,105,116 ST_MX DW 127,138,149,160,171,182,193 ST_HX DW 204,215,226,237,248,259,270 ST_Y DW 50 ED_LX DW 60,71,82,93,104,115,126 ED_MX DW 137,148,159,170,181,192,203 ED_HX DW 214,225,236,247,258,269,280 ED_Y DW 90 ;黑色琴键坐标 BT_X DW 57,68,90,101,112 DW 134,145,167,178,189 DW 211,222,244,254,265 BT_Y DW 50 BD_X DW 64,75,97,108,119 DW 141,152,174,185,196 DW 218,229,251,262,273 BD_Y DW 70;音乐频率值 LOWD DW 131 LOWDD DW 147,165,175,196,220,247 MID DW 262 MIDD DW 294,330,349,392,440,494 HGH DW 523 HGHD DW 587,659,797,783,879,987,1046 KEYFLAG DB 1 ;标记低(0)、中(1)、高(2)音键 KEYNUM DW 1 ;存储17 DELAY_TIME DW 7000 ;延时 SONG DW 100 ;保存所选的自动演奏的曲目 TUNE DW 1 ;标记c调或d调 AUDIO DW 1 ;标记低(1)、中(2)、高音(3);自动演奏的歌曲频率和延时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 -1MUS_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 ),100MUS_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 -1MUS_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 ),25MUS_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 -1MUS_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),50MUS_FREQ4 DW 262,262,294,330,330,294,262,262,220,196 DW 262,294,330,294,262,294 DW 262,294,330,330,294,294,262,220,220,294,262,262,220,196 DW 196,220,220,262,262,294,294,262,220 DW 294,330,294,262,262,294,262,220,196,220 DW 196,220,262,294,330,392,294,330,262,294,262,220 DW 220,294,247,220,196,196 DW 4 DUP(392),330,392,440,440,392,330 DW 5 DUP(440),392,392,330,294 DW 440,392,440,392,330,294,330,294,262,220 DW 4 DUP(294),262,220,196 DW 2 DUP(440,392),2 DUP(330,294),262,220 DW 3 DUP(294),262,220,392 DW -1MUS_TIME4 DW 3 DUP(20,10,10),50 DW 20,10,20,10,10,80 DW 20,10,20,10,10,3 DUP(20,10),20,20,80 DW 20,10,10,20,20,20,10,10,40 DW 20,10,20,20,10,5,5,10,10,40 DW 20,10,2 DUP(20,10,10),10,5,5,20 DW 20,20,20,10,10,80 DW 10,20,10,20,10,10,40,10,10,20 DW 8 DUP(10),80 DW 20,10,10,20,20,4 DUP(10),40 DW 15,5,10,10,20,20,80 DW 20,10,10,20,20,4 DUP(10),40 DW 40,20,20,40,40,100 MUS_FREQ5 DW 330,392,440,330,392,294 DW 330,392,440,523,440,392,220,262,330,294 DW 294,330,392,294,330,294,220,220 DW 220,262,294,330,294,247,220,262,196 DW 294,330,294,247,220,196,262 DW 523,523,440,523,440,523,440,392 DW 392,330,440,392,262,294,262,292,330 DW 330,330,294,330 DW 523,523,494,440 DW 330,330,294,330,523,494,440,330,392 DW -1MUS_TIME5 DW 2 DUP(12,12,75),3 DUP(12),25,12,25,6,6,12,75 ;#1,2 DW 12,12,75,4 DUP(12),75,12,12,37,5 DUP(12),75 DW 37,12,12,12,12,12,50 DW 12,12,12,50,12,12,12,75 DW 12,12,37,12,25,6,6,12,50,12,12,12,50,12,12,12,75 DW 12,12,37,12,12,12,12,12,75DATA ENDS ;代码段CODE SEGMENT ASSUME DS:DATA,CS:CODEMAIN PROC FAR;主程序START: CALL INIT ;调用初始化程序NEW_SCAN: CALL SCAN_KEY ;扫描所按下的键 CMP SONG,100 ;判断是否按下了自动播放的歌曲键 JE HAND_PLAY ;若不是,继续判断 CALL PLAY_SONG ;若是,演奏音乐 JMP NEW_SCAN ;演奏结束,重新扫描有无键按下HAND_PLAY: CMP KEYNUM,100 ;判断是否手动演奏 JZ NEW_SCAN ;若不是,重新扫描有无键按下 ;若是,进行按键处理 PUSH BX MOV BX,KEYNUM CALL KEY_DOWN ;在屏幕上显示按下状态 POP BX CALL LOAD_AUDIO ;判断高低音、C/D调,并装入对应频率段地址到BX中 PUSH SI MOV SI,KEYNUM MOV DI,BX+SI CALL GEN_HAND ;发声 POP SI PUSH BX MOV BX,KEYNUM ;在屏幕上显示弹起状态 CALL KEY_UP POP BX JMP NEW_SCAN ;重新扫描有无键按下,直到按下ESC键MAIN ENDP GEN_HAND PROC NEAR;手动演奏发声程序;IN:DI 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 ;定时器送处值 IN AL,61H ;开扬声器 MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,ALWAIT1: CALL WAITF ;调用延时程序 IN AL,60H TEST AL,80H ;查询键是否放开 JZ WAIT1 ;未放开继续查询 MOV AL,AH ;放开则关扬声器 OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RETGEN_HAND ENDP GEN_AUTO PROC NEAR;自动播放发声程序 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 IN AL,61H MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,ALWAIT2: CALL WAITF DEC BX JNZ WAIT2 ;判断是否播放完毕 MOV AL,AH ;完毕则关闭扬声器 OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RETGEN_AUTO ENDP WAITF PROC NEAR;延时程序 PUSH AXMOV CX,DELAY_TIMEWAITF1: IN AL,61H AND AL,10H ;检查PB4口 CMP AL,AH ;判断AL变化否 JE WAITF1 ;等待AL变化 MOV AH,AL ;保存PB4的新状态(AL中) LOOP WAITF1 POP AX RETWAITF ENDP PIANO_DRAW PROC NEAR;绘制琴键 LEA SI,ST_LX ;载入白色起始点地址 LEA DI,ED_LX ;载入白色结束点地址 MOV CX,21 ;白键数目NEXT_DRAW: DRAW SI,ST_Y,DI,ED_Y,0FH ;调用宏定义画白键 DRAW SI,90,DI,93,07H ;阴影 ADD SI,2 ;下一个键 ADD DI,2 LOOP NEXT_DRAW LEA SI,BT_X ;载入黑色起始点地址 LEA DI,BD_X ;载入黑色结束点地址 MOV CX,15 ;黑键数目NEXT_BLOCK: DRAW SI,BT_Y,DI,BD_Y,00H ADD SI,2 ADD DI,2 LOOP NEXT_BLOCK RETPIANO_DRAW ENDP KEY_DOWN PROC NEAR;键按下时,在屏幕上显示PUSH SI PUSH DI CALL LOAD ;载入所按下键在屏幕上的位置 DRAW SI+BX,90,DI+BX,92,0FH DRAW SI+BX,92,DI+BX,94,07H POP DI POP SI RETKEY_DOWN ENDP KEY_UP PROC NEAR;键弹起时,恢复正常状态 PUSH SI PUSH DI CALL LOAD ;载入所弹起键在屏幕上的位置 DRAW SI+BX,90,DI+BX,93,07H ;恢复阴影 DRAW SI+BX,93,DI+BX,94,05H ;恢复背景色 POP DI POP SI RETKEY_UP ENDP LOAD PROC NEAR;载入键在屏幕上的位置CMP KEYFLAG,00H ;判断是否是低音键 JNZ LOAD_HGH ;继续判断 LEA SI,ST_LX ;载入低音键起始坐标首地址 LEA DI,ED_LX ;载入低音键结束坐标首地址 JMP LOAD_END ;载入结束LOAD_HGH: CMP KEYFLAG,02H ;判断是否是高音键 JNZ LOAD_MID ;继续判断 LEA SI,ST_HX ;载入高音键起始坐标首地址 LEA DI,ED_HX ;载入高音键结束坐标首地址 JMP LOAD_END LOAD_MID: LEA SI,ST_MX ;载入中音键起始坐标首地址 LEA DI,ED_MX ;载入中音键结束坐标首地址LOAD_END: RETLOAD ENDP SCAN_KEY PROC NEAR;检查按键状态,并存入对应的变量和寄存器 MOV SI,100 MOV DI,100 MOV KEYNUM,100 ;赋初值 MOV AH,0 ;读键盘 INT 16H MOV DL,AH CALL SCAN_SONG ;判断是否是自动播放键(大键盘数字键15) CALL SCAN_TUNE ;判断是否是C/D调选择键 CALL FREQ_CHANGE ;判断是否按下频率改变键:(+/- 符号) CMP AH,01H ;是否是结束键 JNE FLAG_SCAN ;若不是继续检测 CALL EXIT ;若是则退出 FLAG_SCAN: MOV AH,02H ;读键盘状态字节 INT 16H MOV DH,AL ;判断是否是右shift键 AND DH,01H CMP DH,01H JE SLOW ;是则进行低音处理 MOV DH,AL ;不是判断是否是左shift键 AND DH,02H CMP DH,02H JE SHGH ;是则进行高音处理 JMP SMID ;都不是进行中音处理 SLOW: ;低音处理 MOV AUDIO,1 MOV KEYFLAG,0 JMP KEY_1 ;跳转到音键处理SHGH: ;高音处理 MOV AUDIO,3 MOV KEYFLAG,2 JMP KEY_1 ;跳转到音键处理SMID : ;中音处理 MOV AUDIO,2 MOV KEYFLAG,1 KEY_1: CMP DL,4FH ;是否是1 JNE KEY_2 ;继续判断 MOV KEYNUM,0 ;不是则保存标志 JMP SCAN_END ;键扫描结束KEY_2: CMP DL,50H ;是否是2 JNE KEY_3 MOV KEYNUM,2 JMP SCAN_ENDKEY_3: CMP DL,51H ;是否是3 JNE KEY_4 MOV KEYNUM,4 JMP SCAN_ENDKEY_4: CMP DL,4BH ;是否是4 JNE KEY_5 MOV KEYNUM,6 JMP SCAN_ENDKEY_5: CMP DL,48H ;是否是5 JNE KEY_6 MOV KEYNUM,8 JMP SCAN_ENDKEY_6: CMP DL,4DH ;是否是6 JNE KEY_7 MOV KEYNUM,10 JMP SCAN_ENDKEY_7: CMP DL,47H ;是否是7 JNE SCAN_END MOV KEYNUM,12SCAN_END: RETSCAN_KEY ENDP SCAN_SONG PROC NEAR;判断是否是自动播放键(键15),并保存标志变量(song);IN: AH 键扫描码 PUSH AX MOV SONG,100 ;赋初始值 CMP AH,3BH ;与1比较 JB SONG_END ;小于1则结束 CMP AH,3FH ;与5比较 JA SONG_END ;大于则结束 SUB AH , 3BH ;转换成15 MOV AL,AH MOV AH,00H MOV SONG,AX ;存入标志码SONG_END: POP AX RETSCAN_SONG ENDP PLAY_SONG PROC NEAR;选择并播放音乐PUSH BP PUSH SI PUSH BX PUSH DI PUSH AX CMP SONG,01H ;判断是否是歌1 JNE GO2 ;不是继续判断 CALL SO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论