版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計任務書</b></p><p> 題 目: 鍵盤電子樂器</p><p><b> 初始條件:</b></p><p> 掌握匯編語言程序設計方法,所設計的程序運行后可通過鍵盤控制,滿足系統(tǒng)功能,并實現該系統(tǒng)設計方案。在DOS,windows,匯編軟件環(huán)境下運行。</p
2、><p> 要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)</p><p> 1.設計一個用鍵盤演奏音樂的程序,計時器系統(tǒng)設計編程定時輸出――電子音調,用pc機內部8253time~使揚聲器發(fā)聲。用匯編語言對8253進行編程,使其OUT0上輸出一定的頻率,將其一定頻率輸出到喇叭上,演奏出不同的音節(jié)。pc機的數字鍵(1-7)作為電子音調的音調選擇</
3、p><p> 2. 課程設計說明書應包括:</p><p><b> a)設計任務及要求</b></p><p><b> b)方案比較及認證</b></p><p> c)程序設計基本思想,程序流程圖,部分源程序及注解</p><p> d)調試記錄及結果分析<
4、/p><p><b> e)參考資料</b></p><p> f)附錄:全部源程序清單</p><p><b> g)總結</b></p><p><b> 時間安排:</b></p><p> 2011年元月07日--元月09日 選題、查
5、閱資料和方案設計</p><p> 2011年元月10日--元月14日 編程</p><p> 2011年元月15日--元月16日 調試程序,改進與提高</p><p> 2011年元月17日 撰寫課程設計報告(有調試過程及結果的截屏)</p><p> 2011年元月18日
6、 答辯和交課程設計報告</p><p> 指導教師簽名: 2011 年 元 月 6 日</p><p> 系主任(或責任教師)簽名: 年 月 日</p><p><b> 摘要</b></p><p> 利用PC上的定時/計數
7、芯片8253A控制PC揚聲器發(fā)聲。編寫內核模塊,直接操作揚聲器相關端口,或字符設備驅動,供應用程序調用,用鍵盤使其發(fā)出不同的聲音。</p><p> 關鍵字:8253定時器中斷</p><p><b> 目錄</b></p><p><b> 1. 方案比較3</b></p><p>
8、<b> 2.芯片介紹4</b></p><p> 2.1 8255芯片簡述4</p><p> 2.1.1 8255三種方式下工作4</p><p> 2.2 8253芯片簡述5</p><p> 2.2.1 8253六種工作方式5</p><p> 3.通用發(fā)聲程序7&
9、lt;/p><p> 4.音調與頻率和時間的關系10</p><p><b> 附錄12</b></p><p><b> 附錄一:12</b></p><p><b> 附錄二:13</b></p><p><b> 附錄三:
10、25</b></p><p><b> 附錄四:26</b></p><p><b> 附錄五:32</b></p><p><b> 參考文獻33</b></p><p><b> 鍵盤電子樂器</b></p>&
11、lt;p><b> 方案比較</b></p><p> 1.1 發(fā)聲程序循環(huán)</p><p> 優(yōu)點:簡單,易于思維</p><p> 缺點:程序過于長,比較繁瑣</p><p> 1.2 調用宏,進行發(fā)聲</p><p><b> 優(yōu)點:程序短</b>&l
12、t;/p><p><b> 缺點:不易想到</b></p><p><b> 2.芯片介紹</b></p><p> 2.1 8255芯片簡述</p><p> 8255可編程外圍接口芯片是Intel公司生產的通用并行I/O接口芯片,它具有A、B、C三個并行接口,+5V單電源供電。</p&
13、gt;<p> 2.1.1 8255三種方式下工作</p><p> 方式0—基本輸入/輸出方式</p><p> 方式1—選通輸入/輸出方式</p><p> 方式2—雙向選通輸入/輸出方式</p><p> 2.1.2 8255引腳圖</p><p> 如右圖所示,各引腳功能如:</
14、p><p> D7~D0——與CPU側連接的八條雙向數據線;</p><p> WR(低電平有效)— 寫輸入信號;</p><p> RD(低電平有效)— 讀輸入信號;</p><p> CS(低電平有效)— 片選輸入信號;</p><p> A0、A1 — 片內寄存器選擇輸入信號;</p><
15、;p> PA7~PA0 — A口外設雙向數據線;</p><p> PB7~PB0 — B口外設雙向數據線;</p><p> PC7~PC0 — C口外設雙向數據線; RESET — 復位輸入信號</p><p> 2.1.3 8255端口地址</p><p> 2.2 8253芯片簡述</p><p&
16、gt; 8253可編程定時/計數器是Intel公司生產的通用外圍芯片之一,有3個獨立的十六位計數器,技術頻率范圍為0~2MHz,它所有的技術方式和操作方式都通過編程控制。</p><p> 2.2.1 8253六種工作方式</p><p> 方式0:計數結束中斷</p><p> 方式1:可編程頻率發(fā)生器</p><p><b&
17、gt; 方式2:頻率發(fā)生器</b></p><p> 方式3:方波頻率發(fā)生器</p><p> 方式4:軟件觸發(fā)的選通信號</p><p> 方式5:硬件觸發(fā)的選通信號</p><p> 2.2.2 8253引腳圖</p><p> 如上圖所示,各引腳功能如下:</p><p
18、> D7~D0 — 八條雙向數據線;</p><p> WR(低電平有效)— 寫輸入信號;</p><p> RD(低電平有效)— 讀輸入信號;</p><p> CS(低電平有效)— 片選輸入信號;</p><p> A0、A1 — 片內寄存器地址輸入信號;</p><p> CLK — 計數輸入,
19、用于輸入定時基準脈沖或計數脈沖;</p><p> OUT — 輸出信號,以相應的電平指示計數的完成,或輸出脈沖波形;</p><p> GATE — 選通輸入,用于啟動或禁止計數器的操作,以使計數器和計測對象同步。2.2.3 8253端口地址</p><p> 本次課設要求用8253做。計算機中可以利用8253/54定時器來驅動揚聲器。連接到揚聲器上的是定時
20、器2,GATE2與端口61H的PB0相連,當PB0=1時,GATE2獲得高電平,使定時器2可以在模式3下工作。定時器2的OUT2與端口61H的PB1通過一個與門與揚聲器的驅動電路相連。當PB1=1時,允許OUT2的輸出信號到達揚聲器電路。下面是控制揚聲器的代碼:</p><p> INAL,61H;get the current setting of port B</p><p&
21、gt; MOV AH,AL;save it</p><p> ORAL,00000011B;make PB0=1 and PB1=1</p><p> OUT61H,AL;turn the speaker on</p><p> ......;how long the beep sound goes here<
22、/p><p> MOVAL,AH;get the original setting of port B</p><p> OUT61H,AL;turn off the speaker</p><p> 對于IBM PC兼容機來說,無論是8086,80486還是Pentium,驅動揚聲器的過程是相同的。至于音調發(fā)出的時間量(音長),則取決于它
23、的延遲的時間,這個延遲時間可以在PC機的80x86主處理器的幫助下實現。</p><p><b> 3.通用發(fā)聲程序</b></p><p> BIOS中的BEEP子程序能根據BX中給出的計數值控制8253/54定時器,產生頻率為896Hz的聲音。實際上BEEP是一個很好的通用發(fā)聲程序。首先,BEEP程序只能產生896Hz的聲音,通用發(fā)聲程序應能產生任一頻率的聲音
24、。其次BEEP產生聲音的持續(xù)時間(音長)只能是0.5s的倍數,我們希望聲音的持續(xù)時間更易于調整,例如是10ms的倍數。</p><p> 給計數器2裝入計數值533H就能產生896Hz的聲音(1.1931MHz/896Hz=1331=533H),同樣,產生其他頻率聲音的計數值也可以用下式計算出來:</p><p> 假設發(fā)聲頻率存放在DI寄存器中,下面的指令使AX中得到送往定時器2的計
25、數值:</p><p> MOVDX,12H</p><p> MOVAX,348CH</p><p><b> DIVDI</b></p><p> 利用CPU來產生延遲時間是最常用的一種方法,但對8088/86,80286,386,486以及Pentium來說,它們產生的延遲時間都是不一樣的。對基于80
26、88/86的PC/XT,PS/2等PC機,可用下面的程序來產生時間延遲:</p><p><b> MOVCX,N</b></p><p> DELAY:LOOPDELAY</p><p> 在8088/86CPU中,執(zhí)行一條LOOP指令需要17個時鐘周期,因此,執(zhí)行上面的指令大約需要N*17*T時鐘周期。</p>
27、<p> 在BIOS中,利用上述方法來產生250ms延遲時間的程序如下:</p><p><b> SUBCX,CX</b></p><p> G7: LOOPG7;</p><p> 如果要產生與10ms成倍數的延遲時間,可在BX寄存器中放入倍數。例如,要產生1s的持續(xù)時間,則在BX中放入100,以控制L
28、OOP指令執(zhí)行次,</p><p> 也就是10ms的100倍。指令如下:</p><p> MOVBX,100</p><p> WAIT: MOVCX,2800</p><p> DELAY: LOOPDELAY</p><p><b> DECBX</b><
29、/p><p><b> JNZWAIT</b></p><p><b> 上述流程圖為:</b></p><p><b> 圖2-1程序流程圖</b></p><p> 下面在修改后的BEEP程序的基礎上,為8088/86編寫一個任一頻率(由DI指定)和任一持續(xù)時間(由C
30、X和BX指定)的通用發(fā)聲程序。此程序包括三個步驟:</p><p> 在8253/54中的43端口送一個控制字0B6H(10110110B),該控制字對定時器2進行初始化,使定時器2準備接收計數初值。</p><p> 在在8253/54中的42端口(Timer2)裝入一個16位的計數值(533H*896/頻率),以建立將要產生的聲音頻率。</p><p>
31、把輸出端口61H的0/1兩位置1,發(fā)出聲音。</p><p> GENSOUND PROC NEAR </p><p> ;**********************************</p><p><b> PUSH AX </b></p><p><b> PUSH BX </b&g
32、t;</p><p><b> PUSH CX </b></p><p><b> PUSH DX </b></p><p><b> PUSH DI </b></p><p> ;**********************************</p>
33、<p> MOV AL,0B6H;寫8253的控制字 選中8253通道1讀寫16位工作方式3二進制計數方式 </p><p> OUT 43H,AL ;向8253中寫入上述功能的控制字</p><p> MOV DX,12H ;假定發(fā)生頻率存放在DI寄存器中,下面的三行指令使AX中得到送往定時器2的計數值</p><p>
34、 MOV AX,348ch ;1193100HZ/freq</p><p> DIV DI ;value of freq</p><p> OUT 42H,AL;將AL中數放到8253計數器中 </p><p> MOV AL,AH </p><p> OUT 42H,AL;將AL中數放到8253計數器中 &
35、lt;/p><p> IN AL,61H;從61h號端口讀取PB口現在的狀態(tài)</p><p> MOV AH,AL ;將PB口的狀態(tài)放進AH</p><p> OR AL,3 ;將AL低兩位置1</p><p> OUT 61H,AL;向61h號端口寫入一個字節(jié),打開揚聲器</p><p>
36、;<b> WAIT1: </b></p><p> MOV CX,2000;3314 </p><p> call waitf </p><p><b> DELAY1: </b></p><p><b> DEC BX </b></p><
37、;p> JNZ WAIT1 </p><p> MOV AL,AH ;recover value of port </p><p> OUT 61H,AL;從61h號端口讀入一個字節(jié)</p><p> ;***********************************</p><p><b> PO
38、P DI </b></p><p><b> POP DX </b></p><p><b> POP CX </b></p><p><b> POP BX </b></p><p><b> POP AX </b></p>
39、;<p> ;***********************************</p><p><b> RET </b></p><p> GENSOUND ENDP</p><p> WAITF PROC NEAR </p><p><b> PUSH AX </b>
40、;</p><p><b> WAITF1: </b></p><p> IN AL,61H </p><p> AND AL,10H ;check pb4</p><p> CMP AL,AH ;did it change</p><p> JE WAITF1 ;wait
41、for change</p><p> MOV AH,AL ;save the new pb4 status</p><p> LOOP WAITF1 ;continue until cx becomes 0</p><p><b> POP AX </b></p><p><b> RET &l
42、t;/b></p><p> WAITF ENDP</p><p> GENSOUND程序能產生19~65536Hz的聲音,這個頻率的下限19Hz是使除法不產生溢出的最小的DI值((DX)=12H=18d<19)。其上限65536Hz是多余的,因為人們最高能聽到的音頻約為20000HZ。</p><p> 4.音調與頻率和時間的關系</p&g
43、t;<p> 利用計算機控制發(fā)聲的原理,可以編寫演奏樂曲的程序。在一首樂曲中,每個音符的音高和音長與頻率和節(jié)拍有關。</p><p> 圖3-1音頻頻率對照表</p><p> 組成樂曲的每個音符的頻率值和持續(xù)時間是樂曲程序發(fā)生所需要的兩個數據。音符的頻率可以從圖3-1中查表得到,但實際上送入計數器2的是輸入頻率1.1932MHz與音符頻率相除的值,通用發(fā)聲程序SOUN
44、DF的前半部分就是完成這個計算,并將計數值送入計數器2的功能。</p><p><b> ;</b></p><p> MOV AL,0B6H;寫8253的控制字 選中8253通道1讀寫16位工作方式3二進制計數方式 </p><p> OUT 43H,AL ;向8253中寫入上述功能的控制字</p>&l
45、t;p> MOV DX,12H ;假定發(fā)生頻率存放在DI寄存器中,下面的三行指令使AX中得到送往定時器2的計數值</p><p> MOV AX,348ch ;1193100HZ/freq</p><p> DIV DI ;value of freq</p><p> OUT 42H,AL;將AL中數放到8253計數器中 <
46、;/p><p> MOV AL,AH </p><p> OUT 42H,AL;將AL中數放到8253計數器中 </p><p> ;.................................</p><p><b> 附錄</b></p><p><b> 附錄一:
47、</b></p><p><b> 程序一流程圖</b></p><p><b> 附錄二:</b></p><p><b> 程序一</b></p><p> DATA SEGMENT PARA 'DATA'</p>
48、<p> INFO1 DB 0DH,0AH,'WELCOME YOU TO COME HERE!$'</p><p> INFO2 DB 0DH,0AH,'this is a Piano program!$'</p><p> INFO3 DB 0DH,0AH,'please press!$'<
49、/p><p> INFO4 DB 0DH,0AH,'INPUT ERROR!$'</p><p> INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'</p><p> MUSLIST DB 0DH,0AH,'1262'</p><p> D
50、B 0DH,0AH,'2294'</p><p> DB 0DH,0AH,'3330'</p><p> DB 0DH,0AH,'4347'</p><p> DB 0DH,0AH,'5392'</p><p> DB 0DH,0AH,'6440'
51、;</p><p> DB 0DH,0AH,'7494'</p><p> DB 0DH,0AH,'8524'</p><p> DB 0dh,0ah,'$'</p><p> MUS_FREG1 DW 262,-1</p><p> MUS_TIME1 D
52、W 50,25</p><p> MUS_FREG2 DW 294,-1</p><p> MUS_TIME2 DW 50,25</p><p> MUS_FREG3 DW 330,-1</p><p> MUS_TIME3 DW 50,25</p><p> MUS_FREG4 DW 347,-1</
53、p><p> MUS_TIME4 DW 50,25</p><p> MUS_FREG5 DW 392,-1</p><p> MUS_TIME5 DW 50,25</p><p> MUS_FREG6 DW 440,-1</p><p> MUS_TIME6 DW 50,25</p><p&
54、gt; MUS_FREG7 DW 494,-1</p><p> MUS_TIME7 DW 50,25</p><p> MUS_FREG8 DW 524,-1</p><p> MUS_TIME8 DW 50,25</p><p> DATA ENDS</p><p> STACK SE
55、GMENT PARA STACK 'STACK'</p><p> DB 200 DUP ('STACK')</p><p> STACK ENDS</p><p> CODE SEGMENT</p><p> ASSUME DS:DATA,SS:STACK,CS:CODE</p
56、><p> MAIN PROC FAR</p><p> MOV AX,DATA</p><p><b> MOV DS,AX</b></p><p> MOV AH,0;設置顯示方式</p><p> MOV AL,4;設置顯示方式</p><p>
57、; INT 10H;調用顯示器中斷</p><p> MOV AH,0BH;設置背景顏色或彩色組</p><p> MOV BH,0;設置背景顏色</p><p> MOV BL,2;藍色</p><p> INT 10H;調用顯示器中斷</p><p> MOV AH,0BH;
58、設置背景顏色或彩色組</p><p> MOV BH,01H;設置字體顏色</p><p> MOV BL,1;黑色</p><p> INT 10H;調用顯示器中斷</p><p> ;*****定義一個宏*****</p><p> ;功能09H功能描述:輸出一個字符串到標準輸出設備上。&l
59、t;/p><p> ;如果輸出操作被重定向,那么,將無法判斷磁盤已滿入口參數:AH=09HDS:DX=待輸出字符的地址</p><p> ;說明:待顯示的字符串以’$’作為其結束標志</p><p> SHOW MACRO b</p><p> LEA DX,b</p><p> MOV AH
60、,9</p><p> INT 21H</p><p><b> ENDM</b></p><p> ;**********************</p><p> show INFO1;顯示字符串</p><p> show INFO2;顯示字符串</p>
61、;<p> show INFO3;顯示字符串</p><p> show MUSLIST;顯示字符串</p><p> INPUT: MOV AH,01H;設置光標類型</p><p> INT 21H;調用中斷,返回dos</p><p> CMP AL,'Q';是否按下Q&
62、lt;/p><p> JZ retu;是則跳轉,不是繼續(xù)向下運行</p><p> CMP AL,'1';是否按下1</p><p> JNZ B0;不是1跳轉,是繼續(xù)向下運行</p><p> CALL MUSIC1;跳轉到MUSIC1程序</p><p> JMP EXIT1
63、;跳轉EXIT1</p><p> B0: CMP AL,'2';是否按下2</p><p> JNZ C0;不是2則跳轉,是繼續(xù)運行</p><p> CALL MUSIC2;調用 MUSIC2程序</p><p> JMP EXIT1;跳轉到EXIT1</p><
64、p> C0: CMP AL,'3';是否按下3</p><p> JNZ D0;不是3跳轉,是繼續(xù)運行</p><p> CALL MUSIC3;跳轉到MUSIC3程序</p><p><b> JMP EXIT1</b></p><p> D0: CMP
65、 AL,'4';是否按下4</p><p> JNZ E0;不是4跳轉,是繼續(xù)運行</p><p> CALL MUSIC4;跳轉到MUSIC4程序</p><p><b> JMP EXIT1</b></p><p> E0: CMP AL,'5';是否
66、按下5</p><p> JNZ F0;不是5跳轉,是繼續(xù)運行</p><p> CALL MUSIC5;跳轉到MUSIC5程序</p><p><b> JMP EXIT1</b></p><p> F0: CMP AL,'6';是否按下6</p><p
67、> JNZ G0;不是6跳轉,是繼續(xù)運行</p><p> CALL MUSIC6;跳轉到MUSIC6程序</p><p><b> JMP EXIT1</b></p><p> G0: CMP AL,'7';是否按下7</p><p> JNZ H0;不是7跳
68、轉,是繼續(xù)運行</p><p> CALL MUSIC7;跳轉到MUSIC7程序</p><p><b> JMP EXIT1</b></p><p> H0: CMP AL,'8';是否按下8</p><p> JNZ exit;不是8跳轉,是繼續(xù)運行</p>
69、<p> CALL MUSIC8;跳轉到MUSIC8程序</p><p> EXIT1: show INFO5;顯示字符</p><p> JMP INPUT ;跳轉到INPUT</p><p> EXIT: </p><p> call clear;跳轉到clear</p>&
70、lt;p> show INFO4;顯示字符</p><p> show INFO5;顯示字符</p><p> show INFO1;顯示字符</p><p> show INFO2;顯示字符</p><p> show INFO3;顯示字符</p><p> show MUSLI
71、ST;顯示字符</p><p> jmp input;跳轉到INPUT</p><p> RETU: MOV AH,4CH;帶返回碼返回</p><p> INT 21H;調用dos中斷</p><p> MAIN ENDP </p><p> MUSIC1 PROC NEAR&
72、lt;/p><p><b> PUSH DS</b></p><p><b> SUB AX,AX</b></p><p><b> PUSH AX</b></p><p> LEA SI,MUS_FREG1;puts the freg table offset in
73、SI</p><p> LEA BP,DS:MUS_TIME1;puts the time table offset in BP</p><p> FREG1: MOV DI,[SI];read next frequency</p><p> CMP DI,-1;end of tone</p><p>
74、JE END_MUS1;if yes,exit</p><p> MOV DX,DS:[BP];else,fetch the duration</p><p> MOV BX,5400</p><p> CALL GENSOUND;play the note</p><p> ADD SI,2;upd
75、ate the table pointer</p><p><b> ADD BP,2</b></p><p> JMP FREG1 ;go process next note</p><p><b> END_MUS1:</b></p><p><b> RET&l
76、t;/b></p><p> MUSIC1 ENDP</p><p> GENSOUND PROC NEAR</p><p><b> PUSH AX</b></p><p><b> PUSH BX</b></p><p><b> PUSH
77、 CX</b></p><p><b> PUSH DX</b></p><p><b> PUSH DI</b></p><p> MOV AL,0B6H;寫8253的控制字 選中8253通道1讀寫16位工作方式3二進制計數方式</p><p> OUT 43H,AL
78、;向8253中寫入上述功能的控制字</p><p> MOV DX,12H</p><p> MOV AX,533H*896</p><p><b> DIV DI</b></p><p> OUT 42H,AL;將AL中數放到8253計數器中</p><p><b>
79、MOV AL,AH</b></p><p> OUT 42H,AL;將AL中數放到8253計數器中</p><p> IN AL,61H;從61h號端口讀入一個字節(jié)</p><p><b> MOV AH,AL</b></p><p><b> OR AL,3</b>&l
80、t;/p><p> OUT 61H,AL;向61h號端口寫入一個字節(jié)</p><p> WAIT1: MOV CX,8FF0H;向CX中寫入數</p><p> DELAY1: LOOP DELAY1;延時</p><p> DEC BX;BX-1</p><p> JNZ WAIT1
81、;運算結果不為0,則ZF=0,則轉移</p><p> MOV AL,AH</p><p> OUT 61H,AL;從61h號端口讀入一個字節(jié)</p><p><b> POP DI</b></p><p><b> POP DX</b></p><p>&l
82、t;b> POP CX</b></p><p><b> POP BX</b></p><p><b> POP AX</b></p><p><b> RET</b></p><p> GENSOUND ENDP</p><p&
83、gt; MUSIC2 PROC NEAR</p><p><b> PUSH DS</b></p><p><b> SUB AX,AX</b></p><p><b> PUSH AX</b></p><p> LEA SI,MUS_FREG2</p&g
84、t;<p> LEA BP,DS:MUS_TIME2</p><p> FREG2: MOV DI,[SI]</p><p><b> CMP DI,-1</b></p><p> JE END_MUS2</p><p> MOV DX,DS:[BP]</p><p>
85、; MOV BX,1400</p><p> CALL GENSOUND</p><p><b> ADD SI,2</b></p><p><b> ADD BP,2</b></p><p><b> JMP FREG1</b></p><p&g
86、t;<b> END_MUS2:</b></p><p><b> RET</b></p><p> MUSIC2 ENDP</p><p> MUSIC3 PROC NEAR</p><p><b> PUSH DS</b></p><
87、;p><b> SUB AX,AX</b></p><p><b> PUSH AX</b></p><p> LEA SI,MUS_FREG3</p><p> LEA BP,DS:MUS_TIME3</p><p> FREG3: MOV DI,[SI]</p>
88、<p><b> CMP DI,-1</b></p><p> JE END_MUS3</p><p> MOV DX,DS:[BP]</p><p> MOV BX,1400</p><p> CALL GENSOUND</p><p><b> ADD SI
89、,2</b></p><p><b> ADD BP,2</b></p><p><b> JMP FREG1</b></p><p><b> END_MUS3:</b></p><p><b> RET</b></p>
90、<p> MUSIC3 ENDP</p><p> MUSIC4 PROC NEAR</p><p><b> PUSH DS</b></p><p><b> SUB AX,AX</b></p><p><b> PUSH AX</b><
91、;/p><p> LEA SI,MUS_FREG4;puts the freg table offset in SI</p><p> LEA BP,DS:MUS_TIME4;puts the time table offset in BP</p><p> FREG4: MOV DI,[SI];read next frequency&l
92、t;/p><p> CMP DI,-1;end of tone</p><p> JE END_MUS4;if yes,exit</p><p> MOV DX,DS:[BP];else,fetch the duration</p><p> MOV BX,5400</p><p>
93、CALL GENSOUND;play the note</p><p> ADD SI,2;update the table pointer</p><p><b> ADD BP,2</b></p><p> JMP FREG4 ;go process next note</p><p
94、><b> END_MUS4:</b></p><p><b> RET</b></p><p> MUSIC4 ENDP</p><p> MUSIC5 PROC NEAR</p><p><b> PUSH DS</b></p>&
95、lt;p><b> SUB AX,AX</b></p><p><b> PUSH AX</b></p><p> LEA SI,MUS_FREG5;puts the freg table offset in SI</p><p> LEA BP,DS:MUS_TIME5;puts the time
96、 table offset in BP</p><p> FREG5: MOV DI,[SI];read next frequency</p><p> CMP DI,-1;end of tone</p><p> JE END_MUS5;if yes,exit</p><p> MOV DX,DS:
97、[BP];else,fetch the duration</p><p> MOV BX,5400</p><p> CALL GENSOUND;play the note</p><p> ADD SI,2;update the table pointer</p><p><b> ADD BP
98、,2</b></p><p> JMP FREG5 ;go process next note</p><p><b> END_MUS5:</b></p><p><b> RET</b></p><p> MUSIC5 ENDP</p><
99、;p> MUSIC6 PROC NEAR</p><p><b> PUSH DS</b></p><p><b> SUB AX,AX</b></p><p><b> PUSH AX</b></p><p> LEA SI,MUS_FREG6;p
100、uts the freg table offset in SI</p><p> LEA BP,DS:MUS_TIME6;puts the time table offset in BP</p><p> FREG6: MOV DI,[SI];read next frequency</p><p> CMP DI,-1;end o
101、f tone</p><p> JE END_MUS6;if yes,exit</p><p> MOV DX,DS:[BP];else,fetch the duration</p><p> MOV BX,5400</p><p> CALL GENSOUND;play the note</p>
102、<p> ADD SI,2;update the table pointer</p><p><b> ADD BP,2</b></p><p> JMP FREG6 ;go process next note</p><p><b> END_MUS6:</b></p&
103、gt;<p><b> RET</b></p><p> MUSIC6 ENDP</p><p> MUSIC7 PROC NEAR</p><p><b> PUSH DS</b></p><p><b> SUB AX,AX</b><
104、;/p><p><b> PUSH AX</b></p><p> LEA SI,MUS_FREG7;puts the freg table offset in SI</p><p> LEA BP,DS:MUS_TIME7;puts the time table offset in BP</p><p>
105、 FREG7: MOV DI,[SI];read next frequency</p><p> CMP DI,-1;end of tone</p><p> JE END_MUS7;if yes,exit</p><p> MOV DX,DS:[BP];else,fetch the duration</p>
106、<p> MOV BX,5400</p><p> CALL GENSOUND;play the note</p><p> ADD SI,2;update the table pointer</p><p><b> ADD BP,2</b></p><p> JMP FR
107、EG7 ;go process next note</p><p><b> END_MUS7:</b></p><p><b> RET</b></p><p> MUSIC7 ENDP</p><p> MUSIC8 PROC NEAR</p>&
108、lt;p><b> PUSH DS</b></p><p><b> SUB AX,AX</b></p><p><b> PUSH AX</b></p><p> LEA SI,MUS_FREG8;puts the freg table offset in SI</p>
109、;<p> LEA BP,DS:MUS_TIME8;puts the time table offset in BP</p><p> FREG8: MOV DI,[SI];read next frequency</p><p> CMP DI,-1;end of tone</p><p> JE END_MUS8
110、;if yes,exit</p><p> MOV DX,DS:[BP];else,fetch the duration</p><p> MOV BX,5400</p><p> CALL GENSOUND;play the note</p><p> ADD SI,2;update the ta
111、ble pointer</p><p><b> ADD BP,2</b></p><p> JMP FREG8 ;go process next note</p><p><b> END_MUS8:</b></p><p><b> RET</b>&l
112、t;/p><p> MUSIC8 ENDP</p><p> clear proc near</p><p><b> push ax</b></p><p><b> push bx</b></p><p><b> push cx</b>
113、</p><p><b> push dx</b></p><p> mov ah,6;讀當前光標位置設置</p><p> mov al,0;上滾行數</p><p> mov ch,0;上滾窗口左上角的行、列號</p><p> mov cl,0;上滾窗口左上
114、角的行、列號</p><p> mov dh,24;上滾窗口右下角的行號</p><p> mov dl,79;上滾窗口右下角的列號</p><p> mov bh,7;空白行的屬性</p><p> int 10h;調用顯示器中斷</p><p><b> pop dx<
115、/b></p><p><b> pop cx</b></p><p><b> pop bx</b></p><p><b> pop ax</b></p><p><b> ret</b></p><p> cl
116、ear endp</p><p> CODE ENDS</p><p><b> END MAIN</b></p><p><b> 附錄三:</b></p><p><b> 程序二流程圖</b></p><p><b>
117、 附錄四:</b></p><p><b> 程序二</b></p><p> DATA SEGMENT </p><p> msg DB 0DH,0AH,'[ 1 2 3 4 5 6 7 ]'</p><p> DB 0DH,0AH,'[ q w e r t y u ]
118、9;</p><p> DB 0DH,0AH,'[ a s d f g h j ]'</p><p> DB 0DH,0AH,'_________________'</p><p> DB 0DH,0AH,'9: EXIT' </p><p> DB 0DH,0AH,'_____
119、____________','$' </p><p> ;********音調******后面用到-1判斷音樂播是否放完</p><p> sound_0 DW -1;sound_0 DW -1</p><p> sound_11 DW 131,-1;sound_11 DW 441,-1 </p><p>
120、 sound_12 DW 147,-1;sound_12 DW 495,-1</p><p> sound_13 DW 165,-1;sound_13 DW 556,-1</p><p> sound_14 DW 175,-1;sound_14 DW 589,-1</p><p> sound_15 DW 196,-1;sound_15 DW 661
121、,-1</p><p> sound_16 DW 220,-1;sound_16 DW 742,-1 </p><p> sound_17 DW 247,-1;sound_17 DW 833,-1 </p><p> sound_21 DW 524,-1</p><p> sound_22 DW 588,-1</p>
122、<p> sound_23 DW 660,-1</p><p> sound_24 DW 698,-1</p><p> sound_25 DW 784,-1</p><p> sound_26 DW 880,-1</p><p> sound_27 DW 988,-1</p><p> sou
123、nd_1 DW 262,-1;sound_1 DW 882,-1 </p><p> sound_2 DW 294,-1;sound_2 DW 990,-1 </p><p> sound_3 DW 330,-1;sound_3 DW 1112,-1</p><p> sound_4 DW 349,-1;sound_4 DW 1178,-1 </
124、p><p> sound_5 DW 392,-1;sound_5 DW 1322,-1 </p><p> sound_6 DW 440,-1;sound_6 DW 1484,-1 </p><p> sound_7 DW 492,-1;sound_7 DW 1655,-1</p><p> time DW 10;time
125、 DW 50</p><p> DATA ENDS </p><p> ;************************</p><p> STACK SEGMENT </p><p> Db 200 DUP ('STACK') </p><p> STACK ENDS </p>
126、<p> ;************************</p><p> CODE SEGMENT </p><p> ASSUME DS:DATA,SS:STACK,CS:CODE </p><p><b> START: </b></p><p> MOV AX,DATA </p&
127、gt;<p><b> MOV DS,AX</b></p><p> MOV AH,00H ;設置顯示方式</p><p> MOV AL,12H;設置顯示方式</p><p> INT 10H;調用顯示器中斷8</p><p> ;*****定義一個宏***** </p
128、><p> ;功能09H功能描述:輸出一個字符串到標準輸出設備上。</p><p> ;如果輸出操作被重定向,那么,將無法判斷磁盤已滿入口參數:AH=09HDS:DX=待輸出字符的地址</p><p> ;說明:待顯示的字符串以’$’作為其結束標志</p><p> SHOW MACRO b </p><p>&l
129、t;b> LEA DX,b </b></p><p><b> MOV AH,9 </b></p><p><b> INT 21H </b></p><p><b> ENDM</b></p><p> ;********一個聲音宏********
130、</p><p> onesound macro soundis,jumpis,letteris</p><p> CMP AL,letteris </p><p> JNZ jumpis </p><p> LEA SI,soundis</p><p> LEA BP,DS:time</p>
131、<p> CALL MUSIC </p><p> JMP input </p><p><b> ENDM</b></p><p><b> show msg</b></p><p> INPUT: MOV AH,01H;設置光標類型 </p><p&
132、gt; INT 21H ;調用中斷,返回dos</p><p> CMP AL,'9';是否按下9</p><p> jnz go;按下9則轉移</p><p> mov ah,4ch;帶返回碼結束</p><p> int 21h;調用DOS中斷</p><p&
133、gt; go: onesound sound_11,a0,'a';'q'調用宏</p><p> a0: onesound sound_12,b0,'s';'w'調用宏</p><p> b0: onesound sound_13,c0,'d';'e'調用宏</p&
134、gt;<p> c0: onesound sound_14,d0,'f';'r'調用宏</p><p> d0: onesound sound_15,e0,'g';'t'調用宏</p><p> e0: onesound sound_16,f0,'h';'y'
135、調用宏</p><p> f0: onesound sound_17,g0,'j';'u'調用宏</p><p> g0: onesound sound_1,h0,'q';'1'調用宏</p><p> h0: onesound sound_2,i0,'w';'
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新型鍵盤電子樂器的研究與設計實現.pdf
- 面向電子樂器銷售企業(yè)的電子商務銷售系統(tǒng)設計與實現.pdf
- 手機鍵盤課程設計
- 單片機課程設計---鍵盤接口課程設計
- 鍵盤監(jiān)聽程序課程設計
- 音樂器播放《送別》課程設計
- java課程設計--軟鍵盤
- eda課程設計--矩陣鍵盤接口設計
- 軟鍵盤系統(tǒng)課程設計
- 鍵盤測試器的設計課程設計
- eda課程設計自動奏樂器2
- 矩陣鍵盤eda技術課程設計
- 微機原理課程設計-鍵盤輸入
- 矩陣鍵盤eda技術課程設計
- 課程設計4乘4矩陣鍵盤設計
- 數字電路課程設計--自動奏樂器設計
- hdl-ps2接口鍵盤課程設計
- 單片機鍵盤輸入課程設計
- 微機原理課程設計----鍵盤接收日期并顯示
- 單片機課程設計報告-仿手機鍵盤
評論
0/150
提交評論