匯編夢(mèng)幻鋼琴程序設(shè)計(jì)報(bào)告.(精編版)_第1頁(yè)
匯編夢(mèng)幻鋼琴程序設(shè)計(jì)報(bào)告.(精編版)_第2頁(yè)
匯編夢(mèng)幻鋼琴程序設(shè)計(jì)報(bào)告.(精編版)_第3頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、匯編語(yǔ)言程序設(shè)計(jì)綜合程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告題目:夢(mèng)幻鋼琴一、項(xiàng)目簡(jiǎn)介利用匯編語(yǔ)言設(shè)計(jì)一個(gè)模擬鋼琴演奏程序。在顯示器上顯示出鋼琴的鍵盤,以計(jì)算機(jī)鍵盤的相應(yīng)鍵模擬鋼琴鍵盤進(jìn)行樂(lè)曲的演奏。在pc機(jī)鍵盤上按鍵,屏幕上對(duì)應(yīng)的鋼琴鍵出現(xiàn)跳動(dòng),并發(fā)出相應(yīng)音符的聲音,例如:按字母 “a” ,發(fā) c大調(diào)do 按字母 “s” ,發(fā) c大調(diào)re 按字母 “d” ,發(fā) c大調(diào)me 按字母 “f” ,發(fā) c大調(diào) fa 按下 f1 、f2 、f3 、f4 、f5 會(huì)依次播放程序中所添加的歌曲;如果想要使該歌曲加速播放,可以同時(shí)按住“shift” 鍵和“+” 鍵; 若要減速播放, 則按 “shift”鍵和“- ”鍵。在彈奏鋼琴曲

2、時(shí), 直接按動(dòng)“a” 、 “s” 、 “d” 、 “f” 、 “g ” 、 “h ” 、 “j”鍵表示的是中音區(qū), 高音區(qū)用右 shift鍵加以上鍵彈奏, 低音區(qū)用左 shift鍵加以上鍵彈奏,也可以通過(guò)c、d轉(zhuǎn)換是彈奏變?yōu)?c大調(diào)或 d 大調(diào)。二、小組成員具體分工1、界面設(shè)計(jì) - 劉靜(1) 、屏幕設(shè)置 mov ah,00h mov al,0dh int 10h mov ah,0bh ;11號(hào)功能,設(shè)置背景顏色 mov bl,00h int 10h (2) 、鋼琴繪制,繪制鍵盤時(shí)的坐標(biāo)的確定:白色琴鍵坐標(biāo): st_lx dw 50,61,72,83,94,105,116 ;起點(diǎn)橫坐標(biāo) st_

3、mx dw 127,138,149,160,171,182,193 st_hx dw 204,215,226,237,248,259,270 st_y dw 50 ;起點(diǎn)縱坐標(biāo) ed_lx dw 60,71,82,93,104,115,126 ;終點(diǎn)縱坐標(biāo) ed_mx dw 137,148,159,170,181,192,203 ed_hx dw 214,225,236,247,258,269,280 ed_y dw 90 ;終點(diǎn)縱坐標(biāo)黑色琴鍵坐標(biāo) bt_x dw 57,68,90,101,112 ;起點(diǎn)橫坐標(biāo) dw 134,145,167,178,189 dw 211,222,244,254

4、,265 bt_y dw 50 ;起點(diǎn)縱坐標(biāo) bd_x dw 64,75,97,108,119 ;終點(diǎn)橫坐標(biāo) dw 141,152,174,185,196 dw 218,229,251,262,273 bd_y dw 70 ;終點(diǎn)縱坐標(biāo)宏定義繪制填充矩形:draw macro start_x,start_y,end_x,end_y,color 宏定義繪制不填充矩形:drawsqre macro start_x,start_y,end_x,end_y,color 最后在主程序 init proc near 調(diào)用以上定義的宏來(lái)繪制琴鍵。(3) 、琴鍵繪制 piano_draw proc near

5、(4) 、屏幕顯示字符 show_char proc near、show_text proc near 2、功能調(diào)試 - 劉鑄輝通過(guò)調(diào)用子程序來(lái)實(shí)現(xiàn)各個(gè)功能:(1) 、手動(dòng)演奏 gen_hand proc near (2) 、自動(dòng)播放發(fā)聲程序gen_auto proc near (3) 、延時(shí)程序 waitf proc near (4) 、自動(dòng)播放歌曲 scan_song proc near、play_song proc near (5) 、c/d調(diào)及對(duì)應(yīng)的低、中、高頻率分別載入load_audio proc near (6) 、c/d調(diào)判斷及其狀態(tài)在屏幕上的顯示scan_tune proc

6、near; 三、需求分析與設(shè)計(jì)1、鋼琴繪制。這部分主要實(shí)現(xiàn)畫鋼琴鍵盤鍵身的功能。它是由二十一個(gè)白色的長(zhǎng)方塊和十五個(gè)黑色的長(zhǎng)方塊構(gòu)成的,要在屏幕上畫出有立體效果的長(zhǎng)方形白色和黑色鍵盤,我們需要用bios調(diào)用編織線使程序。顯示適配器都自帶顯示服務(wù)的 bios ,利用它所提供的 bios調(diào)用來(lái)編寫程序,對(duì)于我們編程應(yīng)用者來(lái)說(shuō)是透明的,我們只需要調(diào)用顯示驅(qū)動(dòng)程序int 10h 。鋼琴主要是由矩形、直線等規(guī)則幾何形狀構(gòu)成,通過(guò)畫點(diǎn)、畫線等基本程序完成鋼琴的繪制。對(duì)于繪制鋼琴鍵盤,為使其有立體感,還需要先在excel 表中繪制一個(gè)簡(jiǎn)單的鋼琴鍵盤,準(zhǔn)確對(duì)應(yīng)其各個(gè)邊界的坐標(biāo)。鋼琴鍵盤的動(dòng)態(tài)顯示則是同步于鍵盤的

7、按鍵有按下和彈起的動(dòng)畫。這部分功能需要也可以用繪制鋼琴的方法來(lái)實(shí)現(xiàn)這個(gè)效果。繪制琴鍵: piano_draw proc near 白色琴鍵: lea si,st_lx ; 取白色琴鍵起始點(diǎn)有效地址 lea di,ed_lx ;取白色琴鍵結(jié)束點(diǎn)有效地址 mov cx,21 ;白色琴鍵數(shù)目 21 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 ;cx-1不為 0 繼續(xù)畫黑色琴鍵: lea si,bt_x; 取黑色琴鍵起始點(diǎn)的有效地

8、址 lea di,bd_x;取黑色琴鍵結(jié)束點(diǎn)的有效地址 mov cx,15;黑色琴鍵 15 個(gè)next_block: draw si,bt_y,di,bd_y,00h;調(diào)用宏定義畫黑色琴鍵 add si,2;下一個(gè)鍵 add di,2 loop next_block;cx-1不為 0 繼續(xù)畫黑鍵2、 發(fā)聲程序。該發(fā)生程序是在修改beep 發(fā)聲程序的基礎(chǔ)上,以實(shí)現(xiàn)為 8088/86編寫一個(gè)任意頻率和任意持續(xù)時(shí)間的通用發(fā)聲程序。該程序包括以下三個(gè)步驟:(1)在 8253/54 中的 43 端口送一個(gè)控制字0b6h (10110110b ) ,該控制字對(duì)定時(shí)器 2 進(jìn)行初始化,使得定時(shí)器2 準(zhǔn)備接受

9、計(jì)數(shù)初值。(2)在 8253/54 中的 42h端口裝入一個(gè) 16位計(jì)數(shù)值,已建立將要產(chǎn)生的聲音頻率。(3)把輸出端口 61h的 0、1 兩位置 1,發(fā)出聲音。具體實(shí)現(xiàn)如下: gen_hand proc near;手動(dòng)演奏發(fā)聲程序;in :di push ax push bx push cx push dx push di ; 定時(shí)器初始化程序 mov al,0b6h ;定時(shí)器初始化, ;選擇計(jì)數(shù)器 2,工作在方式 3 out 43h,al ;out 43h,al ;向定時(shí)器送初值 mov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計(jì)數(shù)初值 mov ax,34

10、8ch ;12348h存入 dx:ax中,商存 ax ,余數(shù)存 dx div di;di為給定的頻率 out 42h,al;定時(shí)器送處值 in al,61h ;開揚(yáng)聲器 mov al,ah ;給定時(shí)器 2 寫入 ax中存放的計(jì)數(shù)初值 out 42h,al in al,61h mov ah,al;把 8255輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫入ah or al,3 out 61h,al wait1: call waitf ;調(diào)用延時(shí)程序 in al,60h ;讀取鍵盤掃描碼,按下和放開都有相應(yīng)的掃描碼,放開碼=按下碼 +80h80h test al,80h ;查詢鍵是否放開 j

11、z wait1 ;未放開繼續(xù)查詢, al不等于 80h則繼續(xù)延時(shí) mov al,ah ;恢復(fù) 8255 端口 61h的狀態(tài)(即按鍵放開) ,關(guān)揚(yáng)聲器 out 61h,al;通過(guò)監(jiān)控端口 61h的 pb4固定不變的觸發(fā)時(shí)間來(lái)產(chǎn)生延遲時(shí)間 pop di ;恢復(fù)寄存器狀態(tài) pop dx pop cx pop bx pop ax ret gen_hand endp 3、延時(shí)程序。 80 x86 的各種處理器采取了666mhz 的工作頻率, loop 指令的執(zhí)行時(shí)間在這些處理器上也不相同。為了建立一個(gè)與處理器無(wú)關(guān)的延時(shí),ibm采用了一種利用硬件產(chǎn)生時(shí)間延時(shí)的方法,即通過(guò)監(jiān)控端口61h和 pb4 ,使 p

12、b4每15.08 微秒觸發(fā)一次,一產(chǎn)生一個(gè)固定不變的時(shí)間基準(zhǔn)。在ibm pc at bios 的waitf子程序,就是一個(gè)產(chǎn)生nx15.08 微秒時(shí)間演示的程序。調(diào)用waitf子程序時(shí),cx寄存器必須裝入 15.08 微秒的倍數(shù) n 。利用 waitf子程序能獲得任意的時(shí)間延時(shí),而不必在考慮cpu 的型號(hào)和工作頻率。具體實(shí)現(xiàn)如下:waitf proc near ; 延時(shí)程序push ax mov cx,delay_time waitf1: in al,61h and al,10h ;檢查 pb4口 cmp al,ah ;判斷 al變化否 je waitf1 ;沒(méi)有變化則等待 al變化 mov

13、ah,al ;保存 pb4的新狀態(tài) (al 中) loop waitf1 ;cx-1不為 0 就回到 waitf1 pop ax ;ax出棧 ret waitf endp 4、音符的演奏。在pc系列機(jī)上, 8254 的三個(gè)計(jì)數(shù)器各有其作用,計(jì)數(shù)器0用于維護(hù)系統(tǒng)時(shí)鐘; 計(jì)數(shù)器 1 用于周期性的向dma 發(fā)送數(shù)據(jù)請(qǐng)求信號(hào), 供存儲(chǔ)器刷新使用;計(jì)數(shù)器 2 接到揚(yáng)聲器用來(lái)產(chǎn)生聲音。 各計(jì)數(shù)器的輸入時(shí)鐘脈沖頻率均為 1.19318mhz 。通過(guò)設(shè)置計(jì)數(shù)值可以產(chǎn)生各種頻率的聲音。與此同時(shí),許多輸入輸出操作都是由8255a 可編程外設(shè)接口來(lái)控制的。利用cpu支持的外圍電路8254與 8255,通過(guò)匯編程序改

14、變8255 的 pb0 ,pb1口,接通揚(yáng)聲器,使得計(jì)算機(jī)能夠發(fā)出一定頻率的聲音, 同時(shí)通過(guò) 8254 的與 8255 連接的 2 號(hào)計(jì)數(shù)器控制指定頻率,從而達(dá)到控制揚(yáng)聲器的音調(diào)的效果。具體實(shí)現(xiàn)如下: gen_hand proc near;手動(dòng)演奏發(fā)聲程序;in :di push ax push bx push cx push dx push di ; 定時(shí)器初始化程序 mov al,0b6h ;定時(shí)器初始化, ;選擇計(jì)數(shù)器 2,工作在方式 3 out 43h,al ;out 43h,al ;向定時(shí)器送初值 mov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計(jì)

15、數(shù)初值 mov ax,348ch ;12348h存入 dx:ax中,商存 ax ,余數(shù)存 dx div di;di為給定的頻率 out 42h,al;定時(shí)器送處值 in al,61h ;開揚(yáng)聲器 mov al,ah ;給定時(shí)器 2 寫入 ax中存放的計(jì)數(shù)初值 out 42h,al in al,61h mov ah,al;把 8255輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫入ah or al,3 out 61h,al wait1: call waitf ;調(diào)用延時(shí)程序 in al,60h ;讀取鍵盤掃描碼,按下和放開都有相應(yīng)的掃描碼,放開碼=按下碼 +80h80h test al,8

16、0h ;查詢鍵是否放開 jz wait1 ;未放開繼續(xù)查詢, al不等于 80h則繼續(xù)延時(shí) mov al,ah ;恢復(fù) 8255 端口 61h的狀態(tài)(即按鍵放開) ,關(guān)揚(yáng)聲器 out 61h,al;通過(guò)監(jiān)控端口 61h的 pb4固定不變的觸發(fā)時(shí)間來(lái)產(chǎn)生延遲時(shí)間 pop di ;恢復(fù)寄存器狀態(tài) pop dx pop cx pop bx pop ax ret gen_hand endp 5、自動(dòng)播放歌曲。(1)、為所要播放的樂(lè)曲的定義一個(gè)頻率表和節(jié)拍表。以所播放的第二首歌曲兩只老虎為例:頻率表: mus_freq2 dw 262,294,330,262,262,294,330,262 ;兩只老虎d

17、w 330,349,392,330,349,392,392,440 dw 392,349,330,262,392,440,392,349 dw 330,262,294,196,262,294,196,262 dw 262,294,330,262,262,294,330,262 dw 330,349,392,330,349,392,392,440 dw 392,349,330,262,392,440,392,349 dw 330,262,294,196,262,294,196,262 dw 0 節(jié)拍表:mus_time2 dw 25,25,25,25,25,25,25,25,25,25 dw 5

18、0,25,25,50,12,12,12,12,25,25 dw 12,12,12,12,25,25,25,25,50,25,25,50 dw 25,25,25,25,25,25,25,25,25,25 dw 50,25,25,50,12,12,12,12,25,25 dw 12,12,12,12,25,25,25,25,50,25,25,50 (2)、分表將兩個(gè)表的偏移地址放入si和bp 中 lea bp,mus_time2 lea si,mus_freq2 (3)、從表中讀出的音符頻率放入di中,取出音符的持續(xù)時(shí)間(10s的倍數(shù))放入 bx 中。 mov di,si mov bx,bp (4

19、)、最后調(diào)用 gen_auto子程序發(fā)出聲音。6、c 、d 調(diào)的轉(zhuǎn)換。從 c調(diào)向d調(diào)進(jìn)行轉(zhuǎn)換,先判斷當(dāng)前音符為哪種調(diào),若為c調(diào),則進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)的過(guò)程中開 d燈,關(guān)c 燈;反之同原理。調(diào)用的是 scan_tune子程序。scan_tune proc near; ;c/d調(diào)判斷及其狀態(tài)在屏幕上的顯示;in:dl 鍵盤掃描碼;out:tune cmp dl,2eh ;判斷是 c否 jnz next_d ;不是則判斷是 d否 mov tune,c draw 55,38,60,41,0eh ;關(guān)d 燈 draw 65,38,70,41,0ah ;開c燈 jmp tune_end ;結(jié)束next_d:

20、cmp dl,20h;判斷d否 jnz tune_end mov tune,d draw 55,38,60,41,0ah ;開d燈 draw 65,38,70,41,0eh;關(guān)c 燈tune_end: ret scan_tune endp 四、代碼及分析 ; 宏定義draw 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 80h test al,80h ;查詢鍵是否放開 jz wait1 ;未放開繼續(xù)查詢

21、, al不等于 80h則繼續(xù)延時(shí) mov al,ah ;恢復(fù) 8255 端口 61h的狀態(tài)(即按鍵放開) ,關(guān)揚(yáng)聲器 out 61h,al;通過(guò)監(jiān)控端口 61h的 pb4固定不變的觸發(fā)時(shí)間來(lái)產(chǎn)生延遲時(shí)間 pop di ;恢復(fù)寄存器狀態(tài) pop dx pop cx pop bx pop ax ret gen_hand endp gen_auto proc near ; 自動(dòng)播放發(fā)聲程序 push ax push bx push cx push dx push di ; 定時(shí)器初始化程序 mov al,0b6h ;定時(shí)器的初始化,選擇計(jì)數(shù)器2,工作在方式 3 out 43h,al mov dx,1

22、2h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計(jì)數(shù)初值 mov ax,348ch ;12348h存入 dx:ax中,商存 ax ,余數(shù)存 dx div di ;di為給定的頻率 out 42h,al ;定時(shí)器送初值 in al,61h ;開揚(yáng)聲器 mov al,ah ;給定時(shí)器 2 寫入 ax中存放的計(jì)數(shù)初值 out 42h,al ;定時(shí)器送初值 in al,61h ;開揚(yáng)聲器 mov ah,al ;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫入ah or al,3 out 61h,al wait2: call waitf ;調(diào)用延時(shí)程序 dec b

23、x ;bx存放節(jié)拍值 jnz wait2 ;判斷是否播放完畢 mov al,ah ;完畢則關(guān)閉揚(yáng)聲器 out 61h,al pop di ;恢復(fù)寄存器狀態(tài) pop dx pop cx pop bx pop ax ret gen_auto endp waitf proc near ; 延時(shí)程序 push ax mov cx,delay_time waitf1: in al,61h and al,10h ;檢查 pb4口 cmp al,ah ;判斷 al變化否 je waitf1 ;沒(méi)有變化則等待 al變化 mov ah,al ;保存 pb4的新狀態(tài) (al 中) loop waitf1 ;cx-

24、1不為 0 就回到 waitf1 pop ax ;ax出棧 ret waitf endp piano_draw proc near ; 繪制琴鍵 lea si,st_lx ; 取白色琴鍵起始點(diǎn)有效地址 lea di,ed_lx ;取白色琴鍵結(jié)束點(diǎn)有效地址 mov cx,21 ;白色琴鍵數(shù)目 21 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 ;cx-1不為 0 繼續(xù)畫 lea si,bt_x;取黑色琴鍵起始點(diǎn)的有效地址 le

25、a di,bd_x;取黑色琴鍵結(jié)束點(diǎn)的有效地址 mov cx,15;黑色琴鍵 15 個(gè)next_block: draw si,bt_y,di,bd_y,00h;調(diào)用宏定義畫黑色琴鍵 add si,2;下一個(gè)鍵 add di,2 loop next_block;cx-1不為 0 繼續(xù)畫黑鍵 ret piano_draw endp key_down proc near ; 鍵按下時(shí),在屏幕上顯示 push si push di call load;載入所按下鍵在屏幕上的位置 draw si+bx,90,di+bx,92,0fh;調(diào)用矩形繪制宏, bx 為案件標(biāo)號(hào)緩存值 draw si+bx,92,

26、di+bx,94,07h pop di pop si ret key_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 ret key_up endp load proc near ; 載入鍵在屏幕上的位置cmp keyflag,00h;判斷是否是低音鍵 jnz load_hgh;繼續(xù)判斷 lea si,st_lx;載入低

27、音鍵起始坐標(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;結(jié)束load_mid: lea si,st_mx;載入中音鍵起始坐標(biāo)首地址 lea di,ed_mx;載入中音鍵結(jié)束坐標(biāo)首地址load_end: ret load endp scan_key proc near; ; 檢查按鍵狀態(tài),并存入對(duì)應(yīng)的變量和寄存器

28、 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ù)檢測(cè) call exit ;若是則退出flag_scan: mov ah,02h;讀鍵盤狀態(tài)字節(jié) int 16h mov dh,al ;判斷是否是右 shif

29、t鍵 and dh,02h cmp dh,02h je slow ;是則進(jìn)行低音處理 mov dh,al ;不是判斷是否是左shift鍵 and dh,01h cmp dh,01h 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,1eh ;是否是

30、 a jne key_2 ;繼續(xù)判斷 mov keynum,0 ;不是則保存標(biāo)志 jmp scan_end ;鍵掃描結(jié)束key_2: cmp dl,1fh; 是否是 s jne key_3 mov keynum,2 jmp scan_end key_3: cmp dl,20h ; 是否是 d jne key_4 mov keynum,4 jmp scan_end key_4: cmp dl,21h ; 是否是 f jne key_5 mov keynum,6 jmp scan_end key_5: cmp dl,22h; 是否是 g jne key_6 mov keynum,8 jmp sca

31、n_end key_6: cmp dl,23h ; 是否是 h jne key_7 mov keynum,10 jmp scan_end key_7: cmp dl,24h ; 是否是 j jne scan_end mov keynum,12 scan_end: ret scan_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

32、 比較 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 ret scan_song endp play_song proc near ; 選擇并播放音樂(lè) push bp push si push bx push di push ax cmp song,01h ;判斷是否是歌 1 jne go2 ;不是繼續(xù)判斷 call song_light_off ; 燈 15 滅 draw 247,42,251,46,0eh ;燈 1 亮 lea bp,mus_time

33、1 ;載入延時(shí)數(shù)據(jù)首地址 lea si,mus_freq1 ;載入頻率數(shù)據(jù)首地址 jmp freq go2: cmp song,02h ;判斷是否是歌 2 jne go3 call song_light_off draw 253,42,257,46,0eh lea bp,mus_time2 lea si,mus_freq2 jmp freq go3: cmp song,03h ;判斷是否是歌 3 jne go4 call song_light_off draw 259,42,263,46,0eh lea bp,mus_time3 lea si,mus_freq3 jmp freq go4: c

34、mp song,04h;判斷是否是歌 4 jne go5 call song_light_off draw 265,42,269,46,0eh lea bp,mus_time4 lea si,mus_freq4 jmp freq go5: cmp song,05h ;判斷是否是歌 5 jne freq call song_light_off draw 271,42,275,46,0eh lea bp,mus_time5 lea si,mus_freq5 freq: mov ah,01h int 16h cmp ah,1ch ;判斷是否為 enter鍵(1ch為 enter鍵的掃描碼) jnz

35、continue;不是繼續(xù) jmp play_end ;是就結(jié)束自動(dòng)播放continue: mov ah,0ch ;清除鍵盤緩沖區(qū)字符 mov al,06h ;dos 6號(hào)功能調(diào)用 int 21h mov di,si ;把頻率放在 di 中 cmp di,0;判斷是否結(jié)束 je play_end mov bx,bp ;bx中存放節(jié)拍數(shù) call gen_auto; 發(fā)聲 add si,2 add bp,2 ;下一頻率 jmp freq play_end: call song_light_off pop ax pop di pop bx pop si pop bp ret play_song e

36、ndp load_audio proc near ;c/d 調(diào)及對(duì)應(yīng)的低、中、高頻率分別載入;out:bx ;in:tune,audio tune_d: ;d大調(diào)判斷 cmp tune,d jnz tune_cl ;不是判斷是否是 c調(diào)tune_dl: cmp audio,1 ;低頻判斷 jne tune_cm lea bx,lowdd jmp audio_end tune_dm: cmp audio,2 ;中頻判斷 jne tune_ch lea bx,midd jmp audio_end tune_dh: lea bx,hghd ;高頻判斷 jmp audio_end tune_cl: ;

37、c調(diào)處理 cmp audio,1 jne tune_cm lea bx,lowd jmp audio_end tune_cm: cmp audio,2 jne tune_ch lea bx,mid jmp audio_end tune_ch: lea bx,hgh audio_end: ret load_audio endp scan_tune proc near; ;c/d 調(diào)判斷及其狀態(tài)在屏幕上的顯示;in:dl 鍵盤掃描碼;out:tune cmp dl,2eh ;判斷是 c否 jnz next_d ;不是則判斷是 d否 mov tune,c draw 55,38,60,41,0eh ;

38、關(guān) d燈 draw 65,38,70,41,0ah ;開 c燈 jmp tune_end ;結(jié)束next_d: cmp dl,20h;判斷 d否 jnz tune_end mov tune,d draw 55,38,60,41,0ah ;開 d燈 draw 65,38,70,41,0eh;關(guān) c燈tune_end: ret scan_tune endp show_text proc near ; 在屏幕上顯示字符 lea di,text; 取 字 符 串 有 效 地 址 ,初 始 化 光 標(biāo) 位 置 mov dh,di ;2號(hào)功能,賦行值 inc di ;取得列 mov dl,di ;2 號(hào)功

39、能,賦列值 mov start_col,dl ;保存開始列 mov ah,2;2號(hào)功能,設(shè)置光標(biāo)位置 ,dh=行號(hào), dl= 列號(hào), bh= 頁(yè)號(hào) mov bh,00h ;0頁(yè) int 10h inc di ;取得顏色值 mov bl,di;賦顏色值char_write: ; 顯示字符 inc di ;取得要顯示的字符 mov al,di cmp al,0ffh;行結(jié)束否 je bump_row; 下一行 cmp al,0 ;結(jié)束否 jz end_text call show_char ; 調(diào)用顯示字符 jmp char_write ;下一個(gè)字符 end_text: ret bump_row:

40、 ; 光標(biāo)下移一行 inc dh ;2號(hào)功能,下一行 mov dl,start_col;2號(hào)功能,賦開始值 mov ah,2 ;2號(hào)功能,設(shè)光標(biāo)位置 mov bh,00h int 10h jmp char_write show_text endp show_char proc near ; 顯示字符 mov ah,9 ;9號(hào)功能,顯示字符 bl=字符屬性, bh= 頁(yè)號(hào),al=字符 ascii碼,cx=;寫入字符數(shù) mov bh,00h mov cx,1 ;寫入一個(gè)字符 int 10h inc dl ;2號(hào)功能,賦列值,這里為光標(biāo)右移一個(gè)字符位 mov ah,2 ;設(shè)置光標(biāo)位置 mov bh,00h ;0頁(yè) int 10h ret show_char endp init proc near ; 初始化屏幕:畫琴鍵 mov ax,data mov ds,ax mov ah,00h ; 設(shè)置屏幕 mov al,0dh int 10h mov ah,0bh ;11號(hào)功能,設(shè)置背景顏色 mov bl,02h int 10h call show_text; 顯示字符串 draw 45,30,285,94,05h drawsqre 45,30,285,9

溫馨提示

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

評(píng)論

0/150

提交評(píng)論