![匯編夢(mèng)幻鋼琴程序設(shè)計(jì)報(bào)告.(精編版)_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/3370e43f-2eaf-46f9-b16e-12f92b43b4c1/3370e43f-2eaf-46f9-b16e-12f92b43b4c11.gif)
![匯編夢(mèng)幻鋼琴程序設(shè)計(jì)報(bào)告.(精編版)_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/3370e43f-2eaf-46f9-b16e-12f92b43b4c1/3370e43f-2eaf-46f9-b16e-12f92b43b4c12.gif)
![匯編夢(mèng)幻鋼琴程序設(shè)計(jì)報(bào)告.(精編版)_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/3370e43f-2eaf-46f9-b16e-12f92b43b4c1/3370e43f-2eaf-46f9-b16e-12f92b43b4c13.gif)
下載本文檔
版權(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è)模擬鋼琴演奏程序。在顯示器上顯示出鋼琴的鍵盤(pán), 以計(jì)算機(jī)鍵盤(pán)的相應(yīng)鍵模擬鋼琴鍵盤(pán)進(jìn)行樂(lè)曲的演奏。在pc機(jī)鍵盤(pán)上按鍵,屏幕上對(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” 鍵和“- ”鍵。在彈奏鋼琴曲時(shí), 直接按動(dòng)“a”、“
2、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 10hmov ah,0bh;11號(hào)功能,設(shè)置背景顏色mov bl,00h int 10h(2) 、鋼琴繪制,繪制鍵盤(pán)時(shí)的坐標(biāo)的確定:白色琴鍵坐標(biāo):st_lx dw 50,61,72,83,94,105,116 ;起點(diǎn)橫坐標(biāo)st_mx dw 127,138,149,160,171,18
3、2,193st_hx dw 204,215,226,237,248,259,270st_ydw 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,203ed_hx dw 214,225,236,247,258,269,280ed_ydw 90;終點(diǎn)縱坐標(biāo)黑色琴鍵坐標(biāo)bt_xdw 57,68,90,101,112;起點(diǎn)橫坐標(biāo)dw 134,145,167,178,189dw 211,222,244,254,265bt_ydw 50;起點(diǎn)縱坐標(biāo)bd_x dw 64,75,97,108,119;
4、終點(diǎn)橫坐標(biāo)dw 141,152,174,185,196dw 218,229,251,262,273bd_ydw 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_drawproc near(4) 、屏幕顯示字符 show_char proc n、esahrow_text proc near2、功能調(diào)試 -
5、 劉鑄輝通過(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 n、eaprlay_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 near;三、需求分析與設(shè)計(jì)1、鋼琴繪制。這部分主要實(shí)現(xiàn)畫(huà)鋼琴鍵盤(pán)鍵身的功能。它是由二十一個(gè)白 色的長(zhǎng)方塊和十五個(gè)黑色的長(zhǎng)方塊構(gòu)
6、成的,要在屏幕上畫(huà)出有立體效果的長(zhǎng)方形白色和黑色鍵盤(pán),我們需要用bios調(diào)用編織線使程序。顯示適配器都自帶顯示服務(wù)的 bios,利用它所提供的bios調(diào)用來(lái)編寫(xiě)程序,對(duì)于我們編程應(yīng)用者來(lái)說(shuō)是透明的,我們只需要調(diào)用顯示驅(qū)動(dòng)程序int10h。鋼琴主要是由矩形、直線等規(guī)則幾何形狀構(gòu)成,通過(guò)畫(huà)點(diǎn)、畫(huà)線等基本程序完成鋼琴的繪制。對(duì)于繪制鋼琴鍵盤(pán),為使其有立體感,還需要先在excel表中繪制一個(gè)簡(jiǎn)單的鋼琴鍵盤(pán),準(zhǔn)確對(duì)應(yīng)其各個(gè)邊界的坐標(biāo)。鋼琴鍵盤(pán)的動(dòng)態(tài)顯示則是同步于鍵盤(pán)的按鍵有按下和彈起的動(dòng)畫(huà)。這部分功能需要也可以用繪制鋼琴的方法來(lái)實(shí)現(xiàn)這個(gè)效果。繪制琴鍵: piano_drawproc near白色琴鍵:
7、lea si,st_lx ; 取白色琴鍵起始點(diǎn)有效地址lea di,ed_lx ;取白色琴鍵結(jié)束點(diǎn)有效地址mov cx,21 ;白色琴鍵數(shù)目 21next_draw:draw si,st_y,di,ed_y,0fh;調(diào)用宏定義畫(huà)白鍵draw si,90,di,93,07h ;陰影add si,2;下一個(gè)鍵add di,2loop next_draw ;cx-1不為 0 繼續(xù)畫(huà)黑色琴鍵: lea si,bt_x; 取黑色琴鍵起始點(diǎn)的有效地址lea di,bd_x; 取黑色琴鍵結(jié)束點(diǎn)的有效地址mov cx,15; 黑 色 琴 鍵 15 個(gè)next_block:draw si,bt_y,di,bd_
8、y,00h;調(diào)用宏定義畫(huà)黑色琴鍵add si,2;下一個(gè)鍵add di,2loop next_block;cx-1不為 0 繼續(xù)畫(huà)黑鍵2、發(fā)聲程序。該發(fā)生程序是在修改beep發(fā)聲程序的基礎(chǔ)上, 以實(shí)現(xiàn)為 8088/86編寫(xiě)一個(gè)任意頻率和任意持續(xù)時(shí)間的通用發(fā)聲程序。該程序包括以下三個(gè)步驟:( 1)在 8253/54中的 43 端口送一個(gè)控制字0b6h(10110110b),該控制字對(duì)定時(shí)器 2 進(jìn)行初始化,使得定時(shí)器2 準(zhǔn)備接受計(jì)數(shù)初值。(2) )在 8253/54 中的 42h端口裝入一個(gè)16 位計(jì)數(shù)值,已建立將要產(chǎn)生的聲音頻率。(3) )把輸出端口 61h 的 0、1 兩位置 1,發(fā)出聲音。
9、具體實(shí)現(xiàn)如下:gen_hand proc nea手r動(dòng);in :di push ax push bx push cx push dx演奏發(fā)聲程序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,348ch ;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時(shí)器送處值in al,61h ;開(kāi)揚(yáng)聲器mov al,ah
10、;給定時(shí)器 2 寫(xiě)入 ax中存放的計(jì)數(shù)初值out 42h,alin al,61hmovah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫(xiě)入ahor al,3 out 61h,alwait1:call waitf ;調(diào)用延時(shí)程序in al,60h;讀取鍵盤(pán)掃描碼,按下和放開(kāi)都有相應(yīng)的掃描碼,放開(kāi)碼=按下碼+80h>80htest al,80h ;查詢鍵是否放開(kāi)jz wait1;未放開(kāi)繼續(xù)查詢, al不等于 80h則繼續(xù)延時(shí)mov al,ah ;恢復(fù) 8255 端口 61h的狀態(tài)(即按鍵放開(kāi)) ,關(guān)揚(yáng)聲器out 61h,al;通過(guò)監(jiān)控端口 61h 的 pb4固定不
11、變的觸發(fā)時(shí)間來(lái)產(chǎn)生延遲時(shí)間pop di;恢復(fù)寄存器狀態(tài)pop dx pop cx pop bx pop axret gen_hand endp3、延時(shí)程序。 80x86 的各種處理器采取了666mhz的工作頻率, loop 指令的執(zhí)行時(shí)間在這些處理器上也不相同。為了建立一個(gè)與處理器無(wú)關(guān)的延時(shí),ibm采用了一種利用硬件產(chǎn)生時(shí)間延時(shí)的方法,即通過(guò)監(jiān)控端口61h和 pb4,使 pb4每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 微秒的
12、倍數(shù) n。利用 waitf子程序能獲得任意的時(shí)間延時(shí),而不必在考慮cpu的型號(hào)和工作頻率。具體實(shí)現(xiàn)如下:waitf proc near; 延時(shí)程序push axmov cx,delay_time waitf1:in al,61hand al,10h ;檢查 pb4口cmp al,ah;判斷 al變化否je waitf1;沒(méi)有變化則等待al 變化mov ah,al ;保存 pb4的新?tīng)顟B(tài) (al 中)loop waitf1;cx-1不為 0 就回到 waitf1 pop ax;ax出棧ret waitf endp4、音符的演奏。在pc系列機(jī)上, 8254 的三個(gè)計(jì)數(shù)器各有其作用,計(jì)數(shù)器0用于維護(hù)
13、系統(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ò)匯編程序改變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 nea手r動(dòng);in : di
14、push ax push bx push cx push dx push di; 定時(shí)器初始化程序演奏發(fā)聲程序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,348ch ;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時(shí)器送處值in al,61h ;開(kāi)揚(yáng)聲器mov al,ah;給定時(shí)器 2 寫(xiě)入 ax中存放的計(jì)數(shù)初值out 42h,al in
15、 al,61hmovah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫(xiě)入ahor al,3out 61h,al wait1:call waitf ;調(diào)用延時(shí)程序inal,60h;讀取鍵盤(pán)掃描碼,按下和放開(kāi)都有相應(yīng)的掃描碼,放開(kāi)碼=按下碼+80h>80htest al,80h ;查詢鍵是否放開(kāi)jz wait1;未放開(kāi)繼續(xù)查詢, al不等于 80h則繼續(xù)延時(shí)mov al,ah ;恢復(fù) 8255 端口 61h的狀態(tài)(即按鍵放開(kāi)) ,關(guān)揚(yáng)聲器out61h,al; 通過(guò)監(jiān)控端口 61h的 pb4固定不變的觸發(fā)時(shí)間來(lái)產(chǎn)生延遲時(shí)間pop di;恢復(fù)寄存器狀態(tài)pop dx p
16、op cx pop bx pop ax retgen_hand endp5、自動(dòng)播放歌曲。(1) 、為所要播放的樂(lè)曲的定義一個(gè)頻率表和節(jié)拍表。以所播放的第二首歌曲兩只老虎為例:頻率表:mus_freq2 dw 262,294,330,262,262,294,330,262 ;兩只老虎dw 330,349,392,330,349,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294,196,262dw 262,294,330,262,262,294,330,262dw 330,349,392,330,349
17、,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294,196,262dw 0節(jié)拍表:mus_time2 dw 25,25,25,25,25,25,25,25,25,25dw 50,25,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,50dw 25,25,25,25,25,25,25,25,25,25dw 50,25,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,
18、50(2) 、分表將兩個(gè)表的偏移地址放入si和bp中l(wèi)ea bp,mus_time2lea si,mus_freq2(3) 、從表中讀出的音符頻率放入di 中,取出音符的持續(xù)時(shí)間(10s的倍數(shù))放入 bx中。mov di,simov bx,bp(4) )、最后調(diào)用 gen_aut子o程序發(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ò)程中開(kāi) d燈,關(guān)c燈;反之同原理。調(diào)用的是 scan_tune 子程序。scan_tune proc near;c/d 調(diào)判斷及其狀態(tài)在屏幕上的顯示;in:dl鍵盤(pán)掃描碼;out:tunecmp dl,
19、2eh ;判斷是 c否jnz next_d ;不是則判斷是 d否mov tune,'c'draw 55,38,60,41,0eh;關(guān)d燈draw 65,38,70,41,0ah ;開(kāi) c 燈 jmp tune_end;結(jié)束next_d:cmp dl,20h;判斷d否jnz tune_end mov tune,'d'draw 55,38,60,41,0ah ;開(kāi)d燈draw 65,38,70,41,0eh;關(guān)c燈tune_end:retscan_tune endp四、代碼及分析; 宏定義draw macro start_x,start_y,end_x,end_y,
20、color local draw_next;local:避免宏重復(fù)調(diào)用時(shí),標(biāo)號(hào)的重復(fù); 功能:畫(huà)填充的矩形; 使用條件: start_x < end_x ,start_y < end_y push axpush bx push cx push dxmov ah,0ch;寫(xiě)像素點(diǎn), 12 號(hào)功能,寫(xiě)圖形像素mov al,color mov bh,0mov cx,start_x;設(shè)置顏色,像素值選用頁(yè)號(hào) 0列起始點(diǎn)mov dx,start_y;行起始點(diǎn)draw_next:int 10h;畫(huà)點(diǎn)inc cxcmp cx,end_x;開(kāi)始畫(huà)橫線比較行是否畫(huà)完jne draw_next;畫(huà)另一
21、行mov cx, start_x;另一行的起始點(diǎn)inc dx;下一行cmp dx,end_y;比較列是否畫(huà)完jne draw_next;未完繼續(xù)畫(huà)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; 功能:畫(huà)不填充的矩形push ax push bx push cx push dx push simov ah,0chmov al,color mov bh,0號(hào) 0mov cx,start_xmov
22、 dx,start_y;寫(xiě)像素點(diǎn)設(shè)置顏色選用頁(yè)列起始點(diǎn)行起始點(diǎn)row_up:;int 10h;inc cx;畫(huà)橫線cmp cx,end_x ;比較行是否畫(huà)完jne row_up;畫(huà)另一邊畫(huà)上邊畫(huà)點(diǎn)rank_right:;畫(huà)右邊int 10h;畫(huà)點(diǎn)inc dx;畫(huà)橫線cmp dx,end_y;比較行是否畫(huà)完jne rank_right;畫(huà)另一邊mov cx, start_x;下邊起始點(diǎn)mov si,end_x inc sirow_down:;畫(huà)下邊int 10h;畫(huà)點(diǎn)inc cx;畫(huà)橫線cmp cx,si;比較行是否畫(huà)完jne row_down; 畫(huà)另一邊mov dx,start_y;右邊起始點(diǎn)
23、mov cx,start_xrank_left:;畫(huà)右邊int 10h;畫(huà)點(diǎn)inc dx;畫(huà)橫線cmp dx, end_y;比較行是否畫(huà)完jne rank_left;畫(huà)另一邊pop si pop dx pop cx pop bx pop ax endm; 數(shù)據(jù)段data segment;定義在屏幕繪制字start_col db ?;存儲(chǔ)起始行text db 13;起始行db 4;起始列db 0ahdb'*thisispiano*',0ffh,'* welcome!haveagoodtime!*',0ffh;字體顏色,設(shè)置顏色db'dreampiano
24、39;,0ffh,'liuzhuhuiandliujing 2013-11-22',0ffh,0ffh;顯示字db 0ffh,'1 a.s.d.f.g.h.j to make music' db 0ffh,'2 f2f5 to play a muisc'db 0ffh,'3 shift and +/- to up/down the music' db 0ffh,'4 l/r shift to hight/low.'db10dup(4dup(0dbh),4dup(20h),0ffh;顏色交叉矩形;db 10 dup(
25、4 dup(20h),4 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 ;起點(diǎn)橫坐標(biāo)st_mx dw 127,138,149,160,171,182,193st_hx dw 204,215,226,237,248,259,
26、270st_ydw 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,203ed_hx dw 214,225,236,247,258,269,280ed_ydw 90;終點(diǎn)縱坐標(biāo);黑色琴鍵坐標(biāo)bt_xdw 57,68,90,101,112;起點(diǎn)橫坐標(biāo)dw 134,145,167,178,189dw 211,222,244,254,265bt_ydw 50;起點(diǎn)縱坐標(biāo)bd_x dw 64,75,97,108,119;終點(diǎn)橫坐標(biāo)dw 141,152,174,185,196dw 218,229
27、,251,262,273bd_ydw 70;終點(diǎn)縱坐標(biāo); 音樂(lè)頻率值lowd dw 131lowdd dw 221,248,278,294,330,371,416 ;低音middw 262midd dw 441,495,556,589,661,742,833 ;中音hgh dw 523hghd dw 882,990,1112,1178,1322,1484,1665 ;高音keyflag db 1;標(biāo)記低( 0)、中( 1)、高( 2 )音鍵 keynum dw 1;存儲(chǔ) 17, 按鍵編號(hào)緩存,提取對(duì)應(yīng)的按鍵位置delay_time dw 7000 ;延時(shí)緩存,用于播放時(shí)存如bx計(jì)數(shù)song d
28、w 100 ;保存所選的自動(dòng)演奏的曲目tune dw 1;標(biāo)記 c 調(diào)或 d 調(diào), 按鍵狀態(tài)緩存audio dw 1;標(biāo)記低音 1 ,中音2 ,高音3; 自動(dòng)演奏的歌曲頻率和延時(shí)mus_freq1 dw 196,220dw 262,262,262,262,262,220,196dw 262,262,262,262,294,262,220,262dw 294,294,294,294,294,262,220dw 294,294,294,294,330,294,330,392dw 440,440,392,440,392,330dw 294,294,330,294,262,220,196,220dw
29、262,262,262,262,262,220dw 262,196,220dw 440,440,392,440,524,440dw 392,330,294,262,220,196,220dw 262,262,262,262,294,262dw 262,330,392dw 440,440,440,440,524,440dw 392,392,392,440,392,330,294dw 262,262,262,262,294dw 330,330,294dw 262,262,262,262,524,440dw 392,392,392,440,392,330,392dw 440,524,524,440,
30、392dw 392,330,392dw 440,440,440,440,524,440dw 392,392,392,440,392,330,294dw 262,262,262,262,392dw 330,330,294dw 262,262,262,262,294,330dw 392,392,330,392,330,392dw 440dw 9,9,196,660,294,294,262dw 262,-1mus_time1 dw 40,40dw 40,20,40,40,80,40,40dw 40,20,40,20,20,80,40,40dw 40,20,40,40,80,40,40dw 40,20
31、,40,20,20,80,40,40dw 40,80,40,80,40,40dw 40,20,20,40,40,80,40,40dw 40,20,40,40,80,80dw 10,80,80dw 40,80,40,80,40,40dw 40,40,40,40,80,40,40dw 40,80,40,80,40,20dw 20,40,40dw 40,80,40,80,40,40dw 40,80,20,20,80,40,40dw 40,80,40,80,80dw 24,40,40dw 40,80,40,80,40,40dw 40,80,20,20,80,40,40dw 80,40,80,40,20
32、dw 20,40,40dw 40,80,40,80,40,40dw 40,80,20,20,80,40,40dw 40,80,40,80,80dw 20,40,40dw 40,80,40,80,40,40dw 40,80,40,80,40,40dw 30dw 80,40,40,40,40,40,40dw 40mus_freq2 dw 262,294,330,262,262,294,330,262 ; 兩只老虎dw 330,349,392,330,349,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294
33、,196,262dw 262,294,330,262,262,294,330,262dw 330,349,392,330,349,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294,196,262dw 0mus_time2 dw 25,25,25,25,25,25,25,25,25,25dw 50,25,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,50dw 25,25,25,25,25,25,25,25,25,25dw 50,25
34、,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,50mus_freq3 dw 262,262,294,330,330,349,392,440,392,330dw 392,349,330,294,349,330,294,262dw 262,262,294,330,330,349,392,440,392,330dw 392,349,330,294,330,294,262,196dw 392,349,330,294,196,196,349,330,294,262dw 392,349,330,294,196,196,349,330
35、,294,262dw 262,262,294,330,330,349,392,440,392,330dw 392,349,330,294,330,294,262dw 0mus_time3 dw 3 dup(25,2 dup(12),50 dw 2 dup(25,2 dup(12),50)dw 3 dup(25,2 dup(12),50dw 2 dup(25,2 dup(12),2 dup (50) dw 3 dup(25,2 dup(12),50dw 3 dup(25,2 dup(12),50 dw 3 dup(25,2 dup(12),50 dw 2 dup(25,2 dup(12),50m
36、us_freq4 dw 262,262,294,330,330,294,262,262,220,196dw 262,294,330,294,262,294dw 262,294,330,330,294,294,262,220,220,294,262,262,220,196dw 196,220,220,262,262,294,294,262,220dw 294,330,294,262,262,294,262,220,196,220dw 196,220,262,294,330,392,294,330,262,294,262,220dw 220,294,247,220,196,196dw 4 dup(
37、392),330,392,440,440,392,330dw 5 dup(440),392,392,330,294dw 440,392,440,392,330,294,330,294,262,220dw 4 dup(294),262,220,196dw 2 dup(440,392),2 dup(330,294),262,220dw 3 dup(294),262,220,392dw 0mus_time4 dw 3 dup(20,10,10),50 dw 20,10,20,10,10,80dw 20,10,20,10,10,3 dup(20,10),20,20,80dw 20,10,10,20,2
38、0,20,10,10,40dw 20,10,20,20,10,5,5,10,10,40dw 20,10,2 dup(20,10,10),10,5,5,20dw 20,20,20,10,10,80dw 10,20,10,20,10,10,40,10,10,20dw 8 dup(10),80dw 20,10,10,20,20,4 dup(10),40dw 15,5,10,10,20,20,80dw 20,10,10,20,20,4 dup(10),40dw 40,20,20,40,40,100mus_freq5 dw 330,392,440,330,392,294dw 330,392,440,52
39、3,440,392,220,262,330,294dw 294,330,392,294,330,294,220,220dw 220,262,294,330,294,247,220,262,196dw 294,330,294,247,220,196,262dw523,523,440,523,440,523,440,392dw392,330,440,392,262,294,262,292,330dw330,330,294,330dw523,523,494,440dw 330,330,294,330,523,494,440,330,392dw 0mus_time5 dw 2 dup(12,12,75
40、),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),75dw 37,12,12,12,12,12,50dw 12,12,12,50,12,12,12,75dw 12,12,37,12,25,6,6,12,50,12,12,12,50,12,12,12,75dw 12,12,37,12,12,12,12,12,75 data ends; 代碼段code segmentassume ds:data,cs:code main proc far; 主程序call init;調(diào)用初始化程序new
41、_scan:call scan_key ;掃描所按下的鍵cmp song,100;判斷是否按下了自動(dòng)播放的歌曲鍵jehand_play ;若不是,手動(dòng)播放call play_song ;若是,則播放音樂(lè)jmp new_scan;演奏結(jié)束,重新掃描有無(wú)鍵按下hand_play:cmp keynum,100;判斷是否手動(dòng)演奏jznew_scan ;若不是,重新掃描有無(wú)鍵按下;若是,進(jìn)行按鍵處理push bx;若為手動(dòng),則進(jìn)行鍵盤(pán)清理mov bx,keynumcall key_down ;調(diào)用顯示按下程序pop bxcall load_audio ;判斷高低音、 c/d 調(diào),并裝入對(duì)應(yīng)頻率段地址到b
42、x中push simov si,keynum mov di,bx+sicall gen_hand ;發(fā)聲pop si push bxmov bx,keynum;在屏幕上顯示彈起狀態(tài)call key_up pop bxjmp new_scan ;重新掃描有無(wú)鍵按下,直到按下esc鍵main endpgen_hand proc ne手ar動(dòng); 演奏發(fā)聲程序;in : dipush 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í)器送初
43、值mov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計(jì)數(shù)初值mov ax,348ch ;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時(shí)器送處值in al,61h ;開(kāi)揚(yáng)聲器mov al,ah;給定時(shí)器 2 寫(xiě)入 ax中存放的計(jì)數(shù)初值out 42h,alin al,61hmov ah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫(xiě)入ahor al,3 out 61h,alwait1:call waitf ;調(diào)用延時(shí)程序inal,60h;讀取鍵盤(pán)掃描碼,按下和放開(kāi)都有相應(yīng)的
44、掃描碼,放開(kāi)碼=按下碼+80h>80htest al,80h ;查詢鍵是否放開(kāi)jz wait1;未放開(kāi)繼續(xù)查詢, al不等于 80h則繼續(xù)延時(shí)mov al,ah ;恢復(fù) 8255 端口 61h的狀態(tài)(即按鍵放開(kāi)) ,關(guān)揚(yáng)聲器out61h,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 axretgen_hand endpgen_auto proc near; 自動(dòng)播放發(fā)聲程序push ax push bx push cx push dx push di;定時(shí)器初始化程序mov al,0b6
45、h;定時(shí)器的初始化,選擇計(jì)數(shù)器2,工作在方式 3 out 43h,almov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計(jì)數(shù)初值mov ax,348ch;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時(shí)器送初值in al,61h;開(kāi)揚(yáng)聲器mov al,ah;給定時(shí)器 2 寫(xiě)入 ax中存放的計(jì)數(shù)初值out 42h,al;定時(shí)器送初值in al,61h;開(kāi)揚(yáng)聲器mov ah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫(xiě)入ahor al,3 out 61h,alwait2:c
46、all waitf;調(diào)用延時(shí)程序dec bx;bx存放節(jié)拍值jnz wait2;判斷是否播放完畢mov al,ah;完畢則關(guān)閉揚(yáng)聲器out 61h,alpop di;恢復(fù)寄存器狀態(tài)pop dx pop cx pop bx pop ax retgen_auto endpwaitf proc near; 延時(shí)程序push axmov cx,delay_time waitf1:in al,61hand al,10h ;檢查 pb4口cmp al,ah;判斷 al變化否je waitf1;沒(méi)有變化則等待al 變化mov ah,al ;保存 pb4的新?tīng)顟B(tài) (al 中)loop waitf1;cx-1不
47、為 0 就回到 waitf1 pop ax;ax出棧ret waitf endppiano_drawproc near; 繪制琴鍵lea si,st_lx ;取白色琴鍵起始點(diǎn)有效地址 lea di,ed_lx ;取白色琴鍵結(jié)束點(diǎn)有效地址mov cx,21 ;白色琴鍵數(shù)目 21next_draw:draw si,st_y,di,ed_y,0fh;調(diào)用宏定義畫(huà)白鍵draw si,90,di,93,07h ;陰影add si,2;下一個(gè)鍵add di,2loop next_draw ;cx-1 不為 0 繼續(xù)畫(huà)lea si,bt_x; 取黑色琴鍵起始點(diǎn)的有效地址lea di,bd_x; 取黑色琴鍵結(jié)
48、束點(diǎn)的有效地址mov cx,15; 黑色琴鍵 15 個(gè)next_block:draw si,bt_y,di,bd_y,00h;調(diào)用宏定義畫(huà)黑色琴鍵add si,2;下一個(gè)鍵add di,2loop next_block;cx-1不為 0 繼續(xù)畫(huà)黑鍵retpiano_draw endpkey_down proc near; 鍵按下時(shí),在屏幕上顯示push si push dicall load;載入所按下鍵在屏幕上的位置draw si+bx,90,di+bx,92,0fh;調(diào)用矩形繪制宏, bx 為案件標(biāo)號(hào)緩存值draw si+bx,92,di+bx,94,07h pop dipop si re
49、tkey_down endpkey_up proc near; 鍵彈起時(shí),恢復(fù)正常狀態(tài)push si push dicall load ;載入所彈起鍵在屏幕上的位置draw si+bx,90,di+bx,93,07h;恢復(fù)陰影draw si+bx,93,di+bx,94,05h;恢復(fù)背景色pop dipop si retkey_up endpload proc near; 載入鍵在屏幕上的位置cmp keyflag,00h判; 斷是否是低音鍵 jnz load_hgh; 繼續(xù)判斷l(xiāng)ea si,st_lx; 載入低音鍵起始坐標(biāo)首地址lea di,ed_lx; 載入低音鍵結(jié)束坐標(biāo)首地址jmp lo
50、ad_end; 載入結(jié)束load_hgh:cmp keyflag,02h;判斷是否是高音鍵jnz load_mid;繼續(xù)判斷l(xiāng)ea 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:retload endpscan_key proc near; 檢查按鍵狀態(tài),并存入對(duì)應(yīng)的變量和寄存器mov si,100 mov di,100mov keynum,100 ;賦初值mov ah,0;讀鍵盤(pán)i
51、nt 16hmov dl,ahcall scan_song; 判斷是否是自動(dòng)播放鍵(大鍵盤(pán)數(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;讀鍵盤(pán)狀態(tài)字節(jié)int 16hmov dh,al ;判斷是否是右 shift鍵and dh,02h cmp dh,02hje slow ;是則進(jìn)行低音處理mov dh,al ;不是判斷是否是左shift鍵an
52、d dh,01h cmp dh,01hje shgh ;是則進(jìn)行高音處理jmp smid;都不是進(jìn)行中音處理slow:;低音處理mov audio,1 mov keyflag,0jmp key_1;跳轉(zhuǎn)到音鍵處理shgh:;高音處理mov audio,3 mov keyflag,2jmp key_1;跳轉(zhuǎn)到音鍵處理smid :;中音處理mov audio,2mov keyflag,1 key_1:cmp dl,1eh ;是否是 ajne key_2;繼續(xù)判斷mov keynum,0 ;不是則保存標(biāo)志jmp scan_end ;鍵掃描結(jié)束key_2:cmp dl,1fh;是否是 s jne ke
53、y_3mov keynum,2 jmp scan_endkey_3:cmp dl,20h ;是否是 d jne key_4mov keynum,4 jmp scan_endkey_4:cmp dl,21h ;是否是 f jne key_5mov keynum,6 jmp scan_endkey_5:cmp dl,22h;是否是 g jne key_6mov keynum,8 jmp scan_endkey_6:cmp dl,23h ;是否是 h jne key_7mov keynum,10 jmp scan_endkey_7:cmp dl,24h ;是否是 j jne scan_endmov keynum,12 scan_end:ret scan_key endpscan_song proc near; 判斷是否是自動(dòng)播放鍵(鍵15),并保存標(biāo)志變量 (song);in: ah鍵掃描碼push
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個(gè)人簽訂合同委托(2篇)
- 2025年個(gè)人門(mén)面房屋租賃合同經(jīng)典版(三篇)
- 2025年產(chǎn)品維護(hù)服務(wù)合同機(jī)器或程序(2篇)
- 2025年個(gè)人車(chē)位出租協(xié)議經(jīng)典版(三篇)
- 2025年個(gè)體合伙經(jīng)營(yíng)協(xié)議經(jīng)典版(三篇)
- 2025年產(chǎn)品委托銷(xiāo)售合同常用版(五篇)
- 2025年人防車(chē)位轉(zhuǎn)讓協(xié)議(4篇)
- 2025年二手房全款購(gòu)房合同(2篇)
- 2025年企業(yè)倉(cāng)儲(chǔ)合同(4篇)
- 2025年產(chǎn)品銷(xiāo)售代理協(xié)議格式范文(2篇)
- DZ∕T 0080-2010 煤炭地球物理測(cè)井規(guī)范(正式版)
- 小學(xué)生心理健康教育學(xué)情分析
- 2024年高考語(yǔ)文一輪復(fù)習(xí):文言文文意概括簡(jiǎn)答題知識(shí)清單 (二)
- 超級(jí)大腦:孩子六維能力培養(yǎng)指南
- 縱隔腫物的護(hù)理查房
- 新能源汽車(chē)概論題庫(kù)
- 設(shè)備維保的維修成本和維護(hù)費(fèi)用
- 客運(yùn)站員工安全生產(chǎn)教育培訓(xùn)
- 口腔預(yù)防兒童宣教
- 綠城桃李春風(fēng)推廣方案
- 顱腦損傷的生物標(biāo)志物
評(píng)論
0/150
提交評(píng)論