北郵微原硬件實(shí)驗(yàn)報告_第1頁
北郵微原硬件實(shí)驗(yàn)報告_第2頁
北郵微原硬件實(shí)驗(yàn)報告_第3頁
北郵微原硬件實(shí)驗(yàn)報告_第4頁
北郵微原硬件實(shí)驗(yàn)報告_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 微機(jī)原理硬件實(shí)驗(yàn)報告2015-2016學(xué)年第一學(xué)期微機(jī)原理硬件實(shí)驗(yàn)報告學(xué)院: 班級:學(xué)號:姓名: 序號:目錄實(shí)驗(yàn)一 熟悉實(shí)驗(yàn)環(huán)境及IO的使用3一 實(shí)驗(yàn)?zāi)康?二 實(shí)驗(yàn)內(nèi)容3三 實(shí)驗(yàn)過程31 實(shí)驗(yàn)原理32 流程圖33 源代碼44 子程序清單65 代碼分析6四 實(shí)驗(yàn)總結(jié)6實(shí)驗(yàn)二 8255A并行接口應(yīng)用7一 實(shí)驗(yàn)?zāi)康?二 實(shí)驗(yàn)內(nèi)容7三 實(shí)驗(yàn)過程71 八位數(shù)碼管位選規(guī)律72 六位數(shù)碼管靜態(tài)顯示83 六位數(shù)碼管動態(tài)顯示114 擴(kuò)展:顯示鍵盤輸入學(xué)號15四 實(shí)驗(yàn)總結(jié)21實(shí)驗(yàn)三 8253計數(shù)器/定時器的應(yīng)用22一 實(shí)驗(yàn)?zāi)康?2二 實(shí)驗(yàn)內(nèi)容22三 實(shí)驗(yàn)過程221 蜂鳴器發(fā)音規(guī)律222 音樂發(fā)生器233 擴(kuò)展:

2、小鍵盤彈琴功能32四 實(shí)驗(yàn)總結(jié)38實(shí)驗(yàn)一 熟悉實(shí)驗(yàn)環(huán)境及IO的使用一 實(shí)驗(yàn)?zāi)康?通過實(shí)驗(yàn)了解和熟悉實(shí)驗(yàn)臺的結(jié)構(gòu),功能及使用方法。2通過實(shí)驗(yàn)掌握直接使用Debug的I、O命令來讀寫I/O端口。3學(xué)會Debug的使用及編寫匯編程序。二 實(shí)驗(yàn)內(nèi)容1學(xué)習(xí)使用Debug命令,并用I、O命令直接對端口進(jìn)行讀寫操作。2用匯編語言編寫跑馬燈程序。實(shí)現(xiàn)功能:1)通過讀入端口狀態(tài),選擇工作模式(燈閃爍方式、速度等);2)通過輸出端口控制燈的工作狀態(tài)(低電平燈亮)。三 實(shí)驗(yàn)過程1 實(shí)驗(yàn)原理1在Debug下,用I是命令讀輸入端口的狀態(tài),即撥碼開關(guān)的狀態(tài),用O命令向端口輸出數(shù)據(jù),通過LED發(fā)光管來查看。測試結(jié)果:1)使

3、用命令:I 0EEE0H讀取開關(guān)狀態(tài),得出的結(jié)果為左低右高,即 S0 是低位,S7 是高位。2)實(shí)驗(yàn)命令:O 0EEE0H測試LED,改變輸入的值可依次測試各個數(shù)碼管是否正常。LED左邊為高位,右邊為低位。2分析以下程序段的作用MOV AH, 0BHINT 21HOR AL,ALJZ 0100INT 20H該段程序?qū)崿F(xiàn)了檢測鍵盤狀態(tài),在鍵盤有任意鍵輸入時退出程序返回DOS的功能。該實(shí)現(xiàn)依賴于0BH號中斷調(diào)用和巧妙使用程序入口返回地址直接返回。在DOS的DEBUG模式下,地址不用添加十六進(jìn)制H標(biāo)志。地址默認(rèn)為16進(jìn)制,多寫了反而畫蛇添足產(chǎn)生錯誤。普通數(shù)據(jù)為了區(qū)分需要添加H。2 流程圖3 源代碼D

4、ATA SEGMENTPORT EQU 0EEE0HDATA ENDSSTACK SEGMENT STACK'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKBEGIN: MOV AX,DATAMOV DS,AXMOV AL,07FH ;01111111MOV DX,PORT MOV SI,2 START: PUSH AX;入棧保存IN AL,DX;讀取撥碼開關(guān)狀態(tài)MOV BL,AL;BL存儲撥碼開關(guān)狀態(tài)POP AX;出?;謴?fù)TEST BL,10H;00010000.判斷左數(shù)第五個撥

5、碼開關(guān)的狀態(tài),;實(shí)現(xiàn)燈型的變化JNZ TWO;ON狀態(tài)為兩個燈CMP SI,1;判斷AL狀態(tài)JZ CONT;SI等于1時AL有兩位為0,應(yīng)恢復(fù)為只有一位為0, MOV AH,ALROR AH,1OR AL,AHMOV SI,2;AL恢復(fù)為只有一位為0,SI變?yōu)?JMP CONTTWO:CMP SI,2JZ CONT;SI為2時只有AL只有1位為0,應(yīng)對其變換MOV AH,ALROR AH,1AND AL,AH;AL有兩位為0MOV SI,1CONT:OUT DX,ALTEST BL,08H;00001000.判斷第四個撥碼開關(guān)的狀態(tài),實(shí)現(xiàn)暫停JNZ START;ON狀態(tài)實(shí)現(xiàn)暫停TEST BL,

6、02H;00000010.判斷第二個撥碼開關(guān)的狀態(tài),;實(shí)現(xiàn)速度的變化JNZ HIGHSP;ON狀態(tài)實(shí)現(xiàn)高速M(fèi)OV BP,0200H;低速狀態(tài)時延JMP MOVEHIGHSP:MOV BP,0100H;高速狀態(tài)時延MOVE:CALL DELAYTEST BL,04H;判斷第三個撥碼開關(guān)的狀態(tài),實(shí)現(xiàn)方向的變化JNZ LEFT;ON狀態(tài)為方向向左RIGHT:ROR AL,1;右移,以備點(diǎn)亮下一盞燈JMP EXITLEFT:ROL AL,1;左移,以備點(diǎn)亮下一盞燈EXIT:TEST BL,01H;判斷第一個撥碼開關(guān)的狀態(tài)JZ START;OFF狀態(tài)繼續(xù)運(yùn)行,ON狀態(tài)實(shí)現(xiàn)退出MOV AL,0FFH;實(shí)現(xiàn)

7、全滅 OUT DX, ALMOV AH,4CHINT 21HDELAYPROC MOV CX,BP;BP越大延時次數(shù)越多,速度越慢LOOP1:PUSH CXMOV CX,0FFFFHLOOP2:LOOP LOOP2POP CXLOOP LOOP1RETDELAYENDPCODEENDSEND BEGIN4 子程序清單1)子程序名:DELAY功能:實(shí)現(xiàn)延遲顯示,即控制每個LED點(diǎn)亮持續(xù)一定時間;入口參數(shù):BP,賦值給CX控制循環(huán)次數(shù),從而實(shí)現(xiàn)速度的控制;出口參數(shù):無;使用寄存器:CX,BP。5 代碼分析1)通過讀取撥碼開關(guān)地址獲得撥碼開關(guān)狀態(tài),將該狀態(tài)的值賦給BL,實(shí)現(xiàn)對燈型、暫停、速度、方向以

8、及退出的控制。2)燈型的控制:通過相應(yīng)撥碼開關(guān)的狀態(tài)選擇燈型。燈型一共有兩種,第一種為每次亮一盞燈,此時控制輸出的寄存器AL中的值只有一位為0,其余七位為1;第二種為每次亮兩盞燈,此時控制輸出的寄存器AL中的值兩位為0,其余六位為1。使用寄存器SI表示當(dāng)前寄存器AL中0的個數(shù),當(dāng)SI的值與控制燈型的信息不一致時,通過邏輯與/邏輯或的操作,修改AL的值。3)暫停的控制:通過相應(yīng)撥碼開關(guān)的狀態(tài)判斷是否執(zhí)行暫停操作。當(dāng)需要暫停時,控制輸出的寄存器AL中的值保持不變,當(dāng)不需要暫停時,控制輸出的寄存器AL中的值循環(huán)左移/循環(huán)右移。4)速度的控制:通過相應(yīng)撥碼開關(guān)的狀態(tài)判斷速度的大小。在不同的狀態(tài)下,對B

9、P賦不同的值,BP作為DELAY子程序的入口參數(shù)控制延時的時間從而實(shí)現(xiàn)速度的變化。BP越大,則外循環(huán)次數(shù)越多,所耗時間越長,每個LED點(diǎn)亮持續(xù)時間越久,即速度越慢。5)方向的控制:通過相應(yīng)撥碼開關(guān)的狀態(tài)判斷方向。在不同的狀態(tài)下,對控制輸出的寄存器AL中的值循環(huán)左移/循環(huán)右移,即可控制顯示的方向。6)退出的控制:通過相應(yīng)撥碼開關(guān)的狀態(tài)判斷是否退出程序。四 實(shí)驗(yàn)總結(jié)雖然本次實(shí)驗(yàn)是第一次微原硬件實(shí)驗(yàn),但是在此之前已經(jīng)有了一定的軟件編程基礎(chǔ),并且在VHDL實(shí)驗(yàn)中我們也曾編寫過跑馬燈實(shí)驗(yàn),因而實(shí)驗(yàn)之前對實(shí)驗(yàn)原理及代碼結(jié)構(gòu)有初步的掌握。實(shí)驗(yàn)過程中我們按照講義中的要求先對撥碼開關(guān)及LED進(jìn)行了測試,便捷了之

10、后程序的編寫??偠灾?,通過本次實(shí)驗(yàn),我們對利用匯編語言對硬件進(jìn)行編程有了一定的掌握,對后續(xù)實(shí)驗(yàn)的開展奠定了良好的基礎(chǔ)。實(shí)驗(yàn)二 8255A并行接口應(yīng)用一 實(shí)驗(yàn)?zāi)康?掌握8255A的功能及方式0、1的實(shí)現(xiàn)。2熟悉8255A與CPU的接口,以及傳輸數(shù)據(jù)的工作原理及編程方法。3了解七段數(shù)碼管顯示數(shù)字的原理。4掌握同時顯示多位數(shù)字的技術(shù)。二 實(shí)驗(yàn)內(nèi)容1八段數(shù)碼管的顯示規(guī)律及數(shù)碼管的位選規(guī)律。.2六位數(shù)碼管靜態(tài)顯示。在數(shù)碼管電路上靜態(tài)地顯示6位學(xué)號,當(dāng)主機(jī)鍵盤按下任意鍵時,停止顯示,返回DOS。3六位數(shù)碼管動態(tài)顯示。要求在數(shù)碼管電路16位數(shù)碼管上,動態(tài)顯示字符串HELLO,當(dāng)主機(jī)鍵盤按下任意鍵時結(jié)束。4

11、擴(kuò)展部分:完成掃描鍵盤(PC口)輸入自己的學(xué)號,并在數(shù)碼管上顯示。三 實(shí)驗(yàn)過程1 八位數(shù)碼管位選規(guī)律在方式0(輸入/輸出)下,以A口為輸出口,B口為輸出口, A口接六個共陰極數(shù)碼管的八位段碼,高電平點(diǎn)亮數(shù)碼管的某一段,B口接數(shù)碼管的位選(即要使哪個數(shù)碼管亮),高電平選中某一位數(shù)碼管點(diǎn)亮。測試結(jié)果如下圖:根據(jù)上述測試結(jié)果,不難得出0-9對應(yīng)的編碼,如下表:字形0123456789編碼0EDH21H0F4H0F1H39H0D9H0DDH61H0FDH0F9H2 六位數(shù)碼管靜態(tài)顯示2.1 實(shí)驗(yàn)原理1)電路6個數(shù)碼管的同名陽極段已經(jīng)復(fù)接,當(dāng)段選寄存器寄存了一個字型編碼之后,6個數(shù)碼管都將顯示出相同的數(shù)

12、字。如果要使6個數(shù)碼管“同時”顯示不同的數(shù)字,必須采用掃描顯示的方法。2)通過選位寄存器選擇某一位數(shù)碼管,顯示其數(shù)字(對應(yīng)段值為1),然后關(guān)閉此數(shù)碼管,再選擇下一位數(shù)碼管進(jìn)行顯示;如果在一秒鐘內(nèi),每一位數(shù)碼管都能顯示30次以上,則人眼看到的是幾位數(shù)碼管同時在顯示。實(shí)驗(yàn)證明,在掃描顯示過程中,每一位顯示延遲1ms是最佳選擇。3)在本次實(shí)驗(yàn)中,采用行掃描方式,一次掃描6位數(shù)碼管,并進(jìn)行反復(fù)循環(huán),使得每位數(shù)碼管顯示雖然存在間隔,但人眼仍為同時顯示。每位數(shù)碼管顯示的時間即為顯示延遲,在每一次掃面之后檢測鍵盤狀態(tài),若有任意鍵輸入,便退出返回DOS界面。2.2 流程圖2.3 源代碼DATA SEGMENT

13、NUM DB 0F4H,21H,0EDH,0DDH,39H,61H;學(xué)號后六位為210647DATA ENDS;-STACK SEGMENT STACK 'STACK'DB 100 DUP(0)STACK ENDS;-CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTAT:MOV AL,10000000B;A,B,C口均以方式0輸出MOV DX,0EE03H ;設(shè)置控制地址OUT DX,AL;送控制字到控制地址MOV AX,DATAMOV DS,AX ;設(shè)置段地址MOV ES,AXLOP1:XOR SI,SI ;SI清零MOV CX,06

14、H ;循環(huán)6次,即一個周期6位數(shù)碼管MOV DX,0EE00H ;A口的地址賦給DX,A口接八位段碼MOV BL,00000001B ;高電平即選中該位數(shù)碼管點(diǎn)亮LOP2:MOV AL,NUMSI ;將需要顯示的數(shù)字賦給ALOUT DX,AL ;送AL輸出至A端口MOV AL,BL ;將控制哪一位亮的功能賦給ALINC DX;B口的地址賦給DX,B口接六位數(shù)碼管OUT DX,AL;送AL輸出至B端口,完成指定位顯示指定數(shù)字DEC DX;重新將A口地址賦給DXROL BL,1 ;循環(huán)移位,控制下一位數(shù)碼管亮INC SI;SI加1,使得下次顯示中改變所顯示的數(shù)字CALL DELAY ;延時,即每位

15、數(shù)碼管點(diǎn)亮的時間CALL KEY ;判斷是否有鍵盤輸入LOOP LOP2 ;循環(huán)6次,6位數(shù)碼管依次按要求點(diǎn)亮JMP LOP1;循環(huán),重新于第一位開始點(diǎn)亮;- DELAY PROC NEAR ;延時程序,雙重循環(huán)PUSH BX;BX入棧,保留BX寄存器中的數(shù)據(jù)PUSH CX;CX入棧,保留CX寄存器中的數(shù)據(jù)MOV BX,000BH ;BX重新賦值LOP3: MOV CX,00H ;CX重新賦值LOOP $;每循環(huán)一次,CX自減1,直至結(jié)果為0,即FF次DEC BX;BX減1JNZ LOP3 ;結(jié)果為0時停止,即循環(huán)11次POP CX;CX中數(shù)據(jù)恢復(fù)為入棧前的值POP BX;BX中數(shù)據(jù)恢復(fù)為入棧

16、前的值RETDELAY ENDP;- KEY PROC NEAR ;判斷是否有鍵盤輸入PUSH AX;AX入棧,保留BX寄存器中的數(shù)據(jù)MOV AH,0BH ;檢查輸入設(shè)備狀態(tài)INT 21HOR AL,AL;無輸入字符AL為00H,有輸入為FFHJZ GOON ;全為0即為無輸入,返回主程序MOV DX,0EE01HMOV AL,00HOUT DX,AL;完成B端口清零,即6位全滅MOV AH,4CH ;退出程序INT 21HGOON:POP AXRETKEY ENDP;- CODE ENDSEND STAT2.4 子程序清單1)子程序名:DELAY功能:實(shí)現(xiàn)延遲顯示,即控制每個LED點(diǎn)亮持續(xù)一

17、定時間;入口參數(shù):無;出口參數(shù):無;使用寄存器:BX,CX,F(xiàn)R。2)子程序名:KEY功能:判斷是否有鍵盤輸入,若有則退出程序;入口參數(shù):無;出口參數(shù):無使用寄存器:AX,DX,F(xiàn)R。2.5 代碼分析1)靜態(tài)顯示的過程可以分為六個狀態(tài),在每個狀態(tài)中,只有一位數(shù)碼管工作,顯示對應(yīng)數(shù)字信息。系統(tǒng)循環(huán)進(jìn)行這六個狀態(tài),當(dāng)速度合適時有靜態(tài)顯示六位數(shù)字的效果。2)在數(shù)據(jù)段中定義NUM,在NUM中存入待顯示的“210647”六位數(shù)字,根據(jù)之前測試得其對應(yīng)編碼為0F4H,21H,0EDH,0DDH,39H和61H;CX表示循環(huán)次數(shù);SI表示顯示數(shù)字在NUM中的位置;BL控制數(shù)碼管的工作狀態(tài)。3)在每個狀態(tài)中,

18、將需要顯示的信息賦值給AL,送至8位段碼的A口輸出,然后將BL賦給AL,送至控制6位數(shù)碼管的B口輸出,從而使數(shù)碼管在不同的位置顯示數(shù)字信息。4)在每個狀態(tài)結(jié)束時,對BL做循環(huán)移位,SI自加1,調(diào)用延時函數(shù)控制顯示的速度。調(diào)用判斷鍵盤輸入函數(shù),延時之后若無鍵盤輸入,進(jìn)入下一狀態(tài)。如此循環(huán)完成6位數(shù)碼管的顯示。5)若循環(huán)一個周期仍無鍵盤輸入,則回到第一個狀態(tài)重新循環(huán),直至有鍵盤輸入。6)延時程序中,采用兩層嵌套循環(huán)實(shí)現(xiàn)延時。對BX,CX采用入棧操作后重新賦值,BX賦初值為000BH,CX為00H,內(nèi)循環(huán)為每循環(huán)一次,CX自減1,直至CX等于0,即內(nèi)循環(huán)FFFFH次,外循環(huán)為每循環(huán)一次,BX減一,當(dāng)

19、BX為0時終止循環(huán),即外循環(huán)0BH次,總共實(shí)現(xiàn)FFFFH*0BH次時跳出循環(huán),BX,CX恢復(fù)為原值后返回主程序,實(shí)現(xiàn)延時顯示。7)判斷有無鍵盤輸入時,調(diào)用DOS命令,AH為0BH即為判斷是否有鍵盤輸入,無字符輸入時AL為00H,與自身或操作之后結(jié)果仍全為0,返回主程序,若有字符輸入時AL與自身或操作之后結(jié)果不為0,對B端口輸出00H,即6位數(shù)碼管全滅之后退出程序。3 六位數(shù)碼管動態(tài)顯示3.1 實(shí)驗(yàn)原理1)數(shù)碼管動態(tài)顯示“HELLO”字符串,相當(dāng)于每次顯示6位靜態(tài)字符,每次顯示一定時間間隔之后,顯示另外6位靜態(tài)字符。具體如下圖所示:顯示0.5sH顯示0.5sHE顯示0.5sHEL顯示0.5sHE

20、LL顯示0.5sHELLO顯示0.5sHELLO顯示0.5s2)每次顯示靜態(tài)字符串的核心代碼與靜態(tài)顯示實(shí)驗(yàn)的代碼相同,因而可以將靜態(tài)顯示中的程序封裝為一個子程序直接使用。增加的功能為需要按一定時間間隔移位讀取“HELLO”,程序中通過將其前加入六個空字符,作為碼表存儲,第一次讀取為六個空字符,第二次為五個空字符和字符“H”,第三次為四個空字符和字符“HE”,依次類推,顯示時依次往后讀取即可。3)可以通過讀取撥碼開關(guān)輸入的狀態(tài),控制延時的時間,從而實(shí)現(xiàn)速度快慢的變化以及實(shí)現(xiàn)暫停的功能。3.2 流程圖3.3 源代碼DATASEGMENTMESGDB 0,0,0,0,0,0,3DH,0DCH,8CH

21、,8CH,0EDH,0 ;據(jù)顯示規(guī)律“HELLO”對應(yīng)碼表為3DH,0DCH,8CH,8CH,0EDHDATAENDS ;-STACKSEGMENT STACK 'STACK'DB 100 DUP(0)STACK ENDS ;-CODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK ;- MAIN PROC FARMOV AX,DATAMOV DS,AX;設(shè)置段地址MOV ES,AXMOV AL,80HMOV DX,0EE03H OUT DX,AL ;端口A,B,C均以方式0輸出LOP6:MOV BX,OFFSET MESG;設(shè)置偏移量MOV C

22、X,07H ;循環(huán)次數(shù),對應(yīng)7個狀態(tài)LOP5:MOV DX,0EEE0H ;撥碼開關(guān)狀態(tài)控制顯示速度IN AL,DX;讀撥碼開關(guān)狀態(tài)給ALINC AL;自加1,預(yù)防全0時不便延時AND AL,07H;取低三位的值XOR AH,AH;高八位清零MOV DX,AX ;DX表示顯示速度LOPZ:CALL DISP ;調(diào)用靜態(tài)顯示函數(shù)DEC DX ;DX為撥碼開關(guān)后三位狀態(tài),自減1JNZ LOPZ ;DX不為0時繼續(xù)顯示;DX越大同一狀態(tài)顯示時間越長,速度越慢INC BX ;自加1,BX指向下一狀態(tài)LOOP LOP5 ;循環(huán)7次,實(shí)現(xiàn)滾動效果JMP LOP6 ;每次循環(huán)結(jié)束后回到第一個狀態(tài)MAIN E

23、NDP;-DISP PROC NEAR ;將靜態(tài)顯示封裝為子程序PUSH CX;入棧保護(hù) PUSH DXPUSH AXMOV BP,000AH ;控制延時LOPX:XOR SI,SIMOV CX,06H ;循環(huán)6次,即依次點(diǎn)亮6位數(shù)碼管MOV DX,0EE00HMOV AH,00000001B ;一次只亮一位LOP2:MOV AL,MESGBX+SI;需要顯示的字符對應(yīng)的碼值賦給ALOUT DX,AL;完成段碼輸出MOV AL,AH ;控制第幾個數(shù)碼管工作INC DXOUT DX,AL ;完成位碼輸出DEC DXROL AH,1 ;下一個數(shù)碼管工作INC SICALL DELAY ;調(diào)用延時函

24、數(shù)實(shí)現(xiàn)每位數(shù)碼管的延時顯示CALL KEY ;調(diào)用判斷鍵盤輸入狀態(tài)的函數(shù)LOOP LOP2 ;如此循環(huán)直至數(shù)碼管依次被點(diǎn)亮DEC BP;自減1JNZ LOPX ;BP不為0則繼續(xù)循環(huán),即顯示的字符串不變POP AX;出?;謴?fù)POP DXPOP CXRET DISP ENDP;- KEY PROC NEAR ;判斷是否有鍵盤輸入PUSH AX;入棧保護(hù)MOV AH,0BHINT 21H;DOS調(diào)用,將鍵盤輸入信息賦給ALOR AL,ALJZ GOON ;若沒有輸入則繼續(xù)工作MOV DX=0EE00HMOV AL,00H;若有輸入則六個數(shù)碼管均不工作OUT DX,ALMOV AH,4CH ;退出程

25、序INT 21HGOON:POP AXRETKEY ENDP ;-DELAY PROC ;控制延時,兩層循環(huán)PUSH AX;入棧保護(hù)PUSH CXMOV AX,000BH ;外循環(huán)0BH次LOPD: MOV CX,0HLOOP $ ;內(nèi)循環(huán)FFFF次DEC AXJNZ LOPD POP CXPOP AX RETDELAY ENDP ;- CODE ENDSEND MAIN3.4 子程序清單1)子程序名:DELAY功能:實(shí)現(xiàn)延遲顯示,即控制每個LED點(diǎn)亮持續(xù)一定時間;入口參數(shù):無;出口參數(shù):無;使用寄存器:AX,CX,F(xiàn)R。2)子程序名:KEY功能:判斷是否有鍵盤輸入,若有則退出程序;入口參數(shù):

26、無;出口參數(shù):無;使用寄存器:AX,DX,F(xiàn)R。3)子程序名:DISP功能:靜態(tài)顯示6位指定字符;入口參數(shù):無;出口參數(shù):無;使用寄存器:AX,CX,DX,SI,BP,F(xiàn)R。3.5 代碼分析1)動態(tài)顯示的過程可以分為七個狀態(tài),在每個狀態(tài)中,靜態(tài)顯示六位數(shù)碼管信息。系統(tǒng)循環(huán)進(jìn)行這七個狀態(tài),當(dāng)速度合適時有動態(tài)顯示的效果。2)在數(shù)據(jù)段中定義MESG數(shù)組,依次存入“0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0”;CX表示循環(huán)次數(shù),對應(yīng)表中的七個狀態(tài);BX表示當(dāng)前需要顯示的狀態(tài),DX表示動態(tài)顯示的速度。3)將靜態(tài)顯示的程序封裝為子程序以供調(diào)用,在每個狀態(tài)中調(diào)用子程序DISP實(shí)現(xiàn)

27、六位數(shù)碼管的靜態(tài)顯示,調(diào)用子程序DELAY實(shí)現(xiàn)延時,調(diào)用子程序KEY判斷鍵盤有無輸入。4)每個狀態(tài)結(jié)束時,BX加1,表示進(jìn)入下一狀態(tài),如此循環(huán)完成數(shù)碼管的動態(tài)顯示。5)主程序中通過讀取撥碼開關(guān)狀態(tài),將其后三位賦給DX,并在子程序DISP返回時,自減實(shí)現(xiàn)延時。DX越大,循環(huán)時間越久,則對應(yīng)的滾動速度越慢。6)若循環(huán)一個周期仍無鍵盤輸入,則回到第一個狀態(tài)重新循環(huán),直至有鍵盤輸入。4 擴(kuò)展:顯示鍵盤輸入學(xué)號4.1 實(shí)驗(yàn)原理通過4*4鍵盤電路輸入學(xué)號,其控制原理如下:1)通過地址為EE02的端口C讀取鍵盤輸入,其中PC4、PC5、PC6、PC7分別接行輸入,PC3、PC2、PC1、PC0分別接列輸入。

28、此外,本次實(shí)驗(yàn)識別閉合鍵的方法為行掃描法,具體方法為使鍵盤某一行線為低電平,其余為高電平,然后讀取列值,如列值中有某位位低電平,則表明行列交叉點(diǎn)處的鍵被按下;否則掃描下行,直到掃完全部的行線為止。另外,在讀取按鍵輸入時需增添相應(yīng)的防抖代碼,以避免讀取誤差。2)基于上述方法,獲得低電平的行列交叉點(diǎn)為按鍵輸入,反饋其對應(yīng)的數(shù)字至數(shù)碼顯示輸出或執(zhí)行相應(yīng)的功能。4.2 流程圖1)主程序流程圖2)READ子程序4.3 源代碼DATA SEGMENTID DB 6 DUP(0);4*4鍵盤ARRAY DB 11100111B,11101011B,11101101B,11101110BDB 11010111

29、B,11011011B,11011101B,11011110BDB 10110111B,10111011B,10111101B,10111110BDB 01110111B,01111011B,01111101B,01111110BKEY DB 0EDH,21H,0F4H,0F1H,39H ;數(shù)字04對應(yīng)碼表DB 0D9H,0DDH,61H,0FDH,0F9H ;數(shù)字59對應(yīng)碼表 DATA ENDS ;-STACK SEGMENT STACK 'STACK'DB 100 DUP(0)STACK ENDS ;-CODE SEGMENTASSUME DS:DATA,CS:CODE,S

30、S:STACK ;- MAIN PROC FARMOV AX,DATAMOV DS,AX;設(shè)置段地址MOV ES,AXMOV DX,0EE03H MOV AL,16H;C口PC3復(fù)位OUT DX,ALCLEAR:XOR DX,DX ;DX表示已顯示/存儲數(shù)字的個數(shù)MOV CX,6;循環(huán)次數(shù),表示最多顯示/存儲的數(shù)字個數(shù)MOV AL,0XOR SI,SILOPC: MOV IDSI,AL ;將6位ID清零 INC SILOOP LOPCDELETE:NOPAGN1: CALL READ ;讀入按鍵信息CMP AL,0FFH ;判斷是否釋放按鍵(防抖動)JNE AGN1 ;未釋放則循環(huán) CMP D

31、X,0 ;當(dāng)前沒有顯示數(shù)字時跳過刪除操作JE NEXTDEC DX ;將存儲的數(shù)字減少一位MOV AL,0MOV SI,DXMOV IDSI,AL ;將顯示的最后一位數(shù)字清零 NEXT:CALL DISP ;調(diào)用靜態(tài)顯示函數(shù)CALL READ ;調(diào)用讀取鍵盤函數(shù)CMP AL,0FFH ;判斷鍵盤是否有輸入JE NEXT ;沒有輸入則循環(huán)保持原狀;鍵盤有輸入CLD ;設(shè)置字符串操作時DI自動加一MOV CX,16;循環(huán)次數(shù),表示鍵盤16個按鍵MOV DI,OFFSET ARRAY REPNZ SCASB ;尋找輸入的按鍵在鍵盤中的位置 MOV BX,OFFSET ARRAYSUB DI,BXDE

32、C DI;DI表示輸入按鍵的位置CMP DI,9 ;判斷鍵入是否為數(shù)字JBE ISNUM ;跳轉(zhuǎn)到顯示數(shù)字對應(yīng)程序CMP DI,12;判斷鍵入是否為清除鍵(C)JE CLEAR ;跳轉(zhuǎn)到清除對應(yīng)程序CMP DI,13 ;判斷鍵入是否為刪除鍵(D)JE DELETE;跳轉(zhuǎn)到刪除對應(yīng)程序CMP DI,14;判斷鍵入是否為退出鍵(E)JE EXIT ;跳轉(zhuǎn)到退出對應(yīng)程序JMP NEXT ISNUM:NOPAGN2: CALL READ ;讀入按鍵信息CMP AL,0FFH ;判斷是否釋放按鍵(防抖動)JNE AGN2 ;未釋放則循環(huán) ;釋放則進(jìn)行對應(yīng)操作MOV AL,KEYDIMOV SI,DXMO

33、V IDSI,AL ;將輸入數(shù)字儲存起來INC DXCALL DISP;調(diào)用靜態(tài)顯示函數(shù)CMP DX,7 ;判斷是否已經(jīng)顯示6位數(shù)字JE CLEAR;若已經(jīng)顯示6位數(shù)字,則下一次輸入時清零JMP NEXTEXIT:MOV AX,4C00H;退出程序INT 21HMAIN ENDP ;-READ PROC NEAR ;讀取鍵盤輸入PUSH DX;入棧保護(hù)MOV DX,0EE03H;A口、B口以及C口的高四位以方式0輸出,;C口低四位以方式0輸入MOV AL,81HOUT DX,ALMOV AL,00HMOV DX,0EE02HOUT DX,AL;C口高四位清零IN AL,DX ;讀取列信息 MO

34、V BL,AL;存儲列信息;-MOV DX,0EE03H;A口、B口以及C口的低四位以方式0輸出;C口高四位以方式0輸入MOV AL,88HOUT DX,ALMOV AL,00HMOV DX,0EE02HOUT DX,AL;C口低四位清零IN AL,DX ;讀取行信息OR AL,BL ;行列相與得到輸入信息,存在AL中POP DX;出棧恢復(fù)RET READ ENDP;-DISP PROC NEAR ;靜態(tài)顯示程序PUSH CX;入棧保護(hù)PUSH DXPUSH AXMOV BP,000FH;控制延時LOPP:XOR SI,SIMOV CX,06H;循環(huán)6次,即依次點(diǎn)亮6位數(shù)碼管MOV DX,0E

35、E00HMOV AH,00000001B;一次只亮一位LOPD:MOV AL,IDSI;需要顯示的字符對應(yīng)的碼值賦給ALOUT DX,AL;完成段碼輸出MOV AL,AH ;控制第幾個數(shù)碼管工作INC DXOUT DX,AL ;完成位碼輸出DEC DXROL AH,1;下一個數(shù)碼管工作INC SICALL DELAY ;調(diào)用延時函數(shù)實(shí)現(xiàn)每位數(shù)碼管的延時顯示LOOP LOPD;如此循環(huán)直至數(shù)碼管依次被點(diǎn)亮DEC BP ;自減1JNZ LOPP ;BP不為0則繼續(xù)循環(huán),即顯示的字符串不變POP AX ;出?;謴?fù)POP DXPOP CXRET DISP ENDP;- DELAY PROC ;控制延時

36、,兩層循環(huán)PUSH AX ;入棧保護(hù)PUSH CX MOV AX,0003H;外循環(huán)03H次LOP1: MOV CX,00HLOOP $;內(nèi)循環(huán)FFFF次DEC AXJNZ LOP1 POP CXPOP AX RETDELAY ENDP ;- CODE ENDSEND MAIN4.4 子程序清單 1)子程序名:READ功能:讀取鍵盤輸入信息,反饋給主程序;入口參數(shù):無;出口參數(shù): AL,存儲鍵盤輸入信息,反饋給主程序使用寄存器:AX,BL,DX。2)子程序名:DISP功能:靜態(tài)顯示指定字符;入口參數(shù):無;出口參數(shù):無;使用寄存器:AX,CX,DX,SI,BP,F(xiàn)R。3)子程序名:DELAY功能

37、:實(shí)現(xiàn)延遲顯示,即控制每個數(shù)碼管點(diǎn)亮持續(xù)一定時間;入口參數(shù):無;出口參數(shù):無;使用寄存器:AX,CX,F(xiàn)R。4.5 代碼分析1) 將4*4鍵盤各按鍵對應(yīng)的輸入信息按順序存儲在ARRAY中,數(shù)碼管中數(shù)字0-9對應(yīng)的碼表存儲在KEY中,定義數(shù)組ID,用以存儲鍵盤輸入的信息。2) 主程序開始時先進(jìn)行初始化,清空各存儲器信息,調(diào)用READ子程序,讀取鍵盤按鍵。將4*4鍵盤輸入送至端口C,先將C口高四位清零,低四位輸入至AL中,并將AL賦值給BL,再將C口低四位清零,高四位輸入至AL中,BL與AL相與,獲得最終輸入信息并存儲在AL中反饋給主程序。3) 對鍵盤輸入采用防抖程序,當(dāng)讀取到鍵盤有輸入時,讀取之

38、后判斷該按鍵是否釋放,若該按鍵未釋放,則一直循環(huán)讀取直至釋放后開始之后相應(yīng)的代碼執(zhí)行。通過防抖程序,避免了一次按鍵多次顯示的現(xiàn)象的出現(xiàn)。4) 主程序獲得輸入信息后,在ARRAY數(shù)組中尋找與之相同的輸入信息,從而獲得鍵盤輸入的按鍵在鍵盤中的位置。5) 若鍵盤輸入為數(shù)字0-9,則將其對應(yīng)的碼送入ID中存儲,并調(diào)用DISP子程序顯示,若鍵盤輸入為清零、刪除、退出等子程序,則進(jìn)入相應(yīng)的子程序完成其待完成的功能。6) 若鍵盤為顯示滿6個字符,則繼續(xù)上述步驟,讀取鍵盤信息,判斷位置,送入ID中存儲或執(zhí)行相應(yīng)功能;若鍵盤顯示已滿6個字符,則調(diào)用清零程序,將ID中內(nèi)容清空,數(shù)碼管不顯示數(shù)字。7) 重復(fù)執(zhí)行上訴

39、程序,直到鍵盤輸入退出時退出程序。四 實(shí)驗(yàn)總結(jié)本次試驗(yàn)中的四個實(shí)驗(yàn)為循序漸進(jìn)的過程,因?yàn)楸敬螌?shí)驗(yàn)板的數(shù)碼管段碼與之前的VHDL不同,在第一個實(shí)驗(yàn)中我們測試獲得了正確的段碼,使得后續(xù)程序得以順利的編寫。本次試驗(yàn)相對復(fù)雜,但是因?yàn)榍捌谖覀儗︼@示延時、滾動顯示有一定的基礎(chǔ),在確認(rèn)代碼流程、明確各寄存器與輸入輸出關(guān)系的基礎(chǔ)上,我們對延時參數(shù)、循環(huán)次數(shù)等進(jìn)行了多次修改,以達(dá)到較好的顯示效果,最終成功完成了實(shí)驗(yàn),使得我們的匯編語言編寫及硬件實(shí)驗(yàn)?zāi)芰τ辛烁M(jìn)一步的提高。實(shí)驗(yàn)三 8253計數(shù)器/定時器的應(yīng)用一 實(shí)驗(yàn)?zāi)康膶?shí)現(xiàn)掌握8253用作定時器的編程原理二 實(shí)驗(yàn)內(nèi)容1完成一個音樂發(fā)生器,通過蜂鳴器放出音樂,并

40、在數(shù)碼管上顯示樂譜。音符頻率對照如下:音符1(do)2(re)3(mi)4(fa)5(so)6(la)7(si)i(do)頻率256288320341384426.64805122擴(kuò)展部分:利用小鍵盤實(shí)現(xiàn)彈琴功能,并顯示彈奏的樂譜。三 實(shí)驗(yàn)過程1 蜂鳴器發(fā)音規(guī)律測試:在Debug狀態(tài)下,用“O”命令測試8353的發(fā)生功能,3組通道工作是否正常。電路按照如下方式連接: 1) 8253的CS接譯碼器輸出Y1 其地址為EE20-EE27H2) 8253的OUT接蜂鳴器的BELL端3) 8253的門控信號GATE接+5V4) 8253的CLK端接Q7(32KHz)5) 清零復(fù)位電路中的T/C端接地(或

41、接RESET端)注意:由于8253計數(shù)速率應(yīng)小于2MHz,CLK0的輸入信號必須由8MHz經(jīng)393分頻到小于2MHz后使用。393分頻之后,Q0輸出為4MHz,Q1輸出為2MHzQ7輸出32KHz。按照上述連接方式連接電路圖,根據(jù)教材中所列各音符對應(yīng)的蜂鳴器頻率,根據(jù)計數(shù)器的性質(zhì),利用下列公式,計算分頻系數(shù)為計數(shù)初值:不難得出七種音符在高中低音階時計數(shù)器對應(yīng)的計數(shù)值,繪制為下表:對應(yīng)的編碼,如下表:1(do)2(re)3(mi)4(fa)5(so)6(la)7(si)低音1221089791817264中音61544845403632高音30272422201816后續(xù)實(shí)驗(yàn)的展開均基于上表規(guī)律

42、。2 音樂發(fā)生器2.1 實(shí)驗(yàn)原理1) 微機(jī)系統(tǒng)使用的8253,其3個通道均有固定的用途:0號計數(shù)器為系統(tǒng)時鐘源,每隔55ms向系統(tǒng)主8259IR0提一次中斷請求;1號計數(shù)器用于動態(tài)存儲器的定時刷新控制;2號計數(shù)器為系統(tǒng)的發(fā)聲源。2) 用戶在使用微機(jī)系統(tǒng)的時候,可以使用0號和2號計數(shù)器,但不能改變對1號計數(shù)器的初始化。實(shí)驗(yàn)箱上的8253,其數(shù)據(jù)線D7D0,地址線A1、A0和控制線RD、WR通過總線驅(qū)動卡和微機(jī)系統(tǒng)的三總線相連。3) 除此之外,三個計數(shù)器的引出段和片選端都是懸空的,這意味著實(shí)驗(yàn)箱上的8253的三個計數(shù)器都?xì)w用戶使用,可以單獨(dú)使用其中的一個計數(shù)器,也可以串聯(lián)使用其中的2個或3個計數(shù)器。8253計數(shù)器的輸入信號,其頻率不能超過2MHz,否則長時間使用,芯片過熱。4) 8253使用之前,需先對其進(jìn)行初始化編程,其步驟分為向控制寄存器端口寫入控制字對使用的計數(shù)器規(guī)定其使用方法,向使用的計數(shù)器端口寫入計數(shù)初值。8253的控制字控制規(guī)律如下:D7D6D5D4D3D2D1D0計數(shù)器選擇讀寫方式選擇工作方式選擇數(shù)制選擇D7D600:使用0號計數(shù)器,D7D601:使用1號計數(shù)器D7D610:使用2號計數(shù)器,D7D611:無效D5D400:鎖存當(dāng)前計數(shù)值D5D401:只寫低8位(高8位為

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論