電子鋼琴匯編專業(yè)課程設(shè)計_第1頁
電子鋼琴匯編專業(yè)課程設(shè)計_第2頁
電子鋼琴匯編專業(yè)課程設(shè)計_第3頁
電子鋼琴匯編專業(yè)課程設(shè)計_第4頁
電子鋼琴匯編專業(yè)課程設(shè)計_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、電腦鋼琴系統(tǒng)電腦鋼琴系統(tǒng) 匯編語言程序設(shè)計匯編語言程序設(shè)計 一、課題內(nèi)容和要求課題內(nèi)容和要求 題目描述:題目描述:利用匯編語言設(shè)計一個模擬鋼琴演奏程序。在顯示器上顯示出鋼琴 的鍵盤,以計算機鍵盤的相應(yīng)鍵模擬鋼琴鍵盤進行樂曲的演奏。在 PC 機鍵盤上 按鍵,屏幕上對應(yīng)的鋼琴鍵出現(xiàn)跳動,并發(fā)出相應(yīng)音符的聲音,例如: 按數(shù)字 “1” , 發(fā) C 大調(diào) do 按數(shù)字 “2” , 發(fā) C 大調(diào) re 按數(shù)字 “3” , 發(fā) C 大調(diào) me 按空格(其它)鍵,退出。 基本要求基本要求:(1)設(shè)計一個基本的只有 7 鍵的模擬鋼琴鍵盤; (2)按鍵時,對應(yīng)的鋼琴鍵有反映,并發(fā)出相應(yīng)頻率的音符聲; (3)松鍵時

2、,對應(yīng)的鋼琴鍵恢復(fù)原狀; (4)實物演示時要求講出程序原理和設(shè)計思想; (5)程序運行良好、界面清晰。 提高要求提高要求: (1)繪制出三維立體鋼琴鍵,隨著按鍵,對應(yīng)鋼琴鍵有向下的動 作; (2)鋼琴聲隨著琴鍵按下時間的長短持續(xù)發(fā)出不同長短的聲音; (3)擴展鋼琴的音域。 二、需求和思路分析二、需求和思路分析 (1)鋼琴的繪制。這部分主要實現(xiàn)畫鋼琴鍵盤鍵身的功能。它是由一個個 白色的長方塊構(gòu)成的,要在屏幕上畫出有立體效果的長方形白色鍵盤,我們需 要用 BIOS 調(diào)用編織線使程序。顯示適配器都自帶顯示服務(wù)的 BIOS,利用它所 提供的 BIOS 調(diào)用來編寫程序,對于我們編程應(yīng)用者來說是透明的,我

3、們只需要 調(diào)用顯示驅(qū)動程序 INT 10H。鋼琴主要是由矩形、直線等規(guī)則幾何形狀構(gòu)成, 可以采用文本方式,也將屏幕設(shè)置成圖形顯示方式,通過畫點、畫線等基本程 序完成鋼琴的繪制。 對于繪制鋼琴鍵盤,為使其有立體感,還需要先在稿紙上畫出一個縮小版 的鋼琴鍵盤,準確計算其各個邊界的坐標,包括為使其有立體感而要畫出斜線 的方法,都需要事先準確推出運算公式。 鋼琴鍵盤的動態(tài)顯示則是同步于鍵盤的按鍵有按下和彈起的動畫。這部分 功能需要也可以用繪制鋼琴的方法來實現(xiàn)這個效果。 (2)音符的演奏。在 PC 系列機上,8254 的三個計數(shù)器各有其作用,計數(shù) 器 0 用于維護系統(tǒng)時鐘;計數(shù)器 1 用于周期性的向 D

4、MA 發(fā)送數(shù)據(jù)請求信號,供 存儲器刷新使用;計數(shù)器 2 接到揚聲器用來產(chǎn)生聲音。各計數(shù)器的輸入時鐘脈 沖頻率均為 1.19318MHz。通過設(shè)置計數(shù)值可以產(chǎn)生各種頻率的聲音。與此同時, 許多輸入輸出操作都是由 8255A 可編程外設(shè)接口來控制的。利用 CPU 支持的外 圍電路 8254 與 8255,通過匯編程序改變 8255 的 PB0,PB1 口,接通揚聲器, 使得計算機能夠發(fā)出一定頻率的聲音,同時通過 8254 的與 8255 連接的 2 號計 數(shù)器控制指定頻率,從而達到控制揚聲器的音調(diào)的效果。 三、概要設(shè)計三、概要設(shè)計 繪制鋼琴鍵盤的流程圖: Flow Direction BL 0 Y

5、ES - DI+80 CX+20BL+1 BL7 DX-1 DX NO 在繪制鍵盤的程序中,基本的就是調(diào)用 INT 10H,重要的是鍵盤坐標的設(shè) 計,以及各個顏色的設(shè)定,以實現(xiàn)立體效果。由于要畫斜著的鍵盤鍵身,而匯 編程序本身只有畫點的功能,所以我們就要設(shè)計一個循環(huán)來實現(xiàn)鍵盤的繪制。 對每個坐標點(CX,DX)進行畫點,DX 不變,CX 每畫完一個就自增,在規(guī)定界限 內(nèi)實現(xiàn)一整行的繪制,而在 DX 自減 1,CX 不變則對上一行的點進行繪制。循環(huán) 便能進行整個鍵盤豎直部分的繪制。 斜線部分則需要一些巧妙的設(shè)計,因為設(shè)置 DI 為右邊界,而每個點的橫坐 標 CX 的起始位置始終是 DI 減去鍵盤

6、鍵身寬度,如果要畫斜線則 DI、CX 在畫第 一個鍵盤的時候就應(yīng)該比豎直部分少 1,根據(jù)這樣的特征,可以先設(shè)置一個拐 點處的縱坐標值 450,高于這個值時,畫豎直部分;低于這個值時畫斜線部分。 發(fā)聲部分的原理設(shè)計是利用可編程定時/計數(shù)器 8254 在揚聲器中的應(yīng)用而 完成的。揚聲器驅(qū)動系統(tǒng)的硬件組成如下圖所示。利用 8254 驅(qū)動揚聲器發(fā)聲是 由系統(tǒng)插件上 8255 的外圍電路來發(fā)出驅(qū)動信號的。如下圖中的 spk data 和 tim gatespk 就是接在 8255 的輸出端口上。其中 tim gatespk 控制 8254 定時 器來驅(qū)動揚聲器,spk data 來控制揚聲器的門電路。直

7、接由門電路驅(qū)動發(fā)出的 聲音比較難聽,通過濾波器濾掉雜波之后會更動聽一些,所以最好如下圖所示 加一個濾波器。 8255A 由一個控制寄存器,三個輸入輸出數(shù)據(jù)寄存器。輸入輸出寄存器又 稱為輸入/輸出端口。這三個端口的名字分別稱為 A 口、B 口和 C 口。一般編址 為 60H,61H 和 62H。在系統(tǒng)初始化的時候已經(jīng)將 A 口和 C 口設(shè)為輸入方式,B 口 設(shè)為輸出方式。 可以通過對 8254 計數(shù)器編程使產(chǎn)生某一頻率的方波,輸出經(jīng)過驅(qū)動器驅(qū)動, 推動揚聲器發(fā)出聲音。 發(fā)聲部分的流程圖: 8254 8255A NO ASCII -30 AL AL N 鍵盤按下有聲音且要保持聲音隨按鍵的長短而不同

8、,需要監(jiān)視 8255 狀態(tài)端 口,在沒有丟開鍵時,揚聲器不會關(guān)閉而會一直發(fā)聲。 在鍵盤 17 按下的同時要屏幕鍵盤要有顯示,則需要調(diào)用 DOWN 子程序,來 實現(xiàn)琴鍵按下的動態(tài)效果。因為在揚聲器沒有關(guān)閉時,不會調(diào)用 UP 子程序,所 以琴鍵也會隨按鍵的長短而停留住,使按鍵的動態(tài)效果更加合理。 DOWN、UP 子程序原理和繪制鋼琴鍵盤部分一樣,在這里就不再累述。 四、詳細設(shè)計四、詳細設(shè)計 詳細源代碼及注釋: DATA SEGMENT DAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252 ;各音階發(fā)聲的對應(yīng)的不同頻 率值 LEN DB 0, 6, 14, 2

9、2, 30, 38, 46, 54, 62 ;屏幕所畫鍵盤的每個鍵身的 右邊界值 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,0 ; 設(shè)置屏幕顯示圖形方式:每屏幕 字符數(shù)8025, 16色 MOV AL,12H INT 10H ; 調(diào)用10H的0號功能中斷 MOV AH,6 ; 窗口上滾功能調(diào)用 MOV AL,0 ; 設(shè)置顏色為黑色 MOV CH,0 MOV CL,0 MOV DH,18H MOV DL,4FH ;窗口坐標 INT 10H ;執(zhí)行中斷 MOV SI,360

10、;鍵盤鍵身的最上面坐標 MOV DX,480 ;鍵盤鍵身的最下面坐標 MOV DI,540 ;鍵盤鍵身的右邊界初始值 MOV CX,540 ;畫鍵盤鍵身的初始橫坐標 REDRAW: SUB DX,1 ;畫完一行的鍵盤后畫另一行 CMP DX,445 ;為起到三維效果而產(chǎn)生斜線的 臨界坐標 ,比較 JA ZHI ;大于445就處在豎直的鍵盤處, 跳轉(zhuǎn)到畫豎直部分代碼處 CMP DX,SI ;與鍵盤鍵身的最上邊界比較 JB LL ;低于此坐標說明整個鍵盤繪畫完 畢,跳轉(zhuǎn)至發(fā)聲程序代碼處 XIE: ;低于臨界坐標時要進行畫斜線部 分的坐標處理 SUB DI,479 ;右邊界和寫點橫坐標都減去固定 值

11、再減去1 SUB CX,539 ;右邊界和寫點橫坐標都減去固 定值再減去1 JMP HH ;跳轉(zhuǎn)至寫點的代碼部分 ZHI: ;高于臨界坐標時任然要進行畫豎 直部分的坐標處理 SUB DI,480 ;右邊界和寫點橫坐標都減去固定 值 SUB CX,540 ;右邊界和寫點橫坐標都減去固 定值 HH: MOV BL,0 ;對每個鍵盤鍵身的一行進行計 數(shù), PAINT: MOV AL,15 ;畫白色鍵身 MOV AH,0CH MOV BH,0 ;在第0號顯示頁寫點 INT 10H ;10號中斷的0C號功能實 現(xiàn)寫點 INC CX ;寫完一個點后縱坐標不 變,橫坐標加一繼續(xù)寫點 CMP CX,DI JB

12、E PAINT ;在沒有超過右邊界 的時候按橫坐標加一繼續(xù)寫點 ADD DI,80 ;超過右邊界后則對右 邊界和橫坐標進行處理 ADD CX,20 INC BL ;在這種情況下說明一個鍵 盤鍵身的一行畫完了,在縱坐標不變的情況下畫下一個鍵盤鍵身的一行 CMP BL,6 ;設(shè)定鍵盤數(shù)目 JBE PAINT JMP REDRAW LL: MOV AL,80H ;對8255進行初始化工 作,A口、B口均為輸出狀態(tài)工作與方式0 OUT 63H,AL ;寫入控制端口 MOV AL,0B7H ;對計數(shù)器8254進行初始化 工作,選2號計數(shù)器,且先讀寫低8位后高8位,工作與模式3 OUT 43H,AL ;寫

13、入控制端口 PP: MOV AH,01H ;調(diào)用鍵盤中斷等待 鍵盤輸入,并將鍵盤輸入對應(yīng)的ASCII碼值做出口參數(shù)存入AL INT 16H JZ PP ;沒有鍵盤輸入循環(huán)等待 SUB AL,30H ;將對應(yīng)的ASCII碼值減 去30留下個位數(shù)值,以便取表中對應(yīng)的邊界值和發(fā)聲頻率值 CMP AL,08H ;AL中的參數(shù)將傳遞到 SOUND子程序去,此處還有按鍵范圍的作用,按鍵不是17將溢出跳出 JAE OVER1 CALL SOUND ;調(diào)用發(fā)聲程序子程序 JMP PP ;一個按鍵的發(fā)聲結(jié)束, 等下一個鍵盤輸入 OVER1:JMP OVER ;溢出 SOUND PROC NEAR ;發(fā)聲子程序

14、PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI ;保護變量,以便在此 子程序中用到變量時不至改變原值影響下面操作 MOV AH,0 ;使SI中的值就是鍵 盤參數(shù)的十進制值 MOV SI,AX ; 保護AL于SI中,以 待后用,作為參數(shù)傳遞 MOV BX,OFFSET DAT XLAT ;差頻率值表中的值,并 賦給AL MOV DI,AX ;設(shè)置發(fā)聲頻率 值的對應(yīng)鍵盤所要頻率 MOV DX,12H MOV AX,34DCH ; PC機內(nèi)置計 數(shù)器的輸入時鐘脈沖頻率的16進制值1234DC DIV DI ;出后得到8254計 數(shù)初值 OUT 42H,AL ;先寫低8

15、位 MOV AL,AH OUT 42H,AL ;后寫高8位 IN AL,61H ;讀PB口當前狀態(tài) OR AL,3 ; 使PB0、PB1均 為1 OUT 61H,AL ;接通揚聲器,此 時喇叭將在計數(shù)器輸出的頻率工作發(fā)聲,且CPU得以解放可執(zhí)行下面的繪圖工作 CALL DOWN ;調(diào)用使鍵盤 產(chǎn)生向下按的效果的子程序 WAIT1: IN AL,60H ;查看8255狀態(tài)端 口 TEST AL,80H ;查詢鍵是否放開 這樣鍵不松開就會一直出聲 JZ WAIT1 ;未放開繼續(xù)查詢 CALL UP ;調(diào)用使鍵盤產(chǎn) 生向上跳起效子程序 MOV AL,0 ;關(guān)閉揚聲器 OUT 61H,AL MOV A

16、L,0H MOV AH,0CH INT 21H POP SI ;還原變量 POP DX POP CX POP BX POP AX RET SOUND ENDP DOWN PROC NEAR ;鍵 盤按下子程序 PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AX,SI ;將上面做參 數(shù)保存起來的SI傳遞到此運用 MOV BH,AL ;BH中表示 按得是什么鍵, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查邊界值表 得到鍵盤鍵身的右邊界值,并將結(jié)果賦給AL POP BX ;BH中表示按 得是什么鍵, PUSH BX

17、;將取出的右 邊界值作*10處理 MOV BX,10 MUL BX POP BX MOV SI,AX ;SI中為橫坐 標的邊界 MOV DX,450 ;鍵盤豎直部 分要實現(xiàn)按下效果的起始縱坐標 MOV DI,475 ;鍵盤豎直部 分實現(xiàn)按下效果的臨界值 GO: PUSH SI SUB SI,60 ;邊界減去鍵 盤鍵身的寬度得到寫點的起始橫坐標CX MOV CX,SI POP SI CA: MOV AL,0 ;對得到的 (CX,DX)點進行寫黑色實現(xiàn)擦除效果 MOV AH,0CH MOV BH,0 INT 10H INC CX ;某鍵盤鍵身 的某行的一個個橫坐標點 CMP CX,SI ; 畫好一

18、行 沒有? JBE CA INC DX ;一行畫好后 畫另一行 CMP DX,DI JBE GO POP DI POP DX POP CX POP BX POP AX RET DOWN ENDP PUSH BX ;一段延時程序, 以使鍵盤按下效果不至于太快 PUSH CX MOV BX,1000 DELAY:MOV CX,0FfFH DL10MS:LOOP DL10MS DEC BX JNZ DELAY POP CX POP BX UP PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AX,SI ;將上面做 參數(shù)保存起來的SI傳遞到此

19、運用 MOV BH,AL ;BH中表示 按得是什么鍵, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查邊界值 表得到鍵盤鍵身的右邊界值,并將結(jié)果賦給AL POP BX ;BH中表示 按得是什么鍵, PUSH BX MOV BX,10 ;將取出的 右邊界值作*10處理 MUL BX POP BX MOV DX,475 ;鍵盤豎直部 分要實現(xiàn)彈起效果的起始縱坐標 MOV DI,450 ;鍵盤豎直部 分要實現(xiàn)彈起效果的臨界縱坐標 OK: PUSH SI SUB SI,59 ;邊界減去鍵 盤鍵身的寬度得到寫點的起始橫坐標CX MOV CX,SI POP SI SB

20、: MOV AL,15 ;對得到的 (CX,DX)點進行寫白色實現(xiàn)彈起效果 MOV AH,0CH MOV BH,0 INT 10H INC CX ;某鍵盤鍵身 的某行的一個個橫坐標點 CMP CX,SI ; 畫好一行 沒有? JBE SB DEC DX ;一行畫好后 畫另一行 CMP DX,DI JAE OK POP DI POP DX POP CX POP BX POP AX RET UP ENDP OVER: MOV AH,4CH INT 21H CODE ENDS END START 五、測試數(shù)據(jù)及其結(jié)果分析五、測試數(shù)據(jù)及其結(jié)果分析 測試運行結(jié)果如下: 初始鍵盤豎直部分效果如下: 此結(jié)果

21、比較合理的完成了初步設(shè)計。 實現(xiàn)簡單立體效果后繪制的鋼琴鍵盤如下所示: 當按下一個鍵時鍵盤顯示一直按下,并一直發(fā)聲,視覺效果如下所示: 這幾步實現(xiàn)設(shè)計的所需的功能要求。 六、調(diào)試過程中的問題六、調(diào)試過程中的問題 調(diào)試過程中出現(xiàn)了很多問題,比如琴鍵的坐標選取的不是很好,出現(xiàn)了不 對齊的情況。經(jīng)過再次仔細的運算,發(fā)現(xiàn)幾個坐標在運算過程中會有所偏差, 便對其做了相關(guān)的修改。 而監(jiān)視 8255 狀態(tài)端口以實現(xiàn)發(fā)聲時間的長短,則一直不是很順利。起初的 想法是是查看鍵盤緩沖區(qū)是否有值,但發(fā)現(xiàn)鍵丟開并不會自動使鍵盤緩沖區(qū)的 值去除。經(jīng)過網(wǎng)上找尋相關(guān)功能,終于理解了可以監(jiān)視 8255 狀態(tài)端口的方法來 實現(xiàn)監(jiān)視鍵盤動作。 值得改進的地方我覺得就是琴鍵餓設(shè)計,可以考慮在兩個白色琴鍵中間再 加上黑色琴鍵,這樣會更加逼真。而且琴鍵按下的時候可以改進成整個鍵身都 會按下,而不是只有豎直部分有按下的效果,不過這一想法實現(xiàn)起來應(yīng)該不是 那么容易。 七、專業(yè)課程設(shè)計總結(jié)七、專業(yè)課程設(shè)計總結(jié) 本程序的關(guān)鍵技術(shù)在于 BIOS 程序調(diào)用、輸入/輸出和鍵盤中斷的等方面的

溫馨提示

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

評論

0/150

提交評論