版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課 程 設 計</b></p><p> 學 號:xxxxxxxxxxx</p><p><b> 課程設計任務書</b></p><p> 學生姓名: xxxx 專業(yè)班級: xxxxxxx </p><p>
2、 指導教師: xxxx 工作單位: xxxxxx </p><p> 題 目: 鍵 盤 鋼 琴 匯 編 語 言 程 序 設 計 </p><p><b> 初始條件:</b></p><p> ??采用
3、16 位微處理器 8086 CPU 以及86 系列微型計算機的指令系統(tǒng); </p><p> ??軟件設計平臺為多功能微型計算機實驗軟件MFS 中的微機原理實驗集成環(huán)境MF2KP,仿真設計平臺為Proteus 軟件。 </p><p> 要求完成的主要任務: </p><p> ??設計匯編語言程序,實現(xiàn)鍵盤鋼琴功能,具體功能要求如下: </p>
4、<p> ?。?)在鍵盤上自定義若干鍵對應鋼琴鍵; </p><p> ?。?)單擊鋼琴鍵,計算機發(fā)出相應音階,發(fā)聲時間自定義;</p><p> ?。?)單擊”ESC”鍵退出程序。 </p><p> 音階與頻率的對應關系如下表所示:</p><p> ??根據(jù)功能要求繪制程序流程圖、編寫完整的匯編語言程序并上機調試: &l
5、t;/p><p> ??撰寫課程設計說明書。課程設計說明書的撰寫格式如下: </p><p> ?。?)設計說明書包括封面、任務書(指導老師提供)、正文、參考文獻(3~ 5 篇)、附錄(程序清單,要求有注釋)、成績評定表(指導老師提供)。 </p><p> (2)說明書正文包含總體方案論證(功能分析、系統(tǒng)連接圖設計或算法說明);程序流程圖設計及其說明、軟件設計關鍵
6、問題說明;程序調試說明、結果記錄及分析;課程設計收獲及心得體會。</p><p> ?。?)同一選題若為合作完成,設計說明書中需注明本人承擔的設計部分。 </p><p> 時間安排: (本次課程設計時間:2012 年1 月4 日-13 日,歷時一周半)</p><p> 指導教師簽名:
7、 年 月 日</p><p> 系主任(或責任教師)簽名: 年 月 日</p><p><b> 目 錄</b></p><p><b> 引 言1</b></p><p> 1 設計意義及要求2<
8、;/p><p> 1.1 設計意義2</p><p> 1.2 設計要求2</p><p> 2 總體方案論證3</p><p> 2.1按鍵與音調頻率值的對應3</p><p> 2.2 揚聲器的驅動分析5</p><p> 2.3 發(fā)聲時間6</p>&l
9、t;p> 3 程序設計7</p><p> 3.1 主程序設計及其流程圖7</p><p> 3.2 子程序設計及其流程圖8</p><p> 3.2.1 計算頻率值的子程序FIFRE8</p><p> 3.2.2 發(fā)聲子程序SOUND9</p><p> 3.2.3 延時子程序D
10、ELAY10</p><p> 4 結果分析11</p><p> 4.1 程序調試與改進11</p><p> 4.2 結果記錄及分析12</p><p><b> 心得與體會13</b></p><p><b> 參考文獻14</b><
11、/p><p> 附錄 程序代碼15</p><p><b> 引 言</b></p><p> 匯編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。匯編語言,作為一門語言,對應于高級語言的編譯器,需要一個“匯編器”來把匯編語言原文件匯編成機器可執(zhí)行的代碼。</p><p> 高級
12、的匯編器如MASM,TASM等等為我們寫匯編程序提供了很多類似于高級語言的特征,比如結構化、抽象等。在這樣的環(huán)境中編寫的匯編程序,有很大一部分是面向匯編器的偽指令,已經(jīng)類同于高級語言。而此次的《微機原理與接口技術(基于16位機)》的課程設計正是利用這個學期所學的匯編語言來設計一個鍵盤鋼琴的應用程序,要求該匯編語言程序能實現(xiàn)鍵盤鋼琴的功能,就是在鍵盤上按下自定義的按鍵之后,可以從主板的蜂鳴器上發(fā)出一定頻率的音調,而這些音調的頻率都是相應音
13、階的特征頻率,故發(fā)出的聲正好就是音樂的各個音階聲調。</p><p> 通過這個應用程序,按照音樂的譜子連續(xù)地按下相應按鍵,就可以像鋼琴那樣發(fā)出音樂來,但是局限于揚聲器的原因,所發(fā)出的音樂沒有真正的鋼琴那樣美妙。但是現(xiàn)在的一些鍵盤鋼琴的軟件已經(jīng)能驅動聲卡,來獲得更好更逼真的鋼琴音樂效果了。</p><p> 1 設計意義及要求</p><p><b>
14、; 1.1 設計意義</b></p><p> 鍵盤鋼琴,電腦鍵盤代替鋼琴鍵演奏鋼琴樂曲。最原始、也是最流行的版本,音符以ABCDEGF為編排。讓不懂音樂的網(wǎng)友可以快速上手,其體積小,簡單方便、易傳播,因此在網(wǎng)上普及率最高。</p><p> 鍵盤鋼琴讓人可以在閑暇時刻,可以小小地娛樂一下,增加生活的樂趣。由于一架鋼琴過于昂貴,對于一般的普通工薪階層的人來說,還是很難接觸
15、到鋼琴的,而鍵盤鋼琴的出現(xiàn)正好讓那些業(yè)余愛好者,既滿足的對鋼琴音樂藝術的追求,也更廉價和便捷。對于初學音樂的人來說,這樣的鍵盤鋼琴軟件更是訓練的好助手,可以幫助你迅速熟悉各音階音調和旋律節(jié)奏。因此,這樣的軟件也很多版本,有專業(yè)版,也有簡單的Flash版,當然也有此次課設要求設計的簡陋版。專業(yè)版能提供多種樂器音色、錄放功能、音符顯示。不太好的地方是鍵盤要按下去才發(fā)音,沒有延時,彈起來不太就手。Flash版音色也比較好,提供了多鍵位,也可以
16、自定義鍵位。</p><p><b> 1.2 設計要求</b></p><p> 設計匯編語言程序,實現(xiàn)鍵盤鋼琴功能,具體要完成的設計任務如下:</p><p> 在鍵盤上自定義若干鍵對應著鋼琴鍵;</p><p> 單擊鋼琴鍵,計算機發(fā)出相應的音階,發(fā)聲時間自定義;</p><p>
17、 單擊“ESC”鍵退出程序</p><p> 音階與頻率的對應關系如下所示:</p><p><b> 2 總體方案論證</b></p><p> 2.1按鍵與音調頻率值的對應</p><p> 設計此匯編語言程序,要實現(xiàn)鍵盤鋼琴,首先是按鍵的自定義設計,因為題中要求設計的按鍵音調音階有十四個,但是從網(wǎng)上查資料
18、得知,各音階與其相應頻率有如表1-1所示的關系。</p><p> 表1-1 音階與頻率的對應關系 單位:Hz</p><p> 從表中可知:高低音之間有著大約兩倍的關系,這樣就很方便數(shù)據(jù)的儲存了,只需要將其中一個音度的頻率值存儲下了,再進行二倍關系的換算即可得到倍低音、低音、中音、高音、倍高音五種音度的音調頻率值。</p>&l
19、t;p> 因為題目中主要是對低、中、高音的要求,在這里就以低音為基準存儲數(shù)據(jù)值和換算其他音調頻率值,由表1-1中得知低音音符1 2 3 4 5 6 7的音調頻率分別為131、147、165、175、196、220、247。其中,中音各音調的頻率是相應低音音調頻率的兩倍, 高音各音調頻率是低音的四倍的。又因為低音的頻率值最大為247,正好小于一個無符字節(jié)數(shù)值的最大值255,因此,只需要在程序的數(shù)據(jù)區(qū)內安排七個字節(jié)來存放頻率數(shù)據(jù),即
20、:</p><p> FREQ DB 131,147,165,175,196,220,247</p><p> 這樣,不僅節(jié)省了存儲空間,而且降低了存儲數(shù)據(jù)的復雜程度。</p><p> 考慮到字母鍵盤一共也只用26個,就不對所有音調都進行字母鍵盤的按鍵定義了,只補齊題目中所缺的高音和低音,共21個音階。則可以按如下表1-2中的對應關系,設置21個按鍵分別對應
21、著低、中、高三種音度的各音調的頻率值。由于字母所對應的ASCII碼并不是連續(xù)的,因此在這里就將其的ASCII碼存儲到數(shù)據(jù)區(qū),然后根據(jù)變址尋址的方式</p><p> 表1-2 音階頻率與自定義按鍵的對應表</p><p> 對字母按鍵的ASCII碼進行地址編碼,可以將字母的ASCII碼的按表1-2的順序存放,即:</p><p> KEYS DB &
22、#39;QWERTYU' , 'ASDFGHJ' , 'ZXCVBNM'</p><p> 這樣看來,就是將這些ASCII碼值分出三類,分別為低音類、中音類、高音類。</p><p> 根據(jù)輸入KEY的ASCII碼值利用一個21次的LOOP循環(huán)就可以找到對應的偏移地址,再將所得的偏移地址減去首地址的偏移地址得到該KEY的地址相對值,再把該相對值與
23、6和13大小判斷偏移地址的所屬類別(小于等于6為低音類,大于6小于等于13為中音類,大于13為高音類)。</p><p> 知道KEY的所屬類別,就知道基準頻率值應該乘以多大的倍數(shù)才是該KEY的真正的頻率值,低音類倍數(shù)為1,中音類倍數(shù)為2,高音類倍數(shù)為4。</p><p> 接下來還要確定是哪個基準頻率值,由于已經(jīng)知道所屬類別,如果是低音類則就是地址相對值,如果是中音類,則地址相對值要
24、減去7,顯然高音類則減去14,就得到了一個0至6的編碼,再由換碼指令XLAT對頻率數(shù)據(jù)FREQ進行換碼,可以很快得到該KEY的對應的基準頻率值。</p><p> 最后是將得到的基準頻率值乘以得到的類別倍數(shù),就得到最后想要的輸入KEY的音調頻率值。舉例如下:</p><p> 輸入按鍵KEY的ASCII碼值為“D”,其ASCII碼是44H,在一個21次的LOOP循環(huán)下,可以得到數(shù)據(jù)位4
25、4H的偏移地址DI,在將該偏移地址DI-首地址的偏移地址KEYS=偏移地址的相對值9。</p><p> 因為6<9<13屬于中音類,基準頻率值的倍數(shù)為2。因為屬于中音類KEY“D”編碼為9-7=2,在換碼可以知道,“D”對應的基準頻率值為165,故最后得到“D”的頻率值為165*2=330Hz。</p><p> 因此,用此算法得到各個按鍵的頻率值是可行的。不僅節(jié)省了存儲
26、空間,而且降低了存儲數(shù)據(jù)的復雜程度,在程序編寫上可以將這一段寫成子程序,更加使得程序簡潔明了。</p><p> 2.2 揚聲器的驅動分析</p><p> 該程序主要是驅動電腦主板上的揚聲器,根據(jù)音階音調不同的頻率值,來是揚聲器發(fā)出不同的聲音,從而產生想彈鋼琴一樣的感覺,當然音質是不能相提并論的。(在這里需要說明的是,現(xiàn)在大多數(shù)筆記本主板上已沒有這個揚聲器,但是臺式機大多還是有的,在
27、臺式機上的效果更好點。)</p><p> 在電路上如下圖2-1所示:</p><p> 圖2-1 8253的電路連接圖</p><p> 在PC/XT/AT家族中,計時器芯片的3個通道都用其專門的功能,通道2是用來控制計算機的揚聲器的聲音頻率的。通道2用于產生頻率信號,故工作方式在方式3,計數(shù)值為6A4H=1190,方波輸出頻率為1.19MHz/1190
28、=1KHz,此信號決定了揚聲器的聲調,而通道2的控制字則為0B6H,1.19M約等于十六進制12348CH。</p><p> 由圖1-1可知8253的通道2計數(shù)由8255A的PB0控制,當PB0輸出為高電平的時候,是門GATE2為高電平。此時,8253的通道2允許計數(shù),故通道2的輸出方波受PB0控制,從而控制揚聲器的音調高低。通道2的輸出能否對揚聲器產生持續(xù)控制還取決于8255A的PB1。當PB1為“0”時,
29、OUT2不能通過“與門”;反之則可通過“與門”控制揚聲器。所以,揚聲器發(fā)音時間的長短取決于8255A的PB1信號。另外,CPU通過8255A的C口,得知5283通道2的狀態(tài)和揚聲器驅動器的狀態(tài)。</p><p> 由上可知,需要揚聲器正常發(fā)聲,需要8253和8255A的協(xié)同工作,而8253的控制字在網(wǎng)上查的為43H,則同過下面的程序來初始化8253</p><p> MOV A
30、L,0B6H</p><p> OUT 43H,AL </p><p> 而通道2的端口地址為42H,由于N值一般計算得出都大于255,故需要一個字的寫入,而又因為 8253只有八位數(shù)據(jù)線,故字的寫入需要兩次,一般將N值直接給AX然后通過下面的程序即可完成。</p><p> OUT 42H,AL</p><
31、p> MOV AL,AH</p><p> OUT 42H,AL</p><p> 而8255A能控制8253和揚聲器,但是只要PB0和PB1同時為高調平,揚聲器就為開,則對8255A的控制就是在對揚聲器的控制,在網(wǎng)上得知8255A的B口地址為61H,則可以通過下面的程序實現(xiàn)揚聲器的開與關。</p><p> IN AL,6
32、1H</p><p> OR AL,3 ;可以保證PB0和PB1同時為高調平</p><p> OUT 61H,AL ;打開揚聲器 </p><p> MOV AL,AH</p><p> AND AL,0FCH ;可以保證PB0和PB1同時為低調
33、平</p><p> OUT 61H,AL ;關閉揚聲器</p><p><b> 2.3 發(fā)聲時間</b></p><p> 因為只要通過8255A將揚聲器打開而不關閉,那么只要8253正常工作,揚聲器就會一直發(fā)聲,需要發(fā)聲時間多長,只需要寫一個延時子程序即可,利用LOOP和跳轉指令就可以得到一個雙循環(huán)程序,
34、在根據(jù)指令時間依次乘以LOOP循環(huán)的次和跳轉指令的跳轉次數(shù)就可以得到想要的延時時間。子程序循環(huán)完畢在將揚聲器關閉即可。延時子程序時間的長短就是發(fā)聲時間的長短。</p><p><b> 3 程序設計</b></p><p> 3.1 主程序設計及其流程圖</p><p><b> 開始</b></p>
35、;<p> 數(shù)據(jù)初始化(輸入KEYS,音符頻率FREQ等)</p><p><b> 顯示提示信息</b></p><p><b> 輸入按鍵KEY</b></p><p> 顯示請輸入正確key</p><p> 發(fā)聲子程序SOUND</p><p>
36、;<b> 判斷輸入:KEY</b></p><p><b> 是否為ESC</b></p><p><b> ?</b></p><p> 否 結束提示語</p><p> KEYS首地址給BX</p><p>&
37、lt;b> 返回DOS</b></p><p><b> 循環(huán)次數(shù)CX=21</b></p><p><b> 結束</b></p><p> 計算KEY所對應頻率值的子程序FIFRE</p><p> 判斷KEY和[BX]</p><p><
38、;b> 是否相等</b></p><p><b> ???</b></p><p><b> 否 </b></p><p><b> BX=BX+1</b></p><p> 否 LOOP判斷CX</p><
39、p><b> 是否為零</b></p><p><b> ???</b></p><p> 是 圖3-1 主程序的流程圖</p><p> 如圖3-1,主程序的主要任務:</p><p> 如果輸入的KEY為“ESC”時,直接跳轉至退出
40、EXIT處;</p><p> 找出輸入按鍵KEY的偏移地址,若不是正確按鍵,則顯示提醒語句并重新輸入KEY;</p><p> 將得到的KEY偏移地址送入子程序FIFRE計算得出頻率值,接著再將頻率值給子程序SOUND并發(fā)出音調,完成之后,跳轉至輸入口INPUT。</p><p> 3.2 子程序設計及其流程圖</p><p>
41、3.2.1 計算頻率值的子程序FIFRE</p><p><b> 開始 </b></p><p> 設置倍數(shù)標志DL=1</p><p> 計算DI相對于KEYS的值并給DI</p><p> 小于等于 將DI與6</p><p><b> 相比</
42、b></p><p><b> 大于</b></p><p> DI=DI-7且DL=DL+1</p><p> 將DI與6 小于等于</p><p><b> 相比</b></p><p> DI=DI-7且DL=DL+2</p&g
43、t;<p> 將DI給AX后進行換碼,相乘DL得到AX值給BX</p><p> 圖3-2 子程序FIFER流程圖 結束</p><p> 計算輸入值所對應頻率值的子程序FIFRE的主要任務:</p><p> 將偏移地址DI減去首地址的偏移地址KEYS得到該KEY的地址相對值,再把該相對值與6和13大小判斷
44、偏移地址的所屬類別,小于等于6為低音類,基準值倍數(shù)DL=1,大于6小于等于13為中音類,基準值倍數(shù)DL=2,大于13為高音類,基準值倍數(shù)DL為4。</p><p> 最后的DL為基準頻率值賦給AL,與基準值倍數(shù)DL相乘,得到頻率值AX,再將AX最后賦給BX。最后子程序FIFER結束時,BX即為輸入KEY的音調頻率值。</p><p> 3.2.2 發(fā)聲子程序SOUND</p&g
45、t;<p><b> 開始</b></p><p> 向8253的43H寫入控制字0B6H</p><p> 給DX、AX分別賦值12H、348CH</p><p> DIV BX得到計數(shù)初值AX=N</p><p> 分兩次向通道2端口42H寫入計數(shù)初值N</p><p>
46、;<b> 打開揚聲器</b></p><p> 延時子程序DELAY</p><p><b> 關閉揚聲器</b></p><p><b> 結束</b></p><p> 圖3-3 子程序SOUND流程圖</p><p> 子程序FI
47、FER流程圖如圖3-3所示,其主要任務是完成發(fā)聲,在該子程序中,分兩次向通道2端口42H寫入計數(shù)初值N的程序語句為:</p><p> OUT 42H,AL</p><p> MOV AL,AH</p><p> OUT 42H,AL</p><p> 打開和關閉揚聲器的程序為:</p><
48、p> IN AL,61H</p><p> OR AL,3 ;可以保證PB0和PB1同時為高調平</p><p> OUT 61H,AL ;打開揚聲器 </p><p> MOV AL,AH</p><p> AND AL,0FCH
49、 ;可以保證PB0和PB1同時為低調平</p><p> OUT 61H,AL ;關閉揚聲器</p><p><b> 開始</b></p><p> 3.2.3延時子程序DELAY</p><p><b> BX=4000</b></p><
50、;p><b> CX=0FFFH</b></p><p> 否 CX=0?</p><p><b> 是</b></p><p><b> BX=BX-1</b></p><p><b> BX=0?</b></p>
51、;<p><b> 恢復BX和CX</b></p><p> 圖3-4 延時子程序DELAY 結束</p><p><b> 4 結果分析</b></p><p> 4.1 程序調試與改進</p><p> 按上面的思路和
52、流程圖寫好程序后,對程序進行調試:</p><p> 一開始在輸入顯示這里,使用的是DOS的1號單字符輸入,會產生“回顯”,但對</p><p> 于鍵盤鋼琴來說,這一點沒有必要,于是改進后使用7號無“回顯”的單字符輸入。之前,一直想把音符也顯示出來,按的什么顯示相應的音符,成功實現(xiàn)之后,在進行第一次答辯時,研究生學長認為此舉沒有很大的必要性,可以不顯示相應的音符,經(jīng)過思考之后也表示贊
53、同,如圖4-1和4-2是不同程序的界面顯示,調試后看起來更簡潔明了;</p><p> 圖4-1 改進之前的程序界面 圖4-2 改進之后的程序界面</p><p> 2)在第一次答辯時,由于對題目認識得不夠深入,只對任務書中要求的音符進行了,編寫,在答辯時,在學長的指導下,回來查資料后知道了音符與頻率的一般規(guī)律,于是改進方案
54、,將高、低音補齊,得到更多的音調選擇;</p><p> 3)在算法上的改進,之前是算法是只根據(jù)數(shù)據(jù)區(qū)地址的關系進行推算所有頻率值的地址,這樣既浪費存儲空間,又不能很好實現(xiàn)算法,沒有可變性,在得知音符的2倍關系之后,再次思考得出上面的新算法,新算法較之前的,不但減少了存儲空間,算法也變得簡單易懂。</p><p> 4.2 結果記錄及分析</p><p>
55、調試之后,運行結果和課題的設計要求完全相符合。</p><p> 開始運行程序,能看到如下圖4-3所示的“Welcome to "Piano of Keyboard"”</p><p> 程序運行開始提示語,緊接著出現(xiàn)的是如圖4-4所示的操作提示語,</p><p> 圖4-3 程序運行開始提示語</p><p&g
56、t; 圖4-4 程序操作提示語</p><p> 2)分別按鍵盤上的按鍵Q、W、E、R、T、Y、U 得到低音聲的各音調,</p><p> 分別按鍵盤上的按鍵A 、S、D、F、G、H、J 得到中音聲的各音調;</p><p> 分別按鍵盤上的按鍵Z、X、C、V、B、N、M 得到高音聲的各音調。</p><p> 3)單擊“ES
57、C”可以退出程序,并顯示退出提示語,如圖4-5所示;</p><p> 圖4-5 程序退出時顯示提示語</p><p><b> 心得與體會</b></p><p> Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
58、xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&&&&&&&&&&&&&&&^(&^*&*(xxxxxxxxxxxxxx</p><p><b> 參考文獻</b></p><p> [1]
59、 周佩玲,彭虎,傅忠謙.微機原理與接口技術(基于16位機).電子工業(yè)出版社,2005.[2] 周佩玲,吳耿峰,萬炳奎編.十六位微型計算機原理接口及其應用.中國科學技術大 </p><p> 學出版社,1995.[3] 周明德.微型計算機系統(tǒng)原理及應用(第四版)習題集與實驗指導書.清華大學出版</p><p> 社,2002.[4]
60、0;戴梅萼.微型計算機技術及應用(第三版).清華大學出版社,2003.[5] 孫德文.微型計算機技術.高等教育出版社,2001. </p><p> [6] 王爽.匯編語言.清華大學出版社(第二版),2008</p><p><b> 附錄 程序代碼</b></p><p> DATA SEGMENT</p>
61、<p> KEYS DB 'QWERTYU','ASDFGHJ','ZXCVBNM' </p><p> FREQ DB 131,147,165,175,196,220,247</p><p> WELC DB 'Welcome to "Piano of Keyboard"'
62、,0DH,0AH,0DH,0AH,</p><p> EXPL DB 'Explanation:', 0DH,0AH,'Key:QWERTYU-Low Notes 1 2 3 4 5 6 7',</p><p> 0DH,0AH,'Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7',</p&g
63、t;<p> 0DH,0AH,'Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7',</p><p> 0DH,0AH, 'Please Note Your Caps Lock Truned On', </p><p><b> 0DH,0AH</b></p><p&g
64、t; ESCQ DB 0DH,0AH,'Please play:',0DH,0AH,'(You can Type "ESC" to exit)',</p><p> 0DH,0AH,0DH,0AH,'$'</p><p> LAST DB 0DH,0AH,'Welcome again!',
65、'$'</p><p> REMI DB 'Reminder:Please play the Key:"QWERTYU-ASDFGHJ-ZXCVBNM"',</p><p> 0DH,0AH,'$'</p><p><b> DATA ENDS</b></p&
66、gt;<p> CODE SEGMENT</p><p> ASSUME CS:CODE DS:DATA</p><p> START: MOV AX,DATA</p><p> MOV DS,AX ;初始化數(shù)據(jù)區(qū)</p><p> LEA DX,WELC</p>
67、<p> MOV AH,9 </p><p> INT 21H ;顯示提示語句</p><p> INPUT: MOV AH,7</p><p> INT 21H ;不回顯輸入鍵盤的KEY</p>
68、<p> CMP AL,1BH ;判斷輸入KEY是否為“ESC”</p><p> JZ EXIT ;若輸入KEY為“ESC”則跳轉到退出EXIT</p><p> LEA DI,KEYS</p><p> MOV CX,21 </p><
69、p> FIND: CMP AL,[DI] </p><p> JZ SING ;找到KEY相對應的偏移地址DI則跳轉至SING</p><p> INC DI </p><p> LOOP FIND ;根據(jù)輸入KEY的ASCII碼找到相對應的偏移地址</p>
70、<p> LEA DX,REMI</p><p> MOV AH,9</p><p> INT 21H ;輸入的KEY不正確,顯示提醒請輸入正確的KEY </p><p> JMP INPUT ;不是正確的輸入KEY,則跳轉至INPUT</p><
71、;p> SING: CALL FIFRE ;進入計算KEY所對應頻率值的子程序</p><p> CALL SOUND ;進入根據(jù)頻率值發(fā)出音調的子程序</p><p> JMP I NPUT ;發(fā)聲完畢后跳轉至INPUT</p><p> EXIT: LEA DX
72、,LAST </p><p> MOV AH,9 </p><p> INT 21H ;顯示退出時的字幕 </p><p> MOV AX,4C00H</p><p> INT 21H ;返回DOS<
73、;/p><p> FIFRE PROC ;計算KEY所對應頻率值的子程序</p><p> MOV DL,1 ;標記頻率基準值的倍數(shù)值</p><p> LEA BX,KEYS</p><p> SUB DI,BX ;計算偏移
74、地址相對與首地址的值</p><p> CMP DI,6</p><p> JNA SOU ;屬于低音直接跳轉至SOU</p><p> SUB DI,7 ;屬于中音,將偏移地址減7</p><p> ADD DL,1 ;標記倍數(shù)
75、值加倍為2</p><p> CMP DI,6</p><p> JNA SOU ;屬于中音,跳轉至SOU</p><p> SUB DI,7 ;屬于高音,將偏移地址再減7</p><p> ADD DL,2 ;標記倍數(shù)值再加倍為4
76、</p><p> SOU: MOV AX,DI ;將被換碼給AL</p><p> LEA BX,FREQ </p><p> XLAT </p><p> MUL DL ;頻率基準值乘以倍數(shù)得到KEY所對應的頻率值
77、</p><p> MOV BX,AX</p><p><b> RET</b></p><p> FIFRE ENDP </p><p> SOUND PROC ;根據(jù)頻率值發(fā)出音調的子程序 </p><p> MOV AL,0B
78、6H</p><p> OUT 43H,AL ;向8253的43H寫入控制字</p><p> MOV DX,12H</p><p> MOV AX,348CH </p><p> DIV BX ;計算計數(shù)初值N</p><p>
79、 OUT 42H,AL </p><p> MOV AL,AH</p><p> OUT 42H,AL ;向通道2端口42H寫入計數(shù)初值N</p><p> IN AL,61H</p><p> OR AL,3 </p><p&g
80、t; OUT 61H,AL ;打開揚聲器 </p><p> CALL DELAY ;進入延時子程序</p><p> IN AL,61H</p><p> AND AL,0FCH</p><p> OUT 61H,AL ;關閉揚聲器<
81、;/p><p><b> RET</b></p><p> SOUND ENDP </p><p> DELAY PROC ;延時時間子程序</p><p><b> PUSH BX</b></p><p><b>
82、; PUSH CX</b></p><p> MOV BX,4000</p><p> DY1: MOV CX,0FFFH</p><p> DY0: LOOP DY0 </p><p> DEC BX</p><p> JNZ
83、DY1 ;利用LOOP循環(huán)和跳轉指令進行雙循環(huán)</p><p><b> POP CX</b></p><p><b> POP BX</b></p><p><b> RET</b></p><p> DELAY ENDP</p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鍵盤鋼琴匯編語言程序設計—微機原理課程設計
- 鍵盤鋼琴匯編語言程序設計—微機原理課程設計
- 匯編語言程序設計-課程設計
- 匯編語言程序設計課程設計
- 微機原理與匯編語言課程設計
- 匯編語言程序設計課程教案
- 匯編語言程序設計
- 匯編語言程序設計
- 匯編語言程序設計前言
- 微機原理課程設計---動畫心匯編程序設計
- 微機原理與接口課程設計--用匯編語言編寫一個時鐘程序
- 匯編語言課程設計--代碼轉換程序
- 微機原理與匯編語言課程設計-多功能定時器設計
- 匯編語言課程設計 音樂點播程序
- 匯編語言課程設計報告--模擬電壓采集電路及程序設計
- 匯編語言程序設計課后答案
- 實驗一 匯編語言程序設計
- 匯編語言程序設計競賽報告
- 匯編語言程序設計習題-答案
- 4匯編語言程序設計基礎
評論
0/150
提交評論