




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、前 言匯編語言是一種功能很強(qiáng)的程序設(shè)計語言,也是利用計算機(jī)所有硬件特性并能直接控制硬件的語言。匯編語言,作為一門語言,對應(yīng)于高級語言的編譯器,需要一個“匯編器”來把匯編語言原文件匯編成機(jī)器可執(zhí)行的代碼。高級的匯編器如MASM,TASM等等為我們寫匯編程序提供了很多類似于高級語言的特征,比如結(jié)構(gòu)化、抽象等。在這樣的環(huán)境中編寫的匯編程序,有很大一部分是面向匯編器的偽指令,已經(jīng)類同于高級語言。而此次的微機(jī)原理與接口技術(shù)(基于16位機(jī))的課程設(shè)計正是利用這個學(xué)期所學(xué)的匯編語言來設(shè)計一個鍵盤鋼琴的應(yīng)用程序,要求該匯編語言程序能實現(xiàn)鍵盤鋼琴的功能,就是在鍵盤上按下自定義的按鍵之后,可以從主板的蜂鳴器上發(fā)出
2、一定頻率的音調(diào),而這些音調(diào)的頻率都是相應(yīng)音階的特征頻率,故發(fā)出的聲正好就是音樂的各個音階聲調(diào)。通過這個應(yīng)用程序,按照音樂的譜子連續(xù)地按下相應(yīng)按鍵,就可以像鋼琴那樣發(fā)出音樂來,但是局限于揚(yáng)聲器的原因,所發(fā)出的音樂沒有真正的鋼琴那樣美妙。但是現(xiàn)在的一些鍵盤鋼琴的軟件已經(jīng)能驅(qū)動聲卡,來獲得更好更逼真的鋼琴音樂效果了。中文摘要采用16 位微處理器 8086 CPU 以及86 系列微型計算機(jī)的指令系統(tǒng); 軟件設(shè)計平臺為多功能微型計算機(jī)實驗軟件MFS 中的微機(jī)原理實驗集成環(huán)境MF2KP,仿真設(shè)計平臺為Proteus 軟件。 設(shè)計匯編語言程序,實現(xiàn)鍵盤鋼琴功能,具體功能要求如下: (1)在鍵盤上自定義若干鍵
3、對應(yīng)鋼琴鍵; (2)單擊鋼琴鍵,計算機(jī)發(fā)出相應(yīng)音階,發(fā)聲時間自定義;(3)單擊”ESC”鍵退出程序。 關(guān)鍵字: 16位微處理器 集成環(huán)境 匯編語言 鍵盤鋼琴 目 錄1 設(shè)計意義及要求11.1 設(shè)計意義11.2 設(shè)計要求12 總體方案論證22.1按鍵與音調(diào)頻率值的對應(yīng)22.2 揚(yáng)聲器的驅(qū)動分析42.3 發(fā)聲時間53 程序設(shè)計63.1 主程序設(shè)計及其流程圖63.2 子程序設(shè)計及其流程圖73.2.1 計算頻率值的子程序FIFRE73.2.2 發(fā)聲子程序SOUND8延時子程序DELAY94 結(jié)果分析104.1 程序調(diào)試與改進(jìn)104.2 結(jié)果記錄及分析11心得與體會12參考文獻(xiàn)13致 謝14附錄 程序代
4、碼151 設(shè)計意義及要求1.1 設(shè)計意義鍵盤鋼琴,電腦鍵盤代替鋼琴鍵演奏鋼琴樂曲。最原始、也是最流行的版本,音符以ABCDEGF為編排。讓不懂音樂的網(wǎng)友可以快速上手,其體積小,簡單方便、易傳播,因此在網(wǎng)上普及率最高。鍵盤鋼琴讓人可以在閑暇時刻,可以小小地娛樂一下,增加生活的樂趣。由于一架鋼琴過于昂貴,對于一般的普通工薪階層的人來說,還是很難接觸到鋼琴的,而鍵盤鋼琴的出現(xiàn)正好讓那些業(yè)余愛好者,既滿足的對鋼琴音樂藝術(shù)的追求,也更廉價和便捷。對于初學(xué)音樂的人來說,這樣的鍵盤鋼琴軟件更是訓(xùn)練的好助手,可以幫助你迅速熟悉各音階音調(diào)和旋律節(jié)奏。因此,這樣的軟件也很多版本,有專業(yè)版,也有簡單的Flash版,
5、當(dāng)然也有此次課設(shè)要求設(shè)計的簡陋版。專業(yè)版能提供多種樂器音色、錄放功能、音符顯示。不太好的地方是鍵盤要按下去才發(fā)音,沒有延時,彈起來不太就手。Flash版音色也比較好,提供了多鍵位,也可以自定義鍵位。1.2 設(shè)計要求設(shè)計匯編語言程序,實現(xiàn)鍵盤鋼琴功能,具體要完成的設(shè)計任務(wù)如下:(1) 在鍵盤上自定義若干鍵對應(yīng)著鋼琴鍵;(2) 單擊鋼琴鍵,計算機(jī)發(fā)出相應(yīng)的音階,發(fā)聲時間自定義;(3) 單擊“ESC”鍵退出程序音階與頻率的對應(yīng)關(guān)系如下所示:音符45671234567頻率/Hz1751962202472622943303493924404945235876592 總體方案論證2.1按鍵與音調(diào)頻率值的對
6、應(yīng)設(shè)計此匯編語言程序,要實現(xiàn)鍵盤鋼琴,首先是按鍵的自定義設(shè)計,因為題中要求設(shè)計的按鍵音調(diào)音階有十四個,但是從網(wǎng)上查資料得知,各音階與其相應(yīng)頻率有如表1-1所示的關(guān)系。表1-1 音階與頻率的對應(yīng)關(guān)系 單位:HzA11022044088017603520B12324749498819753950C131262523104620934186D147294587117523494698E165330659131826375277F175349698139727945587G196392784156831366271從表中可知:高低音之間有著大約兩倍的關(guān)系,這樣就很方便數(shù)據(jù)的儲存了,只需要將其中一個音度
7、的頻率值存儲下了,再進(jìn)行二倍關(guān)系的換算即可得到倍低音、低音、中音、高音、倍高音五種音度的音調(diào)頻率值。因為題目中主要是對低、中、高音的要求,在這里就以低音為基準(zhǔn)存儲數(shù)據(jù)值和換算其他音調(diào)頻率值,由表1-1中得知低音音符1 2 3 4 5 6 7的音調(diào)頻率分別為131、147、165、175、196、220、247。其中,中音各音調(diào)的頻率是相應(yīng)低音音調(diào)頻率的兩倍, 高音各音調(diào)頻率是低音的四倍的。又因為低音的頻率值最大為247,正好小于一個無符字節(jié)數(shù)值的最大值255,因此,只需要在程序的數(shù)據(jù)區(qū)內(nèi)安排七個字節(jié)來存放頻率數(shù)據(jù),即:FREQ DB 131,147,165,175,196,220,247這樣,
8、不僅節(jié)省了存儲空間,而且降低了存儲數(shù)據(jù)的復(fù)雜程度??紤]到字母鍵盤一共也只用26個,就不對所有音調(diào)都進(jìn)行字母鍵盤的按鍵定義了,只補(bǔ)齊題目中所缺的高音和低音,共21個音階。則可以按如下表1-2中的對應(yīng)關(guān)系,設(shè)置21個按鍵分別對應(yīng)著低、中、高三種音度的各音調(diào)的頻率值。由于字母所對應(yīng)的ASCII碼并不是連續(xù)的,因此在這里就將其的ASCII碼存儲到數(shù)據(jù)區(qū),然后根據(jù)變址尋址的方式音度音名1234567低音頻率/Hz自定義按鍵131147165175196220247QWERTYU中音頻率/Hz自定義按鍵131*2147*2165*2175*2196*2220*2247*2ASDFGHJ高音頻率/Hz自定義
9、按鍵131*4147*4165*4175*4196*4220*4247*4ZXCVBNM表1-2 音階頻率與自定義按鍵的對應(yīng)表對字母按鍵的ASCII碼進(jìn)行地址編碼,可以將字母的ASCII碼的按表1-2的順序存放,即:KEYS DB 'QWERTYU' , 'ASDFGHJ' , 'ZXCVBNM'這樣看來,就是將這些ASCII碼值分出三類,分別為低音類、中音類、高音類。根據(jù)輸入KEY的ASCII碼值利用一個21次的LOOP循環(huán)就可以找到對應(yīng)的偏移地址,再將所得的偏移地址減去首地址的偏移地址得到該KEY的地址相對值,再把該相對值與6和13大小判斷偏
10、移地址的所屬類別(小于等于6為低音類,大于6小于等于13為中音類,大于13為高音類)。知道KEY的所屬類別,就知道基準(zhǔn)頻率值應(yīng)該乘以多大的倍數(shù)才是該KEY的真正的頻率值,低音類倍數(shù)為1,中音類倍數(shù)為2,高音類倍數(shù)為4。接下來還要確定是哪個基準(zhǔn)頻率值,由于已經(jīng)知道所屬類別,如果是低音類則就是地址相對值,如果是中音類,則地址相對值要減去7,顯然高音類則減去14,就得到了一個0至6的編碼,再由換碼指令XLAT對頻率數(shù)據(jù)FREQ進(jìn)行換碼,可以很快得到該KEY的對應(yīng)的基準(zhǔn)頻率值。最后是將得到的基準(zhǔn)頻率值乘以得到的類別倍數(shù),就得到最后想要的輸入KEY的音調(diào)頻率值。舉例如下:輸入按鍵KEY的ASCII碼值為
11、“D”,其ASCII碼是44H,在一個21次的LOOP循環(huán)下,可以得到數(shù)據(jù)位44H的偏移地址DI,在將該偏移地址DI-首地址的偏移地址KEYS=偏移地址的相對值9。因為6<9<13屬于中音類,基準(zhǔn)頻率值的倍數(shù)為2。因為屬于中音類KEY“D”編碼為9-7=2,在換碼可以知道,“D”對應(yīng)的基準(zhǔn)頻率值為165,故最后得到“D”的頻率值為165*2=330Hz。因此,用此算法得到各個按鍵的頻率值是可行的。不僅節(jié)省了存儲空間,而且降低了存儲數(shù)據(jù)的復(fù)雜程度,在程序編寫上可以將這一段寫成子程序,更加使得程序簡潔明了。2.2 揚(yáng)聲器的驅(qū)動分析該程序主要是驅(qū)動電腦主板上的揚(yáng)聲器,根據(jù)音階音調(diào)不同的頻
12、率值,來是揚(yáng)聲器發(fā)出不同的聲音,從而產(chǎn)生想彈鋼琴一樣的感覺,當(dāng)然音質(zhì)是不能相提并論的。(在這里需要說明的是,現(xiàn)在大多數(shù)筆記本主板上已沒有這個揚(yáng)聲器,但是臺式機(jī)大多還是有的,在臺式機(jī)上的效果更好點。)在電路上如下圖2-1所示:8255(PB1)圖2-1 8253的電路連接圖在PC/XT/AT家族中,計時器芯片的3個通道都用其專門的功能,通道2是用來控制計算機(jī)的揚(yáng)聲器的聲音頻率的。通道2用于產(chǎn)生頻率信號,故工作方式在方式3,計數(shù)值為6A4H=1190,方波輸出頻率為1.19MHz/1190=1KHz,此信號決定了揚(yáng)聲器的聲調(diào),而通道2的控制字則為0B6H,1.19M約等于十六進(jìn)制12348CH。由
13、圖1-1可知8253的通道2計數(shù)由8255A的PB0控制,當(dāng)PB0輸出為高電平的時候,是門GATE2為高電平。此時,8253的通道2允許計數(shù),故通道2的輸出方波受PB0控制,從而控制揚(yáng)聲器的音調(diào)高低。通道2的輸出能否對揚(yáng)聲器產(chǎn)生持續(xù)控制還取決于8255A的PB1。當(dāng)PB1為“0”時,OUT2不能通過“與門”;反之則可通過“與門”控制揚(yáng)聲器。所以,揚(yáng)聲器發(fā)音時間的長短取決于8255A的PB1信號。另外,CPU通過8255A的C口,得知5283通道2的狀態(tài)和揚(yáng)聲器驅(qū)動器的狀態(tài)。由上可知,需要揚(yáng)聲器正常發(fā)聲,需要8253和8255A的協(xié)同工作,而8253的控制字在網(wǎng)上查的為43H,則同過下面的程序來
14、初始化8253MOV AL,0B6HOUT 43H,AL 而通道2的端口地址為42H,由于N值一般計算得出都大于255,故需要一個字的寫入,而又因為 8253只有八位數(shù)據(jù)線,故字的寫入需要兩次,一般將N值直接給AX然后通過下面的程序即可完成。OUT 42H,ALMOV AL,AH OUT 42H,AL而8255A能控制8253和揚(yáng)聲器,但是只要PB0和PB1同時為高調(diào)平,揚(yáng)聲器就為開,則對8255A的控制就是在對揚(yáng)聲器的控制,在網(wǎng)上得知8255A的B口地址為61H,則可以通過下面的程序?qū)崿F(xiàn)揚(yáng)聲器的開與關(guān)。IN AL,61HOR AL,3 ;可以保證PB0和PB1同時為高調(diào)平OUT 61H,AL
15、 ;打開揚(yáng)聲器 MOV AL,AHAND AL,0FCH ;可以保證PB0和PB1同時為低調(diào)平OUT 61H,AL ;關(guān)閉揚(yáng)聲器2.3 發(fā)聲時間因為只要通過8255A將揚(yáng)聲器打開而不關(guān)閉,那么只要8253正常工作,揚(yáng)聲器就會一直發(fā)聲,需要發(fā)聲時間多長,只需要寫一個延時子程序即可,利用LOOP和跳轉(zhuǎn)指令就可以得到一個雙循環(huán)程序,在根據(jù)指令時間依次乘以LOOP循環(huán)的次和跳轉(zhuǎn)指令的跳轉(zhuǎn)次數(shù)就可以得到想要的延時時間。子程序循環(huán)完畢在將揚(yáng)聲器關(guān)閉即可。延時子程序時間的長短就是發(fā)聲時間的長短。3 程序設(shè)計3.1 主程序設(shè)計及其流程圖開始數(shù)據(jù)初始化(輸入KEYS,音符頻率FREQ等)顯示提示信息輸入按鍵KE
16、Y顯示請輸入正確key 發(fā)聲子程序SOUND判斷輸入:KEY是否為ESC?否 結(jié)束提示語KEYS首地址給BX 返回DOS循環(huán)次數(shù)CX=21 結(jié)束 計算KEY所對應(yīng)頻率值的子程序FIFRE 判斷KEY和BX 是否相等 ? 否 BX=BX+1 否 LOOP判斷CX 是否為零 ? 是 圖3-1 主程序的流程圖如圖3-1,主程序的主要任務(wù):1) 如果輸入的KEY為“ESC”時,直接跳轉(zhuǎn)至退出EXIT處;2) 找出輸入按鍵KEY的偏移地址,若不是正確按鍵,則顯示提醒語句并重新輸入KEY;3) 將得到的KEY偏移地址送入子程序FIFRE計算得出頻率值,接著再將頻率值給子程序SOUND并發(fā)出音調(diào),完成之后,
17、跳轉(zhuǎn)至輸入口INPUT。3.2 子程序設(shè)計及其流程圖3.2.1 計算頻率值的子程序FIFRE 開始 設(shè)置倍數(shù)標(biāo)志DL=1 計算DI相對于KEYS的值并給DI小于等于 將DI與6 相比 大于 DI=DI-7且DL=DL+1 將DI與6 小于等于 相比DI=DI-7且DL=DL+2 將DI給AX后進(jìn)行換碼,相乘DL得到AX值給BX 圖3-2 子程序FIFER流程圖 結(jié)束計算輸入值所對應(yīng)頻率值的子程序FIFRE的主要任務(wù):將偏移地址DI減去首地址的偏移地址KEYS得到該KEY的地址相對值,再把該相對值與6和13大小判斷偏移地址的所屬類別,小于等于6為低音類,基準(zhǔn)值倍數(shù)DL=1,大于6小于等于13為中
18、音類,基準(zhǔn)值倍數(shù)DL=2,大于13為高音類,基準(zhǔn)值倍數(shù)DL為4。最后的DL為基準(zhǔn)頻率值賦給AL,與基準(zhǔn)值倍數(shù)DL相乘,得到頻率值A(chǔ)X,再將AX最后賦給BX。最后子程序FIFER結(jié)束時,BX即為輸入KEY的音調(diào)頻率值。3.2.2 發(fā)聲子程序SOUND 開始向8253的43H寫入控制字0B6H給DX、AX分別賦值12H、348CHDIV BX得到計數(shù)初值A(chǔ)X=N分兩次向通道2端口42H寫入計數(shù)初值N 打開揚(yáng)聲器延時子程序DELAY關(guān)閉揚(yáng)聲器結(jié)束圖3-3 子程序SOUND流程圖子程序FIFER流程圖如圖3-3所示,其主要任務(wù)是完成發(fā)聲,在該子程序中,分兩次向通道2端口42H寫入計數(shù)初值N的程序語句為
19、:OUT 42H,ALMOV AL,AH OUT 42H,AL打開和關(guān)閉揚(yáng)聲器的程序為:IN AL,61HOR AL,3 ;可以保證PB0和PB1同時為高調(diào)平OUT 61H,AL ;打開揚(yáng)聲器 MOV AL,AHAND AL,0FCH ;可以保證PB0和PB1同時為低調(diào)平OUT 61H,AL ;關(guān)閉揚(yáng)聲器 開始入棧保護(hù)BX和CX3.2.3延時子程序DELAY BX=4000 CX=0FFFH 否 CX=0? 是 BX=BX-1 BX=0? 恢復(fù)BX和CX圖3-4 延時子程序DELAY 結(jié)束4 結(jié)果分析4.1 程序調(diào)試與改進(jìn)按上面的思路和流程圖寫好程序后,對程序進(jìn)行調(diào)試:1) 一開始在輸入顯示這
20、里,使用的是DOS的1號單字符輸入,會產(chǎn)生“回顯”,但對于鍵盤鋼琴來說,這一點沒有必要,于是改進(jìn)后使用7號無“回顯”的單字符輸入。之前,一直想把音符也顯示出來,按的什么顯示相應(yīng)的音符,成功實現(xiàn)之后,在進(jìn)行第一次答辯時,研究生學(xué)長認(rèn)為此舉沒有很大的必要性,可以不顯示相應(yīng)的音符,經(jīng)過思考之后也表示贊同,如圖4-1和4-2是不同程序的界面顯示,調(diào)試后看起來更簡潔明了; 圖4-1 改進(jìn)之前的程序界面 圖4-2 改進(jìn)之后的程序界面 2)在第一次答辯時,由于對題目認(rèn)識得不夠深入,只對任務(wù)書中要求的音符進(jìn)行了,編寫,在答辯時,在學(xué)長的指導(dǎo)下,回來查資料后知道了音符與頻率的一般規(guī)律,于是改進(jìn)方案,將高、低音補(bǔ)
21、齊,得到更多的音調(diào)選擇;3)在算法上的改進(jìn),之前是算法是只根據(jù)數(shù)據(jù)區(qū)地址的關(guān)系進(jìn)行推算所有頻率值的地址,這樣既浪費(fèi)存儲空間,又不能很好實現(xiàn)算法,沒有可變性,在得知音符的2倍關(guān)系之后,再次思考得出上面的新算法,新算法較之前的,不但減少了存儲空間,算法也變得簡單易懂。4.2 結(jié)果記錄及分析調(diào)試之后,運(yùn)行結(jié)果和課題的設(shè)計要求完全相符合。1) 開始運(yùn)行程序,能看到如下圖4-3所示的“Welcome to "Piano of Keyboard"”程序運(yùn)行開始提示語,緊接著出現(xiàn)的是如圖4-4所示的操作提示語,圖4-3 程序運(yùn)行開始提示語圖4-4 程序操作提示語2)分別按鍵盤上的按鍵Q、
22、W、E、R、T、Y、U 得到低音聲的各音調(diào), 分別按鍵盤上的按鍵A 、S、D、F、G、H、J 得到中音聲的各音調(diào);分別按鍵盤上的按鍵Z、X、C、V、B、N、M 得到高音聲的各音調(diào)。 3)單擊“ESC”可以退出程序,并顯示退出提示語,如圖4-5所示;圖4-5 程序退出時顯示提示語心得與體會經(jīng)過一周的匯編課程設(shè)計,我在其中經(jīng)歷了很大的困難,可是也感受到了巨大的幸福。當(dāng)我面對一個難題,從一籌莫展到逐漸清晰明朗,到最后成功的完成任務(wù)。只要親身經(jīng)歷過,才能感受其中的淚水和快樂。更重要的是我們對匯編有了進(jìn)一步的理解。有了實際運(yùn)用的體會,只是更加的融會貫通了,不管是從知識上還是從思維邏輯方式上,我們都有了很
23、大的進(jìn)步。還有就是深切感受到了課本以外的世界獨(dú)立接受新知識,獨(dú)立面對新問題的能力,面對挑戰(zhàn)不氣餒,積極的去面對,戰(zhàn)勝它。讓自己變得充實起來。以及感謝老師給我們這次課程設(shè)計的機(jī)會,知識來源于實踐,應(yīng)用于實踐??傊@次的課程設(shè)計使我受益匪淺。在以后的日子里我們要本著一切從應(yīng)用出發(fā)的度去學(xué)習(xí)。同樣要珍惜以后的實踐學(xué)習(xí)。參考文獻(xiàn)1 周佩玲,彭虎,傅忠謙.微機(jī)原理與接口技術(shù)(基于16位機(jī)).電子工業(yè)出版社,2005.2 周佩玲,吳耿峰,萬炳奎編.十六位微型計算機(jī)原理接口及其應(yīng)用.中國科學(xué)技術(shù)大 學(xué)出版社,1995.3 周明德.微型計算機(jī)系統(tǒng)原理及應(yīng)用(第四版)習(xí)題集與實驗指
24、導(dǎo)書.清華大學(xué)出版社,2002.4 戴梅萼.微型計算機(jī)技術(shù)及應(yīng)用(第三版).清華大學(xué)出版社,2003.5 孫德文.微型計算機(jī)技術(shù).高等教育出版社,2001. 6 王爽.匯編語言.清華大學(xué)出版社(第二版),2008致 謝一周的匯編語言課程設(shè)計結(jié)束了,我的收獲很大。通過課程設(shè)計的編程和對編程過程中遇到的問題的思考,有效的提高了我對匯編的認(rèn)識和理解,切實的提高了我的編程能力,補(bǔ)全了我的不足。通過這次課程設(shè)計,我鞏固所了學(xué)過的知識,能用匯編語言熟練地運(yùn)用順序、選擇、循環(huán)三大結(jié)構(gòu),進(jìn)一步掌握了各個指令的功能,特別是轉(zhuǎn)向指令,掌握了子程序的定義及調(diào)用,以及正確地運(yùn)用DEBUG指令。在整
25、個程序的編寫中,調(diào)試占了很大部分的時間。要想寫好匯編語言的程序,必須認(rèn)真對待代碼的每一個細(xì)節(jié),還必須熟練的掌握debug命令,這對程序的調(diào)試是非常重要的。通過這次實際動手能力的培養(yǎng),我進(jìn)一步熟悉了匯編語言的結(jié)構(gòu)和使用方法,基本達(dá)到了能獨(dú)立閱讀、編制和調(diào)試 另外,就是我對這門課內(nèi)容的學(xué)習(xí)感受。要學(xué)好這門課,我認(rèn)為應(yīng)該做到以下三點:1) 課本上應(yīng)該記住的東西一定要記住,記不住就沒法做題,(例如指令,尋址方式等等)若記住你做題就會做,看程序也就能看懂,記不住見了它就會對它不知所措,一臉茫然。2)預(yù)習(xí)很重要,這一點不僅適用于這一科的學(xué)習(xí),確切的說它適用于任何一科,有的同學(xué)這一點作的不好,上課只知道豎著
26、兩個耳朵傻傻的聽老師講課,也不注意動動腦子隨時思考,延續(xù)以前填鴨式的學(xué)習(xí)方式,想讓老師講給所有的東西,殊不知很多東西還要自己從書本獲得。這就難免出現(xiàn)聽不懂的情況,這好比讓一個不懂外語的人聽外語錄音,在他的心里,聽外語就像聽天書一般,所以說你要學(xué)一點新東西,前提是你對它要有一點了解,不然的話你所作的一切只不過是在浪費(fèi)時間,浪費(fèi)金錢,浪費(fèi)生命。3)理論與實踐相結(jié)合,不懂的地方應(yīng)勤問老師勤問同學(xué),直到把它搞懂為止。附錄 程序代碼DATA SEGMENT KEYS DB 'QWERTYU','ASDFGHJ','ZXCVBNM' FREQ DB 131,
27、147,165,175,196,220,247 WELC DB 'Welcome to "Piano of Keyboard"',0DH,0AH,0DH,0AH, EXPL DB 'Explanation:', 0DH,0AH,'Key:QWERTYU-Low Notes 1 2 3 4 5 6 7',0DH,0AH,'Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7',0DH,0AH,'Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7',0D
28、H,0AH, 'Please Note Your Caps Lock Truned On', 0DH,0AH ESCQ DB 0DH,0AH,'Please play:',0DH,0AH,'(You can Type "ESC" to exit)',0DH,0AH,0DH,0AH,'$' LAST DB 0DH,0AH,'Welcome again!','$' REMI DB 'Reminder:Please play the Key:"QWERTYU-ASDF
29、GHJ-ZXCVBNM"',0DH,0AH,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化數(shù)據(jù)區(qū) LEA DX,WELC MOV AH,9 INT 21H ;顯示提示語句 INPUT: MOV AH,7 INT 21H ;不回顯輸入鍵盤的KEY CMP AL,1BH ;判斷輸入KEY是否為“ESC” JZ EXIT ;若輸入KEY為“ESC”則跳轉(zhuǎn)到退出EXIT LEA DI,KEYS MOV CX,21 FIND: CMP AL,DI JZ SI
30、NG ;找到KEY相對應(yīng)的偏移地址DI則跳轉(zhuǎn)至SING INC DI LOOP FIND ;根據(jù)輸入KEY的ASCII碼找到相對應(yīng)的偏移地址 LEA DX,REMI MOV AH,9 INT 21H ;輸入的KEY不正確,顯示提醒請輸入正確的KEY JMP INPUT ;不是正確的輸入KEY,則跳轉(zhuǎn)至INPUT SING: CALL FIFRE ;進(jìn)入計算KEY所對應(yīng)頻率值的子程序 CALL SOUND ;進(jìn)入根據(jù)頻率值發(fā)出音調(diào)的子程序 JMP I NPUT ;發(fā)聲完畢后跳轉(zhuǎn)至INPUT EXIT: LEA DX,LAST MOV AH,9 INT 21H ;顯示退出時的字幕 MOV AX,4
31、C00H INT 21H ;返回DOS FIFRE PROC ;計算KEY所對應(yīng)頻率值的子程序 MOV DL,1 ;標(biāo)記頻率基準(zhǔn)值的倍數(shù)值 LEA BX,KEYS SUB DI,BX ;計算偏移地址相對與首地址的值 CMP DI,6 JNA SOU ;屬于低音直接跳轉(zhuǎn)至SOU SUB DI,7 ;屬于中音,將偏移地址減7 ADD DL,1 ;標(biāo)記倍數(shù)值加倍為2 CMP DI,6 JNA SOU ;屬于中音,跳轉(zhuǎn)至SOU SUB DI,7 ;屬于高音,將偏移地址再減7 ADD DL,2 ;標(biāo)記倍數(shù)值再加倍為4 SOU: MOV AX,DI ;將被換碼給AL LEA BX,FREQ XLAT MU
32、L DL ;頻率基準(zhǔn)值乘以倍數(shù)得到KEY所對應(yīng)的頻率值 MOV BX,AX RETFIFRE ENDP SOUND PROC ;根據(jù)頻率值發(fā)出音調(diào)的子程序 MOV AL,0B6H OUT 43H,AL ;向8253的43H寫入控制字 MOV DX,12H MOV AX,348CH DIV BX ;計算計數(shù)初值N OUT 42H,AL MOV AL,AH OUT 42H,AL ;向通道2端口42H寫入計數(shù)初值N IN AL,61H OR AL,3 OUT 61H,AL ;打開揚(yáng)聲器 CALL DELAY ;進(jìn)入延時子程序 IN AL,61H AND AL,0FCH OUT 61H,AL ;關(guān)閉揚(yáng)
33、聲器 RETSOUND ENDP DELAY PROC ;延時時間子程序 PUSH BX PUSH CX MOV BX,4000 DY1: MOV CX,0FFFH DY0: LOOP DY0 DEC BX JNZ DY1 ;利用LOOP循環(huán)和跳轉(zhuǎn)指令進(jìn)行雙循環(huán) POP CX POP BX RET DELAY ENDP CODE ENDS END START DATA SEGMENT KEYS DB 'QWERTYU','ASDFGHJ','ZXCVBNM' FREQ DB 131,147,165,175,196,220,247 WELC DB
34、'Welcome to "Piano of Keyboard"',0DH,0AH,0DH,0AH, EXPL DB 'Explanation:', 0DH,0AH,'Key:QWERTYU-Low Notes 1 2 3 4 5 6 7',0DH,0AH,'Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7',0DH,0AH,'Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7',0DH,0AH, 'Please Note Your Cap
35、s Lock Truned On', 0DH,0AH ESCQ DB 0DH,0AH,'Please play:',0DH,0AH,'(You can Type "ESC" to exit)',0DH,0AH,0DH,0AH,'$' LAST DB 0DH,0AH,'Welcome again!','$' REMI DB 'Reminder:Please play the Key:"QWERTYU-ASDFGHJ-ZXCVBNM"',0DH,0AH,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化數(shù)據(jù)區(qū) LEA DX,WELC MOV AH,9 INT 21H ;顯示提示語句 INPUT: MOV AH,7 IN
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西改革語文試題及答案
- 酒店經(jīng)營管理方案
- 退履約保證金申請書
- 車間員工睡覺的檢討書
- 2025境內(nèi)旅游代理合同示范文本
- 2025資產(chǎn)托管合同模板
- 2025煤炭采購合同協(xié)議書范本
- 西師大版四年級語文下冊期末試卷
- 幼兒園教資筆試題目及答案
- 2025合同范本 技術(shù)咨詢與現(xiàn)代管理創(chuàng)新的卓越成果案例
- 關(guān)于電壓互感器的鐵磁諧振及其消諧措施講義
- The Last of Us《最后生還者(2023)》第一季第八集完整中英文對照劇本
- (2.3)-采煤機(jī)進(jìn)刀方式
- GB/T 9164-2001關(guān)節(jié)軸承角接觸關(guān)節(jié)軸承
- 初中英語學(xué)科教學(xué)的項目化教學(xué)課件
- 化學(xué)制藥工藝學(xué)試題庫
- 國開電大應(yīng)用寫作形考任務(wù)6答案
- 傳染病院內(nèi)感染預(yù)防與控制共26張課件
- 說專業(yè)(市場營銷專業(yè))課件
- 詞匯及翻譯四級漢譯英練習(xí)
- 知識產(chǎn)權(quán)法完整版教學(xué)ppt課件全套教程
評論
0/150
提交評論