匯編夢幻鋼琴程序設計報告.(精編版)_第1頁
匯編夢幻鋼琴程序設計報告.(精編版)_第2頁
匯編夢幻鋼琴程序設計報告.(精編版)_第3頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、匯編語言程序設計綜合程序設計實驗報告題目:夢幻鋼琴一、項目簡介利用匯編語言設計一個模擬鋼琴演奏程序。在顯示器上顯示出鋼琴的鍵盤, 以計算機鍵盤的相應鍵模擬鋼琴鍵盤進行樂曲的演奏。在pc機鍵盤上按鍵,屏幕上對應的鋼琴鍵出現(xiàn)跳動,并發(fā)出相應音符的聲音,例如:按字母“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 會依次播放程序中所添加的歌曲;如果想要使該歌曲加速播放, 可以同時按住“shift”鍵和“ +”鍵;若要減速播放, 則按“ shift” 鍵和“- ”鍵。在彈奏鋼琴曲時, 直接按動“a”、“

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

3、2,193st_hx dw 204,215,226,237,248,259,270st_ydw 50;起點縱坐標ed_lx dw 60,71,82,93,104,115,126;終點縱坐標ed_mx dw 137,148,159,170,181,192,203ed_hx dw 214,225,236,247,258,269,280ed_ydw 90;終點縱坐標黑色琴鍵坐標bt_xdw 57,68,90,101,112;起點橫坐標dw 134,145,167,178,189dw 211,222,244,254,265bt_ydw 50;起點縱坐標bd_x dw 64,75,97,108,119;

4、終點橫坐標dw 141,152,174,185,196dw 218,229,251,262,273bd_ydw 70;終點縱坐標宏定義繪制填充矩形: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)用以上定義的宏來繪制琴鍵。(3) 、琴鍵繪制 piano_drawproc near(4) 、屏幕顯示字符 show_char proc n、esahrow_text proc near2、功能調(diào)試 -

5、 劉鑄輝通過調(diào)用子程序來實現(xiàn)各個功能:(1) 、手動演奏 gen_hand proc near(2) 、自動播放發(fā)聲程序gen_auto proc near(3) 、延時程序 waitf proc near(4) 、自動播放歌曲scan_song proc n、eaprlay_song proc near(5) 、c/d 調(diào)及對應的低、中、高頻率分別載入load_audio proc near(6) 、c/d 調(diào)判斷及其狀態(tài)在屏幕上的顯示scan_tune proc near;三、需求分析與設計1、鋼琴繪制。這部分主要實現(xiàn)畫鋼琴鍵盤鍵身的功能。它是由二十一個白 色的長方塊和十五個黑色的長方塊構

6、成的,要在屏幕上畫出有立體效果的長方形白色和黑色鍵盤,我們需要用bios調(diào)用編織線使程序。顯示適配器都自帶顯示服務的 bios,利用它所提供的bios調(diào)用來編寫程序,對于我們編程應用者來說是透明的,我們只需要調(diào)用顯示驅(qū)動程序int10h。鋼琴主要是由矩形、直線等規(guī)則幾何形狀構成,通過畫點、畫線等基本程序完成鋼琴的繪制。對于繪制鋼琴鍵盤,為使其有立體感,還需要先在excel表中繪制一個簡單的鋼琴鍵盤,準確對應其各個邊界的坐標。鋼琴鍵盤的動態(tài)顯示則是同步于鍵盤的按鍵有按下和彈起的動畫。這部分功能需要也可以用繪制鋼琴的方法來實現(xiàn)這個效果。繪制琴鍵: piano_drawproc near白色琴鍵:

7、lea si,st_lx ; 取白色琴鍵起始點有效地址lea di,ed_lx ;取白色琴鍵結束點有效地址mov cx,21 ;白色琴鍵數(shù)目 21next_draw:draw si,st_y,di,ed_y,0fh;調(diào)用宏定義畫白鍵draw si,90,di,93,07h ;陰影add si,2;下一個鍵add di,2loop next_draw ;cx-1不為 0 繼續(xù)畫黑色琴鍵: lea si,bt_x; 取黑色琴鍵起始點的有效地址lea di,bd_x; 取黑色琴鍵結束點的有效地址mov cx,15; 黑 色 琴 鍵 15 個next_block:draw si,bt_y,di,bd_

8、y,00h;調(diào)用宏定義畫黑色琴鍵add si,2;下一個鍵add di,2loop next_block;cx-1不為 0 繼續(xù)畫黑鍵2、發(fā)聲程序。該發(fā)生程序是在修改beep發(fā)聲程序的基礎上, 以實現(xiàn)為 8088/86編寫一個任意頻率和任意持續(xù)時間的通用發(fā)聲程序。該程序包括以下三個步驟:( 1)在 8253/54中的 43 端口送一個控制字0b6h(10110110b),該控制字對定時器 2 進行初始化,使得定時器2 準備接受計數(shù)初值。(2) )在 8253/54 中的 42h端口裝入一個16 位計數(shù)值,已建立將要產(chǎn)生的聲音頻率。(3) )把輸出端口 61h 的 0、1 兩位置 1,發(fā)出聲音。

9、具體實現(xiàn)如下:gen_hand proc nea手r動;in :di push ax push bx push cx push dx演奏發(fā)聲程序push di; 定時器初始化程序mov al,0b6h ;定時器初始化,;選擇計數(shù)器 2,工作在方式 3 out 43h,al;out 43h,al ;向定時器送初值mov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計數(shù)初值mov ax,348ch ;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時器送處值in al,61h ;開揚聲器mov al,ah

10、;給定時器 2 寫入 ax中存放的計數(shù)初值out 42h,alin al,61hmovah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫入ahor al,3 out 61h,alwait1:call waitf ;調(diào)用延時程序in al,60h;讀取鍵盤掃描碼,按下和放開都有相應的掃描碼,放開碼=按下碼+80h>80htest al,80h ;查詢鍵是否放開jz wait1;未放開繼續(xù)查詢, al不等于 80h則繼續(xù)延時mov al,ah ;恢復 8255 端口 61h的狀態(tài)(即按鍵放開) ,關揚聲器out 61h,al;通過監(jiān)控端口 61h 的 pb4固定不

11、變的觸發(fā)時間來產(chǎn)生延遲時間pop di;恢復寄存器狀態(tài)pop dx pop cx pop bx pop axret gen_hand endp3、延時程序。 80x86 的各種處理器采取了666mhz的工作頻率, loop 指令的執(zhí)行時間在這些處理器上也不相同。為了建立一個與處理器無關的延時,ibm采用了一種利用硬件產(chǎn)生時間延時的方法,即通過監(jiān)控端口61h和 pb4,使 pb4每15.08 微秒觸發(fā)一次,一產(chǎn)生一個固定不變的時間基準。在ibm pc at bios 的waitf子程序,就是一個產(chǎn)生nx15.08 微秒時間演示的程序。調(diào)用waitf子程序時, cx寄存器必須裝入15.08 微秒的

12、倍數(shù) n。利用 waitf子程序能獲得任意的時間延時,而不必在考慮cpu的型號和工作頻率。具體實現(xiàn)如下:waitf proc near; 延時程序push axmov cx,delay_time waitf1:in al,61hand al,10h ;檢查 pb4口cmp al,ah;判斷 al變化否je waitf1;沒有變化則等待al 變化mov ah,al ;保存 pb4的新狀態(tài) (al 中)loop waitf1;cx-1不為 0 就回到 waitf1 pop ax;ax出棧ret waitf endp4、音符的演奏。在pc系列機上, 8254 的三個計數(shù)器各有其作用,計數(shù)器0用于維護

13、系統(tǒng)時鐘; 計數(shù)器 1 用于周期性的向dma發(fā)送數(shù)據(jù)請求信號, 供存儲器刷新使用; 計數(shù)器 2 接到揚聲器用來產(chǎn)生聲音。 各計數(shù)器的輸入時鐘脈沖頻率均為 1.19318mhz。通過設置計數(shù)值可以產(chǎn)生各種頻率的聲音。與此同時,許多輸入輸出操作都是由8255a 可編程外設接口來控制的。利用cpu支持的外圍電路8254 與 8255,通過匯編程序改變8255 的 pb0, pb1口,接通揚聲器,使得計算機能夠發(fā)出一定頻率的聲音, 同時通過 8254 的與 8255 連接的 2 號計數(shù)器控制指定頻率,從而達到控制揚聲器的音調(diào)的效果。具體實現(xiàn)如下:gen_hand proc nea手r動;in : di

14、push ax push bx push cx push dx push di; 定時器初始化程序演奏發(fā)聲程序mov al,0b6h ;定時器初始化,;選擇計數(shù)器 2,工作在方式 3 out 43h,al;out 43h,al ;向定時器送初值mov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計數(shù)初值mov ax,348ch ;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時器送處值in al,61h ;開揚聲器mov al,ah;給定時器 2 寫入 ax中存放的計數(shù)初值out 42h,al in

15、 al,61hmovah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫入ahor al,3out 61h,al wait1:call waitf ;調(diào)用延時程序inal,60h;讀取鍵盤掃描碼,按下和放開都有相應的掃描碼,放開碼=按下碼+80h>80htest al,80h ;查詢鍵是否放開jz wait1;未放開繼續(xù)查詢, al不等于 80h則繼續(xù)延時mov al,ah ;恢復 8255 端口 61h的狀態(tài)(即按鍵放開) ,關揚聲器out61h,al; 通過監(jiān)控端口 61h的 pb4固定不變的觸發(fā)時間來產(chǎn)生延遲時間pop di;恢復寄存器狀態(tài)pop dx p

16、op cx pop bx pop ax retgen_hand endp5、自動播放歌曲。(1) 、為所要播放的樂曲的定義一個頻率表和節(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) 、分表將兩個表的偏移地址放入si和bp中l(wèi)ea bp,mus_time2lea si,mus_freq2(3) 、從表中讀出的音符頻率放入di 中,取出音符的持續(xù)時間(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)進行轉(zhuǎn)換,先判斷當前音符為哪種調(diào),若為c 調(diào),則進行跳轉(zhuǎn),跳轉(zhuǎn)的過程中開 d燈,關c燈;反之同原理。調(diào)用的是 scan_tune 子程序。scan_tune proc near;c/d 調(diào)判斷及其狀態(tài)在屏幕上的顯示;in:dl鍵盤掃描碼;out:tunecmp dl,

19、2eh ;判斷是 c否jnz next_d ;不是則判斷是 d否mov tune,'c'draw 55,38,60,41,0eh;關d燈draw 65,38,70,41,0ah ;開 c 燈 jmp tune_end;結束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;關c燈tune_end:retscan_tune endp四、代碼及分析; 宏定義draw macro start_x,start_y,end_x,end_y,

20、color local draw_next;local:避免宏重復調(diào)用時,標號的重復; 功能:畫填充的矩形; 使用條件: start_x < end_x ,start_y < end_y push axpush bx push cx push dxmov ah,0ch;寫像素點, 12 號功能,寫圖形像素mov al,color mov bh,0mov cx,start_x;設置顏色,像素值選用頁號 0列起始點mov dx,start_y;行起始點draw_next:int 10h;畫點inc cxcmp cx,end_x;開始畫橫線比較行是否畫完jne draw_next;畫另一

21、行mov cx, start_x;另一行的起始點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 simov ah,0chmov al,color mov bh,0號 0mov cx,start_xmov

22、 dx,start_y;寫像素點設置顏色選用頁列起始點行起始點row_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;右邊起始點

23、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 ?;存儲起始行text db 13;起始行db 4;起始列db 0ahdb'*thisispiano*',0ffh,'* welcome!haveagoodtime!*',0ffh;字體顏色,設置顏色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;白色琴鍵坐標st_lx dw 50,61,72,83,94,105,116 ;起點橫坐標st_mx dw 127,138,149,160,171,182,193st_hx dw 204,215,226,237,248,259,

26、270st_ydw 50;起點縱坐標ed_lx dw 60,71,82,93,104,115,126;終點縱坐標ed_mx dw 137,148,159,170,181,192,203ed_hx dw 214,225,236,247,258,269,280ed_ydw 90;終點縱坐標;黑色琴鍵坐標bt_xdw 57,68,90,101,112;起點橫坐標dw 134,145,167,178,189dw 211,222,244,254,265bt_ydw 50;起點縱坐標bd_x dw 64,75,97,108,119;終點橫坐標dw 141,152,174,185,196dw 218,229

27、,251,262,273bd_ydw 70;終點縱坐標; 音樂頻率值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;標記低( 0)、中( 1)、高( 2 )音鍵 keynum dw 1;存儲 17, 按鍵編號緩存,提取對應的按鍵位置delay_time dw 7000 ;延時緩存,用于播放時存如bx計數(shù)song d

28、w 100 ;保存所選的自動演奏的曲目tune dw 1;標記 c 調(diào)或 d 調(diào), 按鍵狀態(tài)緩存audio dw 1;標記低音 1 ,中音2 ,高音3; 自動演奏的歌曲頻率和延時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;判斷是否按下了自動播放的歌曲鍵jehand_play ;若不是,手動播放call play_song ;若是,則播放音樂jmp new_scan;演奏結束,重新掃描有無鍵按下hand_play:cmp keynum,100;判斷是否手動演奏jznew_scan ;若不是,重新掃描有無鍵按下;若是,進行按鍵處理push bx;若為手動,則進行鍵盤清理mov bx,keynumcall key_down ;調(diào)用顯示按下程序pop bxcall load_audio ;判斷高低音、 c/d 調(diào),并裝入對應頻率段地址到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 ;重新掃描有無鍵按下,直到按下esc鍵main endpgen_hand proc ne手ar動; 演奏發(fā)聲程序;in : dipush ax push bx push cx push dx push di; 定時器初始化程序mov al,0b6h ;定時器初始化,;選擇計數(shù)器 2,工作在方式 3 out 43h,al;out 43h,al ;向定時器送初

43、值mov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計數(shù)初值mov ax,348ch ;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時器送處值in al,61h ;開揚聲器mov al,ah;給定時器 2 寫入 ax中存放的計數(shù)初值out 42h,alin al,61hmov ah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫入ahor al,3 out 61h,alwait1:call waitf ;調(diào)用延時程序inal,60h;讀取鍵盤掃描碼,按下和放開都有相應的

44、掃描碼,放開碼=按下碼+80h>80htest al,80h ;查詢鍵是否放開jz wait1;未放開繼續(xù)查詢, al不等于 80h則繼續(xù)延時mov al,ah ;恢復 8255 端口 61h的狀態(tài)(即按鍵放開) ,關揚聲器out61h,al; 通過監(jiān)控端口 61h的 pb4固定不變的觸發(fā)時間來產(chǎn)生延遲時間pop di;恢復寄存器狀態(tài)pop dx pop cx pop bx pop axretgen_hand endpgen_auto proc near; 自動播放發(fā)聲程序push ax push bx push cx push dx push di;定時器初始化程序mov al,0b6

45、h;定時器的初始化,選擇計數(shù)器2,工作在方式 3 out 43h,almov dx,12h ;1.1931mhz/給定的頻率 =12348h/給定頻率 =計數(shù)初值mov ax,348ch;12348h存入 dx:ax中,商存 ax,余數(shù)存 dxdiv di;di為給定的頻率out 42h,al;定時器送初值in al,61h;開揚聲器mov al,ah;給定時器 2 寫入 ax中存放的計數(shù)初值out 42h,al;定時器送初值in al,61h;開揚聲器mov ah,al;把 8255 輸出端的 61h的 0、1 位置 1,并把端口狀態(tài)寫入ahor al,3 out 61h,alwait2:c

46、all waitf;調(diào)用延時程序dec bx;bx存放節(jié)拍值jnz wait2;判斷是否播放完畢mov al,ah;完畢則關閉揚聲器out 61h,alpop di;恢復寄存器狀態(tài)pop dx pop cx pop bx pop ax retgen_auto endpwaitf proc near; 延時程序push axmov cx,delay_time waitf1:in al,61hand al,10h ;檢查 pb4口cmp al,ah;判斷 al變化否je waitf1;沒有變化則等待al 變化mov ah,al ;保存 pb4的新狀態(tài) (al 中)loop waitf1;cx-1不

47、為 0 就回到 waitf1 pop ax;ax出棧ret waitf endppiano_drawproc near; 繪制琴鍵lea si,st_lx ;取白色琴鍵起始點有效地址 lea di,ed_lx ;取白色琴鍵結束點有效地址mov cx,21 ;白色琴鍵數(shù)目 21next_draw:draw si,st_y,di,ed_y,0fh;調(diào)用宏定義畫白鍵draw si,90,di,93,07h ;陰影add si,2;下一個鍵add di,2loop next_draw ;cx-1 不為 0 繼續(xù)畫lea si,bt_x; 取黑色琴鍵起始點的有效地址lea di,bd_x; 取黑色琴鍵結

48、束點的有效地址mov cx,15; 黑色琴鍵 15 個next_block:draw si,bt_y,di,bd_y,00h;調(diào)用宏定義畫黑色琴鍵add si,2;下一個鍵add di,2loop next_block;cx-1不為 0 繼續(xù)畫黑鍵retpiano_draw endpkey_down proc near; 鍵按下時,在屏幕上顯示push si push dicall load;載入所按下鍵在屏幕上的位置draw si+bx,90,di+bx,92,0fh;調(diào)用矩形繪制宏, bx 為案件標號緩存值draw si+bx,92,di+bx,94,07h pop dipop si re

49、tkey_down endpkey_up proc near; 鍵彈起時,恢復正常狀態(tài)push si push dicall load ;載入所彈起鍵在屏幕上的位置draw si+bx,90,di+bx,93,07h;恢復陰影draw si+bx,93,di+bx,94,05h;恢復背景色pop dipop si retkey_up endpload proc near; 載入鍵在屏幕上的位置cmp keyflag,00h判; 斷是否是低音鍵 jnz load_hgh; 繼續(xù)判斷l(xiāng)ea si,st_lx; 載入低音鍵起始坐標首地址lea di,ed_lx; 載入低音鍵結束坐標首地址jmp lo

50、ad_end; 載入結束load_hgh:cmp keyflag,02h;判斷是否是高音鍵jnz load_mid;繼續(xù)判斷l(xiāng)ea si,st_hx ;載入高音鍵起始坐標首地址lea di,ed_hx;載入高音鍵結束坐標首地址jmp load_end;結束load_mid:lea si,st_mx;載入中音鍵起始坐標首地址lea di,ed_mx;載入中音鍵結束坐標首地址load_end:retload endpscan_key proc near; 檢查按鍵狀態(tài),并存入對應的變量和寄存器mov si,100 mov di,100mov keynum,100 ;賦初值mov ah,0;讀鍵盤i

51、nt 16hmov dl,ahcall scan_song; 判斷是否是自動播放鍵(大鍵盤數(shù)字鍵15) call scan_tune ;判斷是否是 c/d 調(diào)選擇鍵call freq_change ; 判斷是否按下頻率改變鍵: (+/-符號)cmp ah,01h ;是否是結束鍵jne flag_scan;若不是繼續(xù)檢測call exit ;若是則退出flag_scan:mov ah,02h;讀鍵盤狀態(tài)字節(jié)int 16hmov dh,al ;判斷是否是右 shift鍵and dh,02h cmp dh,02hje slow ;是則進行低音處理mov dh,al ;不是判斷是否是左shift鍵an

52、d dh,01h cmp dh,01hje shgh ;是則進行高音處理jmp smid;都不是進行中音處理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 ;不是則保存標志jmp scan_end ;鍵掃描結束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; 判斷是否是自動播放鍵(鍵15),并保存標志變量 (song);in: ah鍵掃描碼push

溫馨提示

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

評論

0/150

提交評論