版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計 說 明 書</p><p> 題 目 </p><p> 姓 名 </p><p> 專 業(yè) </p><p&g
2、t; 班 級 </p><p> 系 (部) </p><p> 指導(dǎo)老師 </p><p><b> 目錄</b></p><p
3、><b> 摘 要1</b></p><p> 1 設(shè)計任務(wù)及要求2</p><p><b> 2 工作原理2</b></p><p> 2.1 8253簡介3</p><p> 2.28255簡介4</p><p><b> 3設(shè)計
4、思路4</b></p><p> 3.1程序功能描述4</p><p> 3.2程序流程圖5</p><p> 3.3DOS/BIOS功能調(diào)用6</p><p> 3.3.1INT 16H(鍵盤I/O中斷)6</p><p> 3.3.2INT 10H(屏幕及顯示器中斷)
5、7</p><p> 3.3.3 INT 21H(DOS系統(tǒng)功能調(diào)用)8</p><p> 4方案比較及論證8</p><p> 5 程序源代碼及注釋8</p><p> 6 運行結(jié)果分析11</p><p> 7 調(diào)試過程記錄12</p><p> 8 課程設(shè)計小結(jié)
6、13</p><p><b> 參考文獻14</b></p><p><b> 附錄15</b></p><p><b> 摘 要</b></p><p> 本文通過8255和8253來實現(xiàn)電子琴模擬,主要可以分成兩部分,分別為輸入部分和發(fā)音部分。輸入部分主要是由
7、8255和8個常開型開關(guān)來完成。發(fā)音部分由CUP通過對定時器8253的通道2進行編程,使其I/O寄存器接收一個控制聲音頻率的16位計數(shù)值,端口61H的最低位控制通道2門控的開斷,以產(chǎn)生特殊的音響。本文用到的是8253的方式3——方波發(fā)生器。</p><p> 在程序設(shè)計中,為了避免過于頻繁的調(diào)用中斷顯示字符串,應(yīng)用了宏定義;還通過子程序調(diào)用,有效的解決了跳轉(zhuǎn)和轉(zhuǎn)移過多的問題;再加上合理的DOS和BIOS功能調(diào)用
8、,以及各種指令的綜合,最終作出了漂亮的電子琴界面,并實現(xiàn)了電子琴演奏高、中、低音,以及播放預(yù)存樂曲的功能。</p><p> 關(guān)鍵詞:電子琴 8253定時器 8255 DOS調(diào)用 宏定義 </p><p><b> 1 設(shè)計任務(wù)及要求</b></p><p> 初始條件:用匯編語言設(shè)計一個電子琴,在屏幕上顯示出來,界面要美觀,功能
9、上模擬現(xiàn)實電子琴功能。</p><p> 要求完成的主要任務(wù):1.實現(xiàn)彈奏功或演奏。其中彈奏:用戶每按一琴鍵彈奏相應(yīng)音符;演奏:按下某鍵后自動彈奏預(yù)存琴譜功能;還可以附加變調(diào)</p><p><b> 2.界面要美觀。</b></p><p><b> 2 工作原理</b></p><p>
10、 PC機揚聲器電路以及相關(guān)接口電路如圖2-1。</p><p> 圖2-1 PC機揚聲器電路及相關(guān)接口電路</p><p> 通過8255和8253來實現(xiàn)電子琴模擬,主要可以分成兩部分,分別為輸入部分和發(fā)音部分。</p><p> 輸入部分:主要是由8255和8個常開型開關(guān)來完成。 </p><p> 發(fā)音部分:CUP通過對定時器的通
11、道2進行編程,使其I/O寄存器接收一個控制聲音頻率的16位計數(shù)值,端口61H的最低位控制通道2門控的開斷,以產(chǎn)生特殊的音響。 </p><p> 當(dāng)通道2用于發(fā)聲時,采用的是方式3,在方式3下,輸出線為“1”和為“0”的時間各占計數(shù)時間的一半,因而產(chǎn)生一系列間隔均勻的脈沖。從定時器輸出的方波信號,經(jīng)功率放大和濾波后驅(qū)動揚聲器。送到揚聲器的信號還受到了從并行接口芯片8255(端口地址為61H)來的雙重控制,端口6
12、1H的最低位控制通道2的門控開斷,以產(chǎn)生特殊的音頻信號,端口61H的PB1位和定時器的輸出信號同時作為與門的輸入,PB0和PB1位可由程序決定為0還是為1。顯然只有PB0和PB1都是1時,才能使揚聲器發(fā)出聲音??刂埔糸L的時間可以簡單地通過反復(fù)執(zhí)行指令來得到。</p><p> 2.1 8253簡介</p><p> 8253芯片是常用的可編程計數(shù)器,在微機中有著極其重要的作用。常用于
13、事件計數(shù)器,單穩(wěn)態(tài)觸發(fā)器,分頻器,方波發(fā)生器,硬件觸發(fā)的單脈沖發(fā)生器等。計數(shù)器/定時器8253包括3個獨立的16位計數(shù)器通道,而每個計數(shù)器都有6種工作方式,可以按二進制或十進制(BCD碼)進行計數(shù)。本文用到的是8253的方式3——方波發(fā)生器來實現(xiàn)了簡易電子琴的設(shè)計。</p><p> 8253的方式控制字如圖2-2所示。</p><p> 圖2-2 8253的方式控制字</p&g
14、t;<p> 8253的工作方式3——方波發(fā)生器:</p><p><b> 它的特點是:</b></p><p> (1)輸出為周期性的方波。若計數(shù)值為N,則輸出方波的周期是N個CLK脈沖的寬度。</p><p> (2)寫入控制字后,輸出將變?yōu)楦唠娖?,?dāng)寫入計數(shù)初值后,就開始計數(shù),輸出仍為高電平;當(dāng)計數(shù)到初值的一半時,
15、輸出變?yōu)榈碗娖?,直至計?shù)到0,輸出又變?yōu)楦唠娖剑匦麻_始計數(shù)。</p><p> (3)若計數(shù)值為偶數(shù),則輸出對稱方波;如果計數(shù)值為奇數(shù),則前(N+1)/2個CLK脈沖期間輸出為高電平,后(N-1)/2個CLK脈沖期間輸出為低電平。</p><p> (4)GATE信號能使計數(shù)過程重新開始,GATE=1允許計數(shù),GATE=0禁止計數(shù)。停止后OUT將立即變高電平,當(dāng)GATE再次變高以后,
16、計數(shù)器將自動裝入計數(shù)初值,重新開始計數(shù)。</p><p><b> 8255簡介</b></p><p> 按功能可把8255分為三個邏輯電路部分,即:口電路、總線接口電路和控制邏輯電路。8255共有三個8位口,其中A口和B口是單純的數(shù)據(jù)口,供數(shù)據(jù)I/O使用。而C口則既可以作數(shù)據(jù)口,又可以作控制口使用,用于實現(xiàn)A口和B口的控制功能。</p><
17、p> 8255A的方式控制字如圖2-3所示。</p><p> 圖2-3 8255A的方式控制字</p><p><b> 3設(shè)計思路</b></p><p><b> 程序功能描述</b></p><p> 程序開始,顯示電子琴界面和提示信息,對緩存區(qū)初始化。按鍵掃描,接著調(diào)用發(fā)音
18、子程序把al送緩存區(qū),發(fā)出與按鍵相對應(yīng)頻率的聲音,從而實現(xiàn)計算機鋼琴功能:</p><p> 鍵盤按鍵“q、w、e、r、t、y、u”實現(xiàn)音調(diào)的高音輸入;</p><p> 鍵盤按鍵“a、s、d、f、g、h、j”實現(xiàn)音調(diào)的中音輸入;</p><p> 鍵盤按鍵“z、x、c、v、b、n、m”實現(xiàn)音調(diào)的低音輸入。</p><p> 不停地對
19、Esc鍵進行掃描,當(dāng)Esc鍵按下時,就退出程序;當(dāng)按下p時,播放預(yù)存音樂;當(dāng)檢測到Enter鍵時,退出到計算機鋼琴演奏狀態(tài)。</p><p><b> 程序流程圖</b></p><p> 程序流程圖如圖3-1所示。</p><p> 圖3-1 程序流程圖</p><p> DOS/BIOS功能調(diào)用</p&
20、gt;<p> DOS操作系統(tǒng)為程序設(shè)計者提供了可以直接調(diào)用的軟中斷處理程序,每一個中斷處理程序完成一個特定的功能操作。依據(jù)編程需要選擇適當(dāng)?shù)奶幚沓绦?,編程者不需再重新編寫程序,而是使用INT n軟中斷指令。每執(zhí)行一種不同類型碼n的軟中斷指令,就執(zhí)行一個中斷處理程序,其主要功能如下: (1) 磁盤的讀/寫控制。 </p><p> (2)內(nèi)存管理、文件操作和目錄管理。 (3
21、)基本輸入/輸出(對鍵盤、打印機和顯示器等)控制,另外還有日期、時間管理等。</p><p> BIOS是固化在只讀存儲器ROM中的一系列輸入/輸出服務(wù)程序,它存放于內(nèi)存的高地址區(qū)域內(nèi),除負(fù)責(zé)處理系統(tǒng)中的全部內(nèi)部中斷外,還提供對主要I/O接口的控制功能,如鍵盤、顯示器、磁盤、打印、日期與時間等。BIOS采用模塊化結(jié)構(gòu),每個功能模塊的入口地址都存于中斷向量表中。對這些中斷調(diào)用是通過軟中斷指令I(lǐng)NT n來實現(xiàn)的,中
22、斷指令中的操作數(shù)n即為中斷類型碼。 BIOS的調(diào)用方法與DOS系統(tǒng)功能調(diào)用方法類似: (1)置功能號于AH中。 (2)置入口參數(shù)。 (3)執(zhí)行INT n 。 (4)分析出口參數(shù)及狀態(tài)。</p><p> 下面介紹程序中將要用到的一下DOS/BIOS功能調(diào)用:</p><p> INT 16H(鍵盤I/O中斷)</p><p
23、><b> 功能號:00H</b></p><p> 功能:從鍵盤讀入ASCII字符,放在AL中</p><p> 入口參數(shù):AH=00H</p><p><b> 功能號:01H</b></p><p> 功能:測試有無鍵被按下</p><p> 入口參數(shù)
24、:AH=01H</p><p> INT 10H(屏幕及顯示器中斷)</p><p><b> 功能號:00H</b></p><p> 功能:設(shè)置顯示模式入口參數(shù):AH=00H AL=顯示模式</p><p><b> 功能號:02H </b></
25、p><p> 功能:用文本坐標(biāo)下設(shè)置光標(biāo)位置 入口參數(shù): AH=02H BH=顯示頁碼 DH=行(Y坐標(biāo))
26、0; DL=列(X坐標(biāo)) </p><p><b> 功能號:09H </b></p><p> 功能:在當(dāng)前光標(biāo)處按指定屬性顯示字符 入口參數(shù):AH=09H A
27、L=字符 BH=顯示頁碼 BL=屬性(文本模式)或顏色(圖形模式) CX=重復(fù)輸
28、出字符的次數(shù) </p><p><b> 功能號:0BH </b></p><p> 功能:設(shè)置調(diào)色板、背景色或邊框 入口參數(shù):AH=0BH設(shè)置顏色:BH=00H,BL=顏色選擇調(diào)色板:BH=01H,BL=調(diào)色板(320×200、4種顏色的圖形模式) 。</p><p><b> 功能號:0CH </b&g
29、t;</p><p> 功能:寫圖形象素 入口參數(shù):AH=0CH AL=象素值 BH=頁碼
30、0; (CX、DX)=圖形坐標(biāo)列(X)、行(Y) </p><p> 3.3.3 INT 21H(DOS系統(tǒng)功能調(diào)用)</p><p><b> 功能號:4CH</b></p><p> 功能:退出系統(tǒng),返回DOS</p><p> 入口參數(shù):AH=4CH</p>
31、<p><b> 方案比較及論證</b></p><p> 在程序設(shè)計的過程中,遇到了很多問題,總結(jié)起來有以下幾點:</p><p> 問題1:要顯示的字符串過多,但又不想重復(fù)寫代碼</p><p> 原因:過于頻繁的調(diào)用中斷顯示字符串,導(dǎo)致程序過于龐大和復(fù)雜,可讀性差。</p><p> 解決辦
32、法:解決這種問題的最好方法是直接把顯示部分寫成子過程,但是子過程在遞參數(shù)的時候不方便,所以就用宏定義,宏定義可以很方便的傳遞參數(shù),不僅使得程序美觀好看,而且可讀性好,程序代碼緊湊。</p><p> 問題2:寄存器不夠用</p><p> 原因:使用了太多的寄存器,AX、BX、CX、DX。</p><p> 解決辦法:使用外部變量定義,定義外部變量的方法為:&
33、lt;/p><p> 變量名數(shù)據(jù)類型 ?</p><p> 問題3:跳轉(zhuǎn),轉(zhuǎn)移指令跳出的范圍太大,編譯出現(xiàn)錯誤</p><p> 原因:程序結(jié)構(gòu)過于復(fù)雜,龐大。</p><p> 解決辦法:使用過程,也就是子程序設(shè)計,直接把一個要頻繁要用到的函數(shù)打包成一個子過程,然后用CALL調(diào)用子過程就可以了,這樣就可以避免使用跳轉(zhuǎn)和轉(zhuǎn)移指令了。&l
34、t;/p><p> 5 程序源代碼及注釋</p><p> 主程序如下(宏定義及子程序見附錄):</p><p> data segment</p><p> ;------------------------------進度條字符-----------------------</p><p> st_load
35、db 10 ;起始行</p><p> db 4 ;起始列</p><p> db 0bh ;字體顏色<
36、;/p><p> db 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII'</p><p><b> db 00</b></p><p> ;------------------------------字符定義-----------------------</p><p> sta
37、rt_col db ? ;存儲起始行</p><p> text db 14 ;起始行</p><p> db 2
38、 ;起始列</p><p> db 0fh ;字體顏色</p><p> db 'piano -- AUTOMATION 0808 ^_^',0ffh,0ffh ;顯示字</p><p> db '
39、 HAVE A GOOD TIME!',0ffh ;以0ffh來判斷是否換行</p><p> db ' [-1-2-3-4-5-6-7-]',0ffh</p><p> db 'H [ q w e r t y u ] p: play',0ffh</p><p> db 'M
40、 [ a s d f g h j ] enter: stop',0ffh</p><p> db 'L [ z x c v b n m ] Esc: exit',0ffh</p><p> db ' 1/2: speed down/up',0ffh</p><p>&l
41、t;b> db 00</b></p><p> ;------------------------------白色琴鍵坐標(biāo)-------------------</p><p> st_lx dw 50,61,72,83,94,105,116 ;起點橫坐標(biāo)</p><p> dw 1
42、27,138,149,160,171,182,193 </p><p> dw 204,215,226,237,248,259,270</p><p> st_y dw 50 ;起點縱坐標(biāo)</p><p> ed_lx dw
43、 60,71,82,93,104,115,126 ;終點橫坐標(biāo)</p><p> dw 137,148,159,170,181,192,203 </p><p> dw 214,225,236,247,258,269,280</p><p> ed_y dw 90
44、 ;終點縱坐標(biāo)</p><p> ;------------------------------黑色琴鍵坐標(biāo)--------------------------</p><p> bt_x dw 57,68,90,101,112 ;起點橫坐標(biāo)<
45、/p><p> dw 134,145,167,178,189 </p><p> dw 211,222,244,254,265</p><p> bt_y dw 50 ;起點縱坐標(biāo)</p><p> bd_x dw 64,75,97,108,11
46、9 ;終點橫坐標(biāo)</p><p> dw 141,152,174,185,196</p><p> dw 218,229,251,262,273</p><p> bd_y dw 70 ;終點縱坐標(biāo)<
47、/p><p> ;------------------------------音樂頻率值----------------------------</p><p> tune dw 220,247,278,294,330,371,416 ;低音</p><p> dw 441,495,556,589,661,742,8
48、33 ;中音</p><p> dw 882,990,1112,1178,1322,1484,1655 ;高音</p><p> soundcolor dw 0 ;音色緩存,用于改變播放或彈奏時琴上音響和琴面上點陣的顏色 </p><p> key_tune dw 0
49、 ;按鍵狀態(tài)緩存,用于判斷是否有手動按鍵,1為有,0為無</p><p> keynum dw 1 ;按鍵編號緩存,用于提取對應(yīng)的按鍵位置 </p><p> delay_time dw 7000 ;延時緩存,用于播放時存入bx中來計數(shù)</p><p> ;------------自動演奏的歌曲頻率和延時---
50、------《卡農(nóng)》輕快改編版-----------</p><p> mus_freq dw 1112,990,882,833,742,661,742,833 ;聲音頻率部分</p><p> dw 882,833,742,661,589,556,589,495</p><p> dw 882,833,882,441,416
51、,661,556,589,441,882,833,742,833,1113,1322,1484</p><p> dw 1178,1112,990,1178,1178,1112,882,833,742,661,589,556,495,589,556,495</p><p> dw 441,495,556,589,661,495,661,589,556,742,661,589,661,5
52、89,556,495</p><p> dw 441,371,742,833,882,833,742,661,589,556,495,742,661,742,661,589</p><p> dw 556,1112,990,882,990,882,1112,990,1178</p><p> dw 1322,1112,1178,1322,1112,1178,1
53、322,661,742,833,882,990,1112,1178</p><p> dw 1112,882,990,1112,556,589,661,742,661,589,661,556,589,661</p><p> dw 589,742,661,589,556,495,556,495,441,495,556,589,661,742</p><p>
54、dw 589,742,661,742,833,882,661,742,833,882,990,1112,1178,1322</p><p> dw 1112,882,990,1112,990,882,990,833,882,990,1112,990,882,833</p><p> dw 882,742,833,882,441,495,556,589,556,495,556,882,8
55、33,882</p><p> dw 742,882,833,742,661,589,661,589,556,589,661,742,833,882</p><p> dw 742,882,833,882,833,742,833,882,990,882,833,882,742,883</p><p> dw 1112,556,589,556,495,990,1
56、112,990,882,556,441,742,661,330,294,330</p><p> dw 371,742,833,742,833,330,294,330,371,742,661,742,833,833,742,833</p><p> dw 441,882,990,880,833,416,441,416,371,742,661,742,833,416,556,495<
57、;/p><p> dw 441,882,990,1178,1112,556,661,1112,882,1178,1112,1178,990,661,589,661</p><p> dw 556,882,833,882,556,661,661,742,883,661</p><p> dw 556,882,1112,1178,882,1112,1112,990,8
58、82,833</p><p> dw 742,742,661,742,833,882,1112,990,882,1178</p><p> dw 1322,1178,1112,990,1112,990,882,833,882,833,742,661,742,661,589,556</p><p> dw 589,589,495,441</p>&
59、lt;p><b> dw 441</b></p><p> dw -1 ;以后以-1來判斷是否結(jié)束</p><p> ;----------------------------聲音節(jié)拍部分,32為一拍------------------------</p><p
60、> mus_time dw 16 dup(32),64 dup(8) </p><p> dw 16,16,32,32,32,16,16,16,16 </p><p> dw 8 dup(8,4,4,8,4,4,8 dup(4)) </p><p> dw 64 dup(8)</p><p>
61、 dw 6 dup(8,4,4,8,8) </p><p> dw 20 dup(8),32 </p><p><b> data ends</b></p><p> ;************************************代碼段*********************************</p>
62、<p> code segment</p><p> assume ds:data,cs:code</p><p> ;-------------------------主程序-----------------------</p><p> ;---依次調(diào)用:開場效果--初始化--鍵盤掃描--按鍵處理程序-------------</p&g
63、t;<p> main proc far</p><p><b> start:</b></p><p> call show_load ;調(diào)用進度條顯示程序</p><p> ;---延時20*waitf---- </p><
64、;p><b> push bx</b></p><p><b> mov bx,20</b></p><p><b> del: </b></p><p> call waitf</p><p><b> dec bx</b></p
65、><p><b> jnz del</b></p><p><b> pop bx</b></p><p> ;------------重新開始------- </p><p> restart: ;自動播放音樂時,按‘enter’鍵或音樂完全結(jié)束后會返回
66、這里</p><p> call init;調(diào)用初始化程序</p><p> new_scan: ;鍵盤掃描程序沒有檢測到功能鍵被按下時,會返回這里</p><p> call scan_key ;調(diào)用鍵盤掃描程序,掃描所按下的鍵</p><p> ;-----------按鍵
67、處理-------</p><p> call do_key</p><p> ;----重新掃描---</p><p> jmp new_scan ;重新掃描有無鍵按下,直到按下esc鍵</p><p><b> main endp</b></p><p><b>
68、 6 運行結(jié)果分析</b></p><p> 電子琴界面如圖6-1所示。</p><p> 圖6-1 電子琴界面</p><p> 電子琴播放預(yù)存音樂時的界面如圖6-2所示。</p><p> 相比初始界面,播放預(yù)存音樂時,右上角的第一個燈變綠了,上面和左右兩邊的點開始閃爍,且每播放一個音符,界面下方就多了"I"一個符號
69、。</p><p> 圖6-2 電子琴播放預(yù)存音樂的界面</p><p><b> 7 調(diào)試過程記錄</b></p><p> 在程序調(diào)試的過程中,遇到最大的問題就是,寄存器的值變幻無常,容易出錯。</p><p> 原因:程序結(jié)構(gòu)過于復(fù)雜,使用寄存器比較頻繁,以及使用了BIOS中斷程序,這樣會導(dǎo)致其它與之相關(guān)寄
70、存器的值的改變。</p><p> 解決辦法:堆棧是保護環(huán)境的主要工具,一旦用錯,后果將很嚴(yán)重,比如我們在調(diào)試程序的過程中,遇到過這樣的問題:在一個函數(shù)的開始,我先用PUSH把所有寄存器入棧了,在函數(shù)的執(zhí)行中,我又把一個寄存器PUSH到棧中保存,卻忘記了在執(zhí)行POP指令之前把它恢復(fù)出來!這樣就造成了所有的寄存器的值都的生了變化。PUSH了一個變量之后在新的PUSH來臨之前如果又有POP別的變量的語句,一定會出問
71、題!解決的辦法只有一個,把PUSH和POP對上號。</p><p><b> 8 課程設(shè)計小結(jié)</b></p><p> 在本次設(shè)計中,可以說是一次成功的經(jīng)驗。在學(xué)完了《微型原理與接口技術(shù)》這門課的基礎(chǔ)上來搞做這個設(shè)計,使我對這門課的理論知識的理解有很大程度上的加強。微機原理這門課程本身是一門實驗性和工程性很強的專業(yè)技術(shù)課,因此不僅要重視理論教學(xué),更應(yīng)注意實踐技能
72、的培養(yǎng)和訓(xùn)練。課程設(shè)計是這門課程的一個重要環(huán)節(jié),通過課程設(shè)計,鞏固、加深和拓寬了學(xué)習(xí)的理解,使自己的分析、設(shè)計和調(diào)試8086微機系統(tǒng)的能力得到了進一步的提高。</p><p> 通過整整一個星期的摸索和編程,查資料,終于把程序完成了,和小組的成員一起討論問題,分析問題,發(fā)現(xiàn)問題,解決問題,也收獲了不少,我們的編程技術(shù)都有所提高,我們的體會就是:要提高自己的編程能力,你必須親自去體驗、去設(shè)計、編輯、編譯、調(diào)試、運
73、行。每一個程序員都是在失敗、嘗試、失敗、嘗試與收獲中成長起來的。</p><p> 在設(shè)計過程中,對不同方案的構(gòu)思、分析、比較到最后的定案,這些工作,培養(yǎng)了我們的分析問題,解決問題和創(chuàng)新的能力。在方案確定后,在軟件編程方面,對編寫的程序經(jīng)上機實踐和調(diào)試,對存在的問題進行反復(fù)修改,使其達到了最優(yōu)方案。這樣的編程機會在平時是很少有的,所以,在編程方面我們得到了很多的鍛煉,使自己更加熟悉了匯編語言,了解了編程思想,為
74、以后的學(xué)習(xí)以及工作打下了扎實的基礎(chǔ)。</p><p> 我認(rèn)為,在這次的課程設(shè)計中,不但做出了一個符合要求的電子琴,而且為自己積累了一筆有用的財富。</p><p><b> 參考文獻</b></p><p> [1] 龔尚福.微機原理與接口技術(shù).西安電子科技大學(xué)出版社,2003.8</p><p> [2] 李
75、芷.微機原理與接口技術(shù).電子工業(yè)出版社,2002 </p><p> [3] 錢曉捷.匯編語言程序設(shè)計(第二版).電子工業(yè)出版社,2003</p><p> [4] 宋杰等.微機原理與接口技術(shù)課程設(shè)計.北京 :機械工業(yè)出版社 ,2005</p><p> [5] 楊立,鄧振杰,荊淑霞等.微型計算機原理與接口技術(shù)(第二版).北京:中國鐵道出版
76、社,2006</p><p> [6] 小捷. 匯編語言程序設(shè)計. 第2版. 西安:西安電子科技大學(xué)出版社,2003</p><p><b> 附錄</b></p><p> ;**********************************矩形繪制宏*******************************</p>
77、<p> draw macro start_x,start_y,end_x,end_y,color</p><p> local draw_next</p><p> ;local :避免宏重復(fù)調(diào)用時,標(biāo)號的重復(fù)</p><p> ;功能:畫填充的矩形</p><p> ;使用條件:start_x < end_x
78、,start_y < end_y</p><p> push ax ;堆棧</p><p><b> push bx</b></p><p><b> push cx</b></p><p><b&g
79、t; push dx</b></p><p> mov ah,0ch ;12號功能,寫像素</p><p> mov al,color ;取顏色值</p><p> mov bh,0
80、 ;頁號0</p><p> mov cx,start_x ;列起始點</p><p> mov dx,start_y ;行起始點</p><p> draw
81、_next:</p><p> int 10h ;畫點</p><p> inc cx ;畫橫線</p><p> cmp cx,end_x
82、 ;比較行是否畫完</p><p> jne draw_next ;畫另一行</p><p> mov cx, start_x ;另一行的起始點</p><p> inc dx
83、 ;下一行</p><p> cmp dx,end_y ;比較列是否畫完</p><p> jne draw_next ;未完繼續(xù)畫</p><p> pop
84、 dx ;出棧</p><p><b> pop cx</b></p><p><b> pop bx</b></p><p><b> pop ax</b></p><p><b&
85、gt; endm</b></p><p> ;********************************矩形點陣?yán)L制宏****************************</p><p> draw_point macro start_x,start_y,end_x,end_y,color</p><p> local draw_nex
86、t</p><p> ;local :避免宏重復(fù)調(diào)用時,標(biāo)號的重復(fù)</p><p><b> ;功能:畫矩形點陣</b></p><p> ;使用條件:start_x < end_x ,start_y < end_y</p><p><b> push ax</b></p&
87、gt;<p><b> push bx</b></p><p><b> push cx</b></p><p><b> push dx</b></p><p> mov ah,0ch ;12號功能,寫
88、像素</p><p> mov al,color ;設(shè)置顏色</p><p> mov bh,0 ;頁號0</p><p> mov cx,start_x
89、 ;列起始點</p><p> mov dx,start_y ;行起始點</p><p> draw_next:</p><p> int 10h ;畫點</p><p&g
90、t;<b> inc cx</b></p><p> inc cx ;隔一點</p><p> cmp cx,end_x ;比較行是否畫完</p><p> jne draw_n
91、ext ;畫另一行</p><p> mov cx, start_x ;另一行的起始點</p><p><b> inc dx</b></p><p> inc dx
92、 ;隔一行</p><p> cmp dx,end_y ;比較列是否畫完</p><p> jne draw_next ;未完繼續(xù)畫</p><p><b>
93、; pop dx</b></p><p><b> pop cx</b></p><p><b> pop bx</b></p><p><b> pop ax</b></p><p><b> endm</b></p>
94、<p> ;****************************矩形框繪制宏****************************</p><p> drawsqre macro start_x,start_y,end_x,end_y,color</p><p> local row_up,row_down,rank_left,rank_right</p>
95、;<p> ;--功能:畫矩形框。</p><p><b> push ax</b></p><p><b> push bx</b></p><p><b> push cx</b></p><p><b> push dx</b>
96、;</p><p><b> push si</b></p><p> mov ah,0ch ;12號功能,寫像素</p><p> mov al,color</p><p><b> mov bh,0</b><
97、;/p><p> mov cx,start_x</p><p> mov dx,start_y</p><p> row_up: ;畫上邊</p><p><b> int 10h</b></p><
98、p><b> inc cx</b></p><p> cmp cx,end_x</p><p> jne row_up</p><p> rank_right: ;畫右邊</p><p><b> int
99、10h</b></p><p><b> inc dx</b></p><p> cmp dx,end_y</p><p> jne rank_right</p><p> mov cx, start_x ;下邊起始點</p&g
100、t;<p> mov si,end_x</p><p><b> inc si</b></p><p> row_down: ;畫下邊</p><p><b> int 10h</b></p>&l
101、t;p><b> inc cx</b></p><p><b> cmp cx,si</b></p><p> jne row_down</p><p> mov dx,start_y ;左邊起始點</p><p>
102、 mov cx,start_x</p><p> rank_left: ;畫左邊</p><p><b> int 10h</b></p><p><b> inc dx</b></p><p>
103、cmp dx, end_y</p><p> jne rank_left</p><p><b> pop si</b></p><p><b> pop dx</b></p><p><b> pop cx</b></p><p><b&
104、gt; pop bx</b></p><p><b> pop ax</b></p><p><b> endm</b></p><p> ;********************琴鍵處理程序********************</p><p> do_key proc
105、near</p><p> ;---顯示按下---</p><p> push bx ;bx入棧</p><p> mov bx,keynum ;取按鍵編號緩存值,存入bx</p><
106、p> call key_down ;在屏幕上顯示按下狀態(tài)</p><p> ;----按下時琴身點陣顏色改變--純白--</p><p> draw_point 40,52,44,92,0fh ;調(diào)用矩形點陣宏,繪制音響孔左點陣</p><p>
107、; draw_point 288,52,292,92,0fh ;調(diào)用矩形點陣宏,繪制音響孔右點陣</p><p> draw_point 150,34,282,38,0fh ;調(diào)用矩形點陣宏,繪制正面音孔點陣 </p><p> pop bx
108、 ;bx出棧 </p><p> ;---發(fā)出聲音---</p><p> lea bx,tune ;裝入對應(yīng)頻率段地址到bx中</p><p> push si ;si入棧</p><p> mo
109、v si,keynum ;取按鍵編號緩存值,存入si</p><p> mov di,[bx+si] ;取對應(yīng)編號的音符頻率值,存入di</p><p> call play_hand ;調(diào)用手動發(fā)聲程序</p><p> pop si
110、 ;出棧</p><p> ;---顯示彈起---</p><p><b> push bx</b></p><p> mov bx,keynum ;在屏幕上顯示彈起狀態(tài)</p><p> cal
111、l key_up</p><p> ;----按下時琴身點陣顏色恢復(fù)--灰色--</p><p> draw_point 40,52,44,92,07h ;調(diào)用矩形點陣宏,繪制音響孔左</p><p> draw_point 288,52,292,92,07h ;調(diào)用矩形點陣宏,繪制音
112、響孔右</p><p> draw_point 150,34,282,38,07h ;調(diào)用矩形點陣宏,繪制正面音孔 </p><p><b> pop bx</b></p><p> mov key_tune,0 ;恢復(fù)按鍵狀態(tài)緩存,</p&g
113、t;<p><b> ;-------</b></p><p><b> ret</b></p><p> do_key endp</p><p> ;******************************手動演奏發(fā)聲程序**************************</p>
114、<p> ;--功能:當(dāng)手動按鍵時,播放相應(yīng)鍵的聲音,只要不放開,就會一直播放。</p><p> ;--在di中存放發(fā)聲頻率。</p><p> play_hand proc near</p><p> ;-----------</p><p><b> push ax</b></p&g
115、t;<p><b> push bx</b></p><p><b> push cx</b></p><p><b> push dx</b></p><p><b> push di</b></p><p> ;--------
116、---</p><p> mov al,0b6h ;在8253的43端送出一個控制字0b6h(10110110b)</p><p> out 43h,al ;從而對定時器2初始化,準(zhǔn)備接收計數(shù)初值</p><p> mov dx,12h ;1.1931Mhz/給定頻率=12348h/給定頻率=計數(shù)初值</p>
117、<p> mov ax,348ch ;12348h存入DX:AX中,作32位運算,商存入AX,余數(shù)存入DX </p><p> div di ;di中存放給定頻率</p><p> out 42h,al </p><p> in al,61h ;開揚聲器</p><p>
118、; mov al,ah ;給定時器2寫入AX中存放的計數(shù)初值</p><p> out 42h,al </p><p> in al,61h </p><p> mov ah,al ;把8255輸出端的61h的0、1兩位置1,并把端口狀態(tài)存入ah</p><p> or a
119、l,3 ;打開揚聲器</p><p> out 61h,al </p><p> ;----------------按鍵等待------------</p><p><b> wait1: </b></p><p> call waitf;調(diào)用延時</p>
120、;<p> in al,60h ;讀取鍵盤掃描碼,按下和放開都有相應(yīng)的掃描碼,放開碼=按下碼+80h>80h</p><p> test al,80h ;al和80h相與,影響標(biāo)志位</p><p> jz wait1;未放開則繼續(xù)延時</p><p> mov al,ah;恢復(fù)8255
121、端口61h的狀態(tài),關(guān)揚聲器</p><p> out 61h,al</p><p> ;----------------</p><p> pop di ;恢復(fù)寄存器狀態(tài)</p><p><b> pop dx </b></p><p><b> pop
122、cx</b></p><p><b> pop bx</b></p><p><b> pop ax</b></p><p> ;----------</p><p><b> ret</b></p><p> play_hand
123、endp</p><p> ;******************************自動播放發(fā)聲程序**************************</p><p> ;--功能:自動播放音樂時發(fā)聲。</p><p> play_auto proc near</p><p> ;-----------------</p
124、><p> push ax ;保存寄存器狀態(tài)</p><p><b> push bx</b></p><p><b> push cx</b></p><p><b> push dx</b></p><p><b>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微機原理課程設(shè)計--電子琴設(shè)計
- 微機原理課程設(shè)計---電子琴設(shè)計
- 微機原理課程設(shè)計--設(shè)計簡易電子琴
- 微機課程設(shè)計電子琴
- 微機原理課程設(shè)計---計算機仿真電子琴
- 微機原理課程設(shè)計--計算機仿真電子琴
- 《微機原理與接口技術(shù)》課程設(shè)計--簡易電子琴設(shè)計
- 電子琴及電子播放器-微機原理課程設(shè)計報告
- 微機系統(tǒng)與接口課程設(shè)計-電子琴
- 電子琴課程設(shè)計
- 微機原理與接口技術(shù)課程設(shè)計報告——電子琴
- 課程設(shè)計--電子琴
- 電子琴課程設(shè)計
- 電子琴課程設(shè)計---電子琴的設(shè)計與實現(xiàn)
- 接口課程設(shè)計電子琴
- 簡易電子琴課程設(shè)計
- 簡易電子琴課程設(shè)計
- 簡易電子琴課程設(shè)計
- 電子琴課程設(shè)計報告
- 電子琴的課程設(shè)計
評論
0/150
提交評論