匯編語言編寫電子琴的程序.doc_第1頁
匯編語言編寫電子琴的程序.doc_第2頁
匯編語言編寫電子琴的程序.doc_第3頁
匯編語言編寫電子琴的程序.doc_第4頁
匯編語言編寫電子琴的程序.doc_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

; Win32 Consol .exeinclude io32.inc.data ;add your data hereDRAW MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL DRAW_NEXT;local :避免宏重復(fù)調(diào)用時(shí),標(biāo)號(hào)的重復(fù);功能:畫填充的矩形;使用條件:START_X END_X ,START_Y END_Y PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,0CH ;寫像素點(diǎn) MOV AL,COLOR ;設(shè)置顏色 MOV BH,0 ;選用頁號(hào)0 MOV CX,START_X ;列起始點(diǎn) MOV DX,START_Y ;行起始點(diǎn)DRAW_NEXT: INT 10H ;畫點(diǎn) INC CX ;畫橫線 CMP CX,END_X ;比較行是否畫完 JNE DRAW_NEXT ;畫另一行 MOV CX, START_X ;另一行的起始點(diǎn) INC DX CMP DX,END_Y ;比較列是否畫完 JNE DRAW_NEXT ;未完繼續(xù)畫 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 ;下邊起始點(diǎn) MOV SI,END_X INC SIROW_DOWN: ;畫下邊 INT 10H INC CX CMP CX,SI JNE ROW_DOWN MOV DX,START_Y ;右邊起始點(diǎn) 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 ;數(shù)據(jù)段DATA SEGMENT ;定義在屏幕繪制字 START_COL DB ? ;存儲(chǔ)起始行 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 ;白色琴鍵坐標(biāo) 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 ;黑色琴鍵坐標(biāo) 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 ;標(biāo)記低(0)、中(1)、高(2)音鍵 KEYNUM DW 1 ;存儲(chǔ)17 DELAY_TIME DW 7000 ;延時(shí) SONG DW 100 ;保存所選的自動(dòng)演奏的曲目 TUNE DW 1 ;標(biāo)記c調(diào)或d調(diào) AUDIO DW 1 ;標(biāo)記低(1)、中(2)、高音(3);自動(dòng)演奏的歌曲頻率和延時(shí)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 ;調(diào)用初始化程序NEW_SCAN: CALL SCAN_KEY ;掃描所按下的鍵 CMP SONG,100 ;判斷是否按下了自動(dòng)播放的歌曲鍵 JE HAND_PLAY ;若不是,繼續(xù)判斷 CALL PLAY_SONG ;若是,演奏音樂 JMP NEW_SCAN ;演奏結(jié)束,重新掃描有無鍵按下HAND_PLAY: CMP KEYNUM,100 ;判斷是否手動(dòng)演奏 JZ NEW_SCAN ;若不是,重新掃描有無鍵按下 ;若是,進(jìn)行按鍵處理 PUSH BX MOV BX,KEYNUM CALL KEY_DOWN ;在屏幕上顯示按下狀態(tài) POP BX CALL LOAD_AUDIO ;判斷高低音、C/D調(diào),并裝入對應(yīng)頻率段地址到BX中 PUSH SI MOV SI,KEYNUM MOV DI,BX+SI CALL GEN_HAND ;發(fā)聲 POP SI PUSH BX MOV BX,KEYNUM ;在屏幕上顯示彈起狀態(tài) CALL KEY_UP POP BX JMP NEW_SCAN ;重新掃描有無鍵按下,直到按下ESC鍵MAIN ENDP GEN_HAND PROC NEAR;手動(dòng)演奏發(fā)聲程序;IN:DI PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H ;定時(shí)器初始化 OUT 43H,AL MOV DX,12H MOV AX,348CH DIV DI OUT 42H,AL ;定時(shí)器送處值 IN AL,61H ;開揚(yáng)聲器 MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,ALWAIT1: CALL WAITF ;調(diào)用延時(shí)程序 IN AL,60H TEST AL,80H ;查詢鍵是否放開 JZ WAIT1 ;未放開繼續(xù)查詢 MOV AL,AH ;放開則關(guān)揚(yáng)聲器 OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RETGEN_HAND ENDP GEN_AUTO PROC NEAR;自動(dòng)播放發(fā)聲程序 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 ;完畢則關(guān)閉揚(yáng)聲器 OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RETGEN_AUTO ENDP WAITF PROC NEAR;延時(shí)程序 PUSH AXMOV CX,DELAY_TIMEWAITF1: IN AL,61H AND AL,10H ;檢查PB4口 CMP AL,AH ;判斷AL變化否 JE WAITF1 ;等待AL變化 MOV AH,AL ;保存PB4的新狀態(tài)(AL中) LOOP WAITF1 POP AX RETWAITF ENDP PIANO_DRAW PROC NEAR;繪制琴鍵 LEA SI,ST_LX ;載入白色起始點(diǎn)地址 LEA DI,ED_LX ;載入白色結(jié)束點(diǎn)地址 MOV CX,21 ;白鍵數(shù)目NEXT_DRAW: DRAW SI,ST_Y,DI,ED_Y,0FH ;調(diào)用宏定義畫白鍵 DRAW SI,90,DI,93,07H ;陰影 ADD SI,2 ;下一個(gè)鍵 ADD DI,2 LOOP NEXT_DRAW LEA SI,BT_X ;載入黑色起始點(diǎn)地址 LEA DI,BD_X ;載入黑色結(jié)束點(diǎn)地址 MOV CX,15 ;黑鍵數(shù)目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;鍵按下時(shí),在屏幕上顯示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;鍵彈起時(shí),恢復(fù)正常狀態(tài) PUSH SI PUSH DI CALL LOAD ;載入所彈起鍵在屏幕上的位置 DRAW SI+BX,90,DI+BX,93,07H ;恢復(fù)陰影 DRAW SI+BX,93,DI+BX,94,05H ;恢復(fù)背景色 POP DI POP SI RETKEY_UP ENDP LOAD PROC NEAR;載入鍵在屏幕上的位置CMP KEYFLAG,00H ;判斷是否是低音鍵 JNZ LOAD_HGH ;繼續(xù)判斷 LEA SI,ST_LX ;載入低音鍵起始坐標(biāo)首地址 LEA DI,ED_LX ;載入低音鍵結(jié)束坐標(biāo)首地址 JMP LOAD_END ;載入結(jié)束LOAD_HGH: CMP KEYFLAG,02H ;判斷是否是高音鍵 JNZ LOAD_MID ;繼續(xù)判斷 LEA SI,ST_HX ;載入高音鍵起始坐標(biāo)首地址 LEA DI,ED_HX ;載入高音鍵結(jié)束坐標(biāo)首地址 JMP LOAD_END LOAD_MID: LEA SI,ST_MX ;載入中音鍵起始坐標(biāo)首地址 LEA DI,ED_MX ;載入中音鍵結(jié)束坐標(biāo)首地址LOAD_END: RETLOAD ENDP SCAN_KEY PROC NEAR;檢查按鍵狀態(tài),并存入對應(yīng)的變量和寄存器 MOV SI,100 MOV DI,100 MOV KEYNUM,100 ;賦初值 MOV AH,0 ;讀鍵盤 INT 16H MOV DL,AH CALL SCAN_SONG ;判斷是否是自動(dòng)播放鍵(大鍵盤數(shù)字鍵15) CALL SCAN_TUNE ;判斷是否是C/D調(diào)選擇鍵 CALL FREQ_CHANGE ;判斷是否按下頻率改變鍵:(+/- 符號(hào)) CMP AH,01H ;是否是結(jié)束鍵 JNE FLAG_SCAN ;若不是繼續(xù)檢測 CALL EXIT ;若是則退出 FLAG_SCAN: MOV AH,02H ;讀鍵盤狀態(tài)字節(jié) INT 16H MOV DH,AL ;判斷是否是右shift鍵 AND DH,01H CMP DH,01H JE SLOW ;是則進(jìn)行低音處理 MOV DH,AL ;不是判斷是否是左shift鍵 AND DH,02H CMP DH,02H JE SHGH ;是則進(jìn)行高音處理 JMP SMID ;都不是進(jìn)行中音處理 SLOW: ;低音處理 MOV AUDIO,1 MOV KEYFLAG,0 JMP KEY_1 ;跳轉(zhuǎn)到音鍵處理SHGH: ;高音處理 MOV AUDIO,3 MOV KEYFLAG,2 JMP KEY_1 ;跳轉(zhuǎn)到音鍵處理SMID : ;中音處理 MOV AUDIO,2 MOV KEYFLAG,1 KEY_1: CMP DL,4FH ;是否是1 JNE KEY_2 ;繼續(xù)判斷 MOV KEYNUM,0 ;不是則保存標(biāo)志 JMP SCAN_END ;鍵掃描結(jié)束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;判斷是否是自動(dòng)播放鍵(鍵15),并保存標(biāo)志變量(song);IN: AH 鍵掃描碼 PUSH AX MOV SONG,100 ;賦初始值 CMP AH,3BH ;與1比較 JB SONG_END ;小于1則結(jié)束 CMP AH,3FH ;與5比較 JA SONG_END ;大于則結(jié)束 SUB AH , 3BH ;轉(zhuǎn)換成15 MOV AL,AH MOV AH,00H MOV SONG,AX ;存入標(biāo)志碼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 ;不是繼續(xù)判斷 CALL SO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論