2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  第一章 緒 論</b></p><p><b>  1.1 概述</b></p><p>  近年來隨著科技的飛速發(fā)展,單片機的應(yīng)用正在不斷地走向深入,同時帶動傳統(tǒng)控制檢測日新月益更新。在實時檢測和自動控制的單片機應(yīng)用系統(tǒng)中,單片機往往是作為一個核心部件來使用,僅單片機方面知識是不夠的,還應(yīng)根據(jù)具體硬件結(jié)構(gòu),以及針

2、對具體應(yīng)用對象特點的軟件結(jié)合,加以完善。交通信號燈的出現(xiàn),使交通得以有效管制,對于疏導(dǎo)交通流量、提高道路通行能力,減少交通事故有明顯效果。</p><p><b>  1.2 設(shè)計目的</b></p><p>  《微機應(yīng)用系統(tǒng)設(shè)計與綜合實驗(實踐)》課程設(shè)計是自動化專業(yè)本科生必修的一門技術(shù)基礎(chǔ)課。通過本課程設(shè)計,讓學(xué)生對微機系統(tǒng)有一個較全面的理解,對典型數(shù)字接口電路

3、的應(yīng)用技術(shù)有一個較深入的掌握,并對應(yīng)用系統(tǒng)進(jìn)行硬件原理和軟件編程進(jìn)行分析、設(shè)計和調(diào)試,達(dá)到基本掌握簡單微型計算機應(yīng)用系統(tǒng)軟硬件的設(shè)計方法,提高項目開發(fā)能力的目的。要求同學(xué)獨立完成課題,寫出課程設(shè)計說明書,畫出電路原理圖,說明工作原理,畫出電路印制板圖, 編寫設(shè)計程序及程序流程圖。希望同學(xué)們認(rèn)真閱讀課程設(shè)計任務(wù)書,認(rèn)真查閱資料,完成好上機調(diào)試,圓滿完成本次課程設(shè)計。</p><p>  1.3 設(shè)計任務(wù)和內(nèi)容<

4、;/p><p>  設(shè)計題10:交通燈控制功能設(shè)計(限2-3人)</p><p><b>  設(shè)計要求:</b></p><p> ?。?)、編程語言為C語言和匯編語言;</p><p> ?。?)、硬件電路基于80x86微機接口;</p><p> ?。?)、程序功能要求:小鍵盤給定、數(shù)碼管(屏幕)

5、顯示;</p><p> ?。?)、具備急救車應(yīng)急響應(yīng)功能和時間倒計時顯示功能。</p><p><b>  實驗儀器與設(shè)備</b></p><p>  TPC-H通用微機接口實驗系統(tǒng)1臺。</p><p>  IBM-PC微型計算機1臺。</p><p>  第二章 總體設(shè)計及核心器件簡介<

6、;/p><p><b>  2.1總體設(shè)計</b></p><p>  通過采用8086、8255、I\O接口電路、鍵盤、LED數(shù)字燈顯示、發(fā)光二極管組成交通燈演示系統(tǒng)。利用8255與鍵盤掃描單元,編寫程序完成按鍵掃描功能,并將倒計時時間顯示在數(shù)碼管上。按鍵可以完成置數(shù)功能和各種控制功能,同時利用8086重復(fù)刷新數(shù)碼管產(chǎn)生一秒延時,延時一秒之后,將倒計時時間減少一秒,并利

7、用刷新數(shù)碼管顯示出當(dāng)前剩余時間,到倒計時時間為零,通過利用I\O接口電路將控制信號傳送給發(fā)光二極管,使之發(fā)光或者熄滅。</p><p>  2.2 CPU8086</p><p><b>  8086簡介</b></p><p>  8086CPU根據(jù)它的基本性能,應(yīng)包括20條地址線,16條數(shù)據(jù)線,加上控制信號,電源和地線,芯片的引腳比較多。

8、但由于制造工藝的限制,8086CPU芯片采用了40條引腳的雙列直插式封裝。</p><p>  2.3 8255A</p><p>  8255A是Intel公司生產(chǎn)的可編程輸入輸出接口芯片,它具有3個8位的并I/O</p><p>  口,具有三種工作方式,可通過程序改變其功能,因而使用靈活,通用性強。8255有三種基本工作方式, 三種工作方式由工作方式控制字決

9、定,方式控制字由CPU通過輸入/輸出指令來提供.三個端口中PC口被分為兩個部分,上半部分隨PA口稱為A組,下半部分隨PB口稱為B組.其中PA口可工作與方式0、1和2,而PB口只能工作在方式0和1。8255共有40個引腳,采用雙列直插式封裝。其引腳圖如圖2-4所示,各引腳功能如下:(8255A引腳圖如下:)</p><p>  D0--D7:三態(tài)雙向數(shù)據(jù)線,與單片機數(shù)據(jù)總線連接,用來傳送數(shù)據(jù)信息。</p>

10、;<p>  CS:片選信號線,低電平有效,表示芯片被選中。</p><p>  RD:讀出信號線,低電平有效,控制數(shù)據(jù)的讀出。</p><p>  WR:寫入信號線,低電平有效,控制數(shù)據(jù)的寫入。 </p><p>  Vcc:+5V電源。</p><p>  PA0--PA7:A口輸入/輸出線。</p><

11、p>  PB0--PB7:B口輸入/輸出線。</p><p>  PC0--PC7:C口輸入/輸出線。</p><p>  RESET:復(fù)位信號線。</p><p>  A1、A0:地址線,用來選擇8255內(nèi)部端口。</p><p><b>  GND:地線。</b></p><p>  2

12、.4 鍵盤掃描與數(shù)碼顯示模塊</p><p>  X1~X4控制4位數(shù)碼管的公共端,并連接到按鍵的一端,作為列選,確定是哪一列的按鍵按下,Y1~Y4連接到按鍵的另一端,作為行選,用于檢測哪一行的按鍵按下。結(jié)合行選和列選即可得出是哪一個的按鍵按下,在軟件設(shè)計上要注意消除按鍵抖動的處理以及數(shù)碼管顯示的刷新。</p><p>  鍵盤及數(shù)碼管顯示單元電路結(jié)構(gòu)圖</p><p&

13、gt;  2.5 I\O接口電路模塊</p><p>  I\O接口電路主要是將信號傳遞給信號燈,使之點亮或者熄滅。</p><p>  I\O接口利用三態(tài)緩沖器74LS245,鎖存器74LS374設(shè)計微機總線和外部設(shè)備的數(shù)據(jù)通道,實現(xiàn)微機對外部數(shù)據(jù)的讀取和對輸出數(shù)據(jù)的輸出。用開關(guān)及LED顯示單元的開關(guān)和數(shù)據(jù)燈作為輸入和輸出顯示設(shè)備,將開關(guān)的數(shù)據(jù)讀入總線或者將總線的數(shù)據(jù)傳遞到數(shù)據(jù)燈。實驗中

14、我們可以利用開關(guān)控制交通燈的功能,但是設(shè)計中要求我們使用小鍵盤控制,因此我們主要利用I\O接口電路中的鎖存器74LS374將數(shù)據(jù)從總線送出。</p><p>  輸出接口一般用鎖存器實現(xiàn),從總線送出的數(shù)據(jù)可以暫存在鎖存器中,74LS374是一種8通道上沿觸發(fā)鎖存器。其管腳結(jié)構(gòu)如下圖所示。D[7:0]為輸入數(shù)據(jù)線,Q[7:0]為輸出數(shù)據(jù)線。CLK引腳為鎖存控制信號,上升沿有效。當(dāng)上升沿時,輸出數(shù)據(jù)線鎖存輸入數(shù)據(jù)線上

15、的數(shù)據(jù)。OE引腳為鎖存器的片選信號,低電平有效。</p><p>  74LS374上升沿觸發(fā)鎖存器管腳圖</p><p>  基本I\O接口設(shè)計實驗參考接線圖</p><p>  第三章 軟件編程設(shè)計</p><p><b>  3.1 設(shè)計思想</b></p><p>  先通過小鍵盤設(shè)定路口

16、通行時間,按鍵A確定。然后檢測按鈕B是否按下,按下則進(jìn)入交通燈演示功能:(1)南北路口的綠燈,東西路口的紅燈同時亮設(shè)定的時間。(2)南北路口的黃燈閃爍5次,同時東西路口的紅燈繼續(xù)亮。(3)南北路口的紅燈,東西路口的綠燈同時亮設(shè)定的時間。(4)南北路口的紅燈繼續(xù)亮,同時東西路口的黃燈閃爍五次。在交通燈演示功能的同時檢測是否有按鍵按下,當(dāng)按鍵B按下,表示系統(tǒng)啟動。當(dāng)按鍵C按下,表示系統(tǒng)暫停。當(dāng)按鍵D按下,表示系統(tǒng)重置時間。當(dāng)按鍵E按下,表示

17、系統(tǒng)進(jìn)入緊急情況。當(dāng)按鍵F按下,表示系統(tǒng)關(guān)閉。當(dāng)系統(tǒng)啟動后,交通燈自動交替閃爍,每隔一秒就將數(shù)碼管需要顯示的數(shù)值減一,同時不停地刷新數(shù)碼管,以顯示剩余時間。當(dāng)系統(tǒng)暫停時,系統(tǒng)不停的檢測是否啟動按鈕按下,否則就繼續(xù)檢測,同時刷新數(shù)碼管,是數(shù)碼管顯示暫停時的時間,直到啟動按鈕按下,系統(tǒng)繼續(xù)按照暫停前的狀態(tài)運行,當(dāng)系統(tǒng)重新設(shè)置時間時。相當(dāng)于程序從新開始執(zhí)行。當(dāng)緊急按鈕按下,將數(shù)碼管顯示時間零,同各個路口的紅燈亮,綠燈和黃燈滅。直到檢測到啟動按

18、鈕按下,啟動按鈕按下后,跳轉(zhuǎn)到交通燈演示的第一步。當(dāng)結(jié)束按鈕按下,則跳出程序的運行。</p><p><b>  3.2典型模塊</b></p><p>  本實驗中有三種典型的程序模塊分別為按鍵掃描、數(shù)碼管刷新數(shù)據(jù)和I\O接口電路輸出數(shù)據(jù)。</p><p><b>  按鍵掃描:</b></p><p

19、>  按鍵掃描的程序首先清屏,然后掃描按鍵,判斷是否有按鍵按下,如果沒有按鍵按下,則不執(zhí)行掃描按鍵代碼程序。如果有按鍵按下,則延時一定時間再次掃描按鍵,如果這時沒有按鍵按下,則說明是按鍵抖動,不執(zhí)行掃描按鍵代碼程序。如果延時后按鍵還是按下的,則我們需要檢測按下按鍵的代碼,首先設(shè)置當(dāng)前檢測的是第幾列,選取一列,同時將對應(yīng)的X1~X4置低電平,讀Y1~Y4,用于判斷是哪一行的按鍵閉合,判斷是否為第一行,如果是第一行則設(shè)置第一行第一列的

20、對應(yīng)鍵值,如果不是則判斷是否為下一行。一直檢測到最后一行。如果判斷不是,則檢測下一列,按照上述方法,從第一列檢測最后一列,直到檢測出對應(yīng)的按鍵后,設(shè)置對應(yīng)按鍵的鍵值。</p><p><b>  數(shù)碼管的刷新:</b></p><p>  在交通燈功能控制系統(tǒng)中,均采用了8位數(shù)碼管動態(tài)掃描顯示(見圖1)。它將所有數(shù)碼管的8個段線相應(yīng)地并接在一起,并接到8255單元的P

21、B口,由PB口控制字段輸出。而各位數(shù)碼管的共陽極由8255單元的PA口控制X1~X4來實現(xiàn)8位數(shù)碼管的位輸出控制。這樣,對于一組數(shù)碼管動態(tài)掃描顯示需要由兩組信號來控制:一組是字段輸出口輸出的字形代碼,用來控制顯示的字形,稱為段碼;另一組是位輸出口輸出的控制信號,用來選擇第幾位數(shù)碼管工作,稱為位碼。由于各位數(shù)碼管的段線并聯(lián),段碼的輸出對各位數(shù)碼管來說都是相同的。因此,在同一時刻如果各位數(shù)碼管的位選線都處于選通狀態(tài)的話,8位數(shù)碼管將顯示

22、相同的字符。若要各位數(shù)碼管能夠顯示出與本位相應(yīng)的字符,就必須采用掃描顯示方式。即在某一時刻,只讓某一位的位選線處于導(dǎo)通狀態(tài),而其它各位的位選線處于關(guān)閉狀態(tài)。同時,段線上輸出相應(yīng)位要顯示字符的字型碼。這樣在同一時刻,只有選通的那一位顯示出字符,而其它各位則是熄滅的,如此循環(huán)下去,就可以使各位數(shù)碼管顯示出將要顯示的字符。雖然這些字符是在不同時刻出現(xiàn)的,而且同一時刻,只有一位顯示,其它各位熄滅,但由于數(shù)碼管具有余輝特性和人眼有視覺</

23、p><p>  I\O接口輸出電路:先將I\O接口電路的片選信號選通。將要傳遞的信號存放在AL寄存器中,將要傳遞信號的地址存放在DX寄存器中,再用OUT指令輸出。</p><p>  3.2 程序流程框圖</p><p><b>  3.3 源程序</b></p><p><b>  匯編語言源代碼:</b&

24、gt;</p><p>  ;***************根據(jù)CHECK配置信息修改下列符號值*******************</p><p>  IOY0 EQU 0C400H ;片選IOY0對應(yīng)的端口始地址</p><p>  IOYO2 EQU 0C440H</p><p>  ;*****

25、************************************************************</p><p>  MY8255_A EQU IOY0+00H*4 ;8255的A口地址</p><p>  MY8255_B EQU IOY0+01H*4 ;8255的B口地址</p><p>  MY8255_

26、C EQU IOY0+02H*4 ;8255的C口地址</p><p>  MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址</p><p>  STACK1 SEGMENT STACK</p><p>  DW 256 DUP(?)</p><p>  ST

27、ACK1 ENDS</p><p>  DATA SEGMENT</p><p>  DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H</p><p>  L0 DB 11H</p><p>  L1 DB

28、 41H</p><p>  L2 DB 21H</p><p>  L3 DB 01H</p><p>  L4 DB 14H</p><p>  L5 DB 12H</p><p>  L6 DB 10H</p>

29、<p>  L7 DB 0CH</p><p>  L8 DB 00H</p><p>  DATA ENDS ;鍵值表,0~F對應(yīng)的7段數(shù)碼管的段位值</p><p>  CODE SEGMENT</p><p>  ASSUME CS:CODE,DS

30、:DATA</p><p>  START: MOV AX,DATA</p><p>  MOV DS,AX</p><p>  MOV SI,0F000H ;建立緩沖區(qū),存放要顯示的鍵值</p><p>  MOV AL,00H ;先初始化鍵值為0</p><

31、;p>  MOV [SI],AL</p><p>  MOV [SI+1],AL</p><p>  MOV DI,0F001H</p><p>  MOV DX,MY8255_MODE ;初始化8255工作方式</p><p>  MOV AL,81H

32、 ;方式0,A口、B口輸出,C口低4位輸入</p><p>  OUT DX,AL</p><p>  BEGIN: CALL DIS</p><p>  CALL CLEAR ;清屏</p><p>  CALL CCSCAN ;掃描按鍵</p><p

33、>  JNZ RGETKEY1 ;有鍵按下則跳置GETKEY1</p><p>  MOV AH,1 ;判斷PC鍵盤是否有按鍵按下</p><p>  INT 16H</p><p>  JZ BEGIN ;無按鍵則跳回繼續(xù)循環(huán),有則退出</p><p>

34、  QUIT: MOV AX,4C00H ;返回到DOS</p><p>  INT 21H</p><p>  RGETKEY1: CALL DALLY1 ;顯示刷新</p><p>  CALL CLEAR ;清屏</p><p>  CALL CCSC

35、AN ;再次掃描按鍵</p><p>  JNZ RGETKEY2 ;有鍵按下則跳置GETKEY2</p><p>  JMP BEGIN ;否則跳回開始繼續(xù)循環(huán)</p><p>  RGETKEY2: MOV CH,0FEH</p><p>  MOV CL,00

36、H ;設(shè)置當(dāng)前檢測的是第幾列</p><p>  RCOLUM: MOV AL,CH ;選取一列,將X1~X4中一個置0</p><p>  MOV DX,MY8255_A</p><p>  OUT DX,AL</p><p>  MOV DX,MY8255_C ;讀Y

37、1~Y4,用于判斷是哪一行按鍵閉合</p><p>  IN AL,DX</p><p>  RL1: TEST AL,01H ;是否為第1行</p><p>  JNZ RL2 ;不是則繼續(xù)判斷</p><p>  MOV AL,00H ;設(shè)置第1行第1列

38、的對應(yīng)的鍵值</p><p>  JMP RKCODE</p><p>  RL2: TEST AL,02H ;是否為第2行</p><p>  JNZ RL3 ;不是則繼續(xù)判斷</p><p>  MOV AL,04H ;設(shè)置第2行第1列的對應(yīng)的鍵值<

39、/p><p>  JMP RKCODE</p><p>  RL3: TEST AL,04H ;是否為第3行</p><p>  JNZ RL4 ;不是則繼續(xù)判斷</p><p>  MOV AL,08H ;設(shè)置第3行第1列的對應(yīng)的鍵值</p>&l

40、t;p>  JMP RKCODE</p><p>  RL4: TEST AL,08H ;是否為第4行</p><p>  JNZ RNEXT ;不是則繼續(xù)判斷</p><p>  MOV AL,0CH ;設(shè)置第4行第1列的對應(yīng)的鍵值</p><p>  R

41、KCODE: ADD AL,CL ;將第1列的值加上當(dāng)前列數(shù),確定按鍵值</p><p>  CMP AL,09H</p><p>  JG KERR1</p><p>  CALL PUTBUF ;保存按鍵值</p><p>  PUSH AX</p>

42、;<p>  RKON: CALL DALLY1 ;顯示刷新</p><p>  CALL CLEAR ;清屏</p><p>  CALL CCSCAN ;掃描按鍵,判斷按鍵是否彈起</p><p>  JNZ RKON ;未彈起則繼續(xù)循環(huán)等待彈起</p&g

43、t;<p>  POP AX</p><p>  RNEXT: INC CL ;當(dāng)前檢測的列數(shù)遞增</p><p>  MOV AL,CH</p><p>  TEST AL,08H ;檢測是否掃描到第4列</p><p>  JZ KER

44、R ;是則跳回到開始處</p><p>  ROL AL,1 ;沒檢測到第4列則準(zhǔn)備檢測下一列</p><p>  MOV CH,AL</p><p>  JMP RCOLUM</p><p>  KERR: JMP BEGIN</p><p&g

45、t;  KERR1: CMP AL,0AH</p><p>  JZ KERR2</p><p>  JMP KERR</p><p>  KERR2: MOV L7,0CH</p><p>  MOV SI,0F000H</p><p>  MOV

46、 AL,[SI]</p><p>  MOV BL,[SI+1]</p><p>  SHL BL,4</p><p>  ADD AL,BL</p><p>  MOV L8,AL</p><p>  B: MOV AL,L0</p>

47、<p>  MOV DX,IOYO2</p><p>  OUT DX,AL</p><p>  MOV BX,0000H</p><p>  CALL CHANGE</p><p>  CALL BE</p><p>  CALL DALL

48、Y1</p><p>  T: MOV AL,L1</p><p>  MOV DX,IOYO2</p><p>  OUT DX,AL</p><p>  MOV BL,L8</p><p>  T1: CALL CJIAN</p><

49、p>  CALL CHANGE</p><p>  CALL BE</p><p>  CALL DALLY2</p><p>  CALL DALLY2</p><p>  CALL DALLY2</p><p>  CMP BX,00H</p

50、><p>  JNZ T1</p><p>  MOV BX,0006H</p><p>  T2: MOV AL,L2</p><p>  MOV DX,IOYO2</p><p>  OUT DX,AL</p><p>  CALL

51、 CJIAN</p><p>  CALL CHANGE</p><p>  CALL BE</p><p>  CALL DALLY1</p><p>  CALL DALLY1</p><p>  MOV AL,L3</p><p>

52、;  MOV DX,IOYO2</p><p>  OUT DX,AL</p><p>  CALL DALLY2</p><p>  CALL DALLY2</p><p>  CMP BX,0</p><p>  JNZ T2</p>

53、<p>  MOV AL,L4</p><p>  MOV DX,IOYO2</p><p>  OUT DX,AL</p><p>  MOV BL,L8</p><p>  T3: CALL CJIAN</p><p>  CALL

54、CHANGE</p><p>  CALL BE</p><p>  CALL DALLY2</p><p>  CALL DALLY2</p><p>  CALL DALLY2</p><p>  CMP BL,00H</p><p>  

55、JNZ T3</p><p>  MOV BX,0006H</p><p>  T4: MOV AL,L5</p><p>  MOV DX,IOYO2</p><p>  OUT DX,AL</p><p>  CALL CJIAN</p&

56、gt;<p>  CALL CHANGE</p><p>  CALL BE</p><p>  CALL DALLY1</p><p>  CALL DALLY1</p><p>  MOV AL,L6</p><p>  MOV DX,I

57、OYO2</p><p>  OUT DX,AL</p><p>  CALL DALLY2</p><p>  CALL DALLY2</p><p>  CMP BX,0</p><p>  JNZ T4</p><p>  JMP

58、 T</p><p>  CHANGE PROC NEAR</p><p>  PUSH BX</p><p>  MOV AX,BX</p><p>  MOV SI,0F000H</p><p>  AND AL,0FH</p><

59、;p>  MOV [SI],AL</p><p>  AND BL,0F0H</p><p>  SHR BL,4</p><p>  MOV [SI+1],BL</p><p>  POP BX</p><p><b>  RET</b

60、></p><p>  CHANGE ENDP</p><p>  CJIAN PROC NEAR</p><p>  MOV AX,BX</p><p>  DEC AX</p><p><b>  DAS</b></p><p&g

61、t;  MOV BX,AX</p><p><b>  RET</b></p><p>  CJIAN ENDP</p><p>  DIS PROC NEAR ;顯示鍵值子程序</p><p>  PUSH AX</p><p>  PUSH

62、 BX ;以緩沖區(qū)存放的鍵值為鍵值表偏移找到鍵值并顯示</p><p>  MOV SI,0F000H</p><p>  MOV DL,0F7H</p><p>  MOV AL,DL</p><p>  AGAIN: PUSH DX</p><p&

63、gt;  MOV DX,MY8255_A</p><p>  OUT DX,AL ;設(shè)置X1~X4,選通一個數(shù)碼管</p><p>  MOV AL,[SI] ;取出緩沖區(qū)中存放鍵值</p><p>  MOV BX,OFFSET DTABLE</p><p>  AND

64、 AX,00FFH </p><p>  ADD BX,AX</p><p>  MOV AL,[BX] ;將鍵值作為偏移和鍵值基地址相加得到相應(yīng)的鍵值</p><p>  MOV DX,MY8255_B</p><p>  OUT DX,AL ;寫入數(shù)碼管A~Dp&

65、lt;/p><p>  CALL CLEAR</p><p>  INC SI ;取下一個鍵值</p><p>  POP DX</p><p>  MOV AL,DL</p><p>  TEST AL,04H ;判斷是否顯示完?<

66、/p><p>  JZ OUT1 ;顯示完,返回</p><p>  ROR AL,1</p><p>  MOV DL,AL</p><p>  JMP AGAIN ;未顯示完,跳回繼續(xù)</p><p>  OUT1: POP BX

67、</p><p>  POP AX</p><p><b>  RET</b></p><p><b>  DIS ENDP</b></p><p>  DALLY1 PROC NEAR ;軟件延時子程序</p><p>  PUSH

68、 CX</p><p>  MOV CX,1000H</p><p>  D1: MOV AX,1000H</p><p>  D2: DEC AX </p><p>  CALL DIS</p><p>  JNZ D2</p>&l

69、t;p>  LOOP D1</p><p>  POP CX</p><p><b>  X2: RET</b></p><p>  DALLY1 ENDP</p><p>  PUTBUF PROC NEAR ;保存鍵值子程序</p><p

70、>  MOV SI,DI</p><p>  MOV [SI],AL</p><p>  DEC DI</p><p>  CMP DI,0EFFFH</p><p>  JNZ GOBACK</p><p>  MOV DI,0F001H&

71、lt;/p><p>  GOBACK: RET</p><p>  PUTBUF ENDP</p><p>  DALLY2 PROC NEAR ;軟件延時子程序</p><p>  PUSH CX</p><p>  MOV CX,0FFFFH</p>&

72、lt;p>  D3: MOV AX,0FFFFH</p><p>  D4: DEC AX</p><p>  CALL DIS</p><p>  JNZ D4</p><p>  LOOP D3</p><p>  POP CX</

73、p><p><b>  RET</b></p><p>  DALLY2 ENDP</p><p>  CCSCAN PROC NEAR ;掃描是否有按鍵閉合子程序</p><p>  PUSH AX</p><p>  PUSH DX</p>

74、;<p>  MOV AL,00H</p><p>  MOV DX,MY8255_A ;將4列全選通,X1~X4置0</p><p>  OUT DX,AL</p><p>  MOV DX,MY8255_C</p><p>  IN AL,DX ;讀Y

75、1~Y4</p><p>  NOT AL</p><p>  AND AL,0FH ;取出Y1~Y4的反值</p><p>  POP DX</p><p>  POP AX</p><p><b>  RET</b></p>

76、<p>  CCSCAN ENDP</p><p>  BE PROC NEAR</p><p>  PUSH CX</p><p>  S: CALL DALLY1</p><p>  CALL CLEAR ;顯示刷新</p><p>  CAL

77、L CCSCAN ;掃描按鍵</p><p>  JNZ GETKEY1 ;有鍵按下則跳置GETKEY1</p><p>  MOV AL,L7</p><p>  CMP AL,0BH</p><p>  JZ KERRR</p><p>

78、  CMP AL,0CH</p><p>  JZ S</p><p>  CMP AL,0DH</p><p>  JZ KERRR3</p><p>  CMP AL,0EH</p><p>  JZ KERRR1</p>

79、<p>  CMP AL,0FH</p><p>  JZ KERRR2</p><p>  JMP S</p><p>  GETKEY1: CALL DALLY1 ;顯示刷新</p><p>  CALL CCSCAN ;再次掃描按鍵</p&g

80、t;<p>  JNZ GETKEY2 ;有鍵按下則跳置GETKEY2</p><p>  JMP S ;否則跳回開始繼續(xù)循環(huán)</p><p>  GETKEY2: MOV CH,0FEH</p><p>  MOV CL,00H ;設(shè)置當(dāng)前檢測的是第幾列</

81、p><p>  COLUM: MOV AL,CH ;選取一列,將X1~X4中一個置0</p><p>  MOV DX,MY8255_A</p><p>  OUT DX,AL</p><p>  MOV DX,MY8255_C ;讀Y1~Y4,用于判斷是哪一行按鍵閉合</p&g

82、t;<p>  IN AL,DX</p><p>  Q1: TEST AL,01H ;是否為第1行</p><p>  JNZ Q2 ;不是則繼續(xù)判斷</p><p>  MOV AL,00H ;設(shè)置第1行第1列的對應(yīng)的鍵值</p><p>

83、;  JMP KCODE</p><p>  Q2: TEST AL,02H ;是否為第2行</p><p>  JNZ Q3 ;不是則繼續(xù)判斷</p><p>  MOV AL,04H ;設(shè)置第2行第1列的對應(yīng)的鍵值</p><p>  JMP

84、 KCODE</p><p>  Q3: TEST AL,04H ;是否為第3行</p><p>  JNZ Q4 ;不是則繼續(xù)判斷</p><p>  MOV AL,08H ;設(shè)置第3行第1列的對應(yīng)的鍵值</p><p>  JMP KCODE</p

85、><p>  Q4: TEST AL,08H ;是否為第4行</p><p>  JNZ NEXT ;不是則繼續(xù)判斷</p><p>  MOV AL,0CH ;設(shè)置第4行第1列的對應(yīng)的鍵值</p><p>  KCODE: ADD AL,CL</p>

86、<p>  CMP AL,09H</p><p>  JLE KERRR3</p><p>  MOV L7,AL ;將第1列的值加上當(dāng)前列數(shù),確定按鍵值</p><p>  JMP S</p><p>  PUSH AX</p><p&g

87、t;  KON: CALL DALLY1 ;顯示刷新</p><p>  CALL CLEAR</p><p>  CALL CCSCAN ;掃描按鍵,判斷按鍵是否彈起</p><p>  JNZ KON ;未彈起則繼續(xù)循環(huán)等待彈起</p><p>  JMP

88、 S</p><p>  POP AX</p><p>  NEXT: INC CL ;當(dāng)前檢測的列數(shù)遞增</p><p>  MOV AL,CH</p><p>  TEST AL,08H ;檢測是否掃描到第4列</p><p>  

89、JZ KERRR ;是則跳回到開始處</p><p>  ROL AL,1 ;沒檢測到第4列則準(zhǔn)備檢測下一列</p><p>  MOV CH,AL</p><p>  JMP COLUM</p><p>  KERRR: POP CX</p>

90、;<p><b>  RET</b></p><p>  KERRR1: POP CX</p><p>  MOV L7,0CH</p><p>  JMP B</p><p><b>  RET</b></p><p> 

91、 KERRR2: POP CX</p><p>  CALL COUT</p><p><b>  RET</b></p><p>  KERRR3: POP CX</p><p>  JMP START</p><p><b>  RE

92、T</b></p><p><b>  BE ENDP</b></p><p>  SAVE PROC NEAR</p><p>  MOV AL,L0</p><p>  MOV DX,IOYO2</p><p>  OUT DX,A

93、L</p><p><b>  RET</b></p><p>  SAVE ENDP</p><p>  COUT PROC NEAR</p><p>  MOV AX,4C00H</p><p>  INT 21H</p><p>

94、<b>  RET</b></p><p>  COUT ENDP</p><p>  CLEAR PROC NEAR</p><p>  PUSH DX</p><p>  PUSH AX</p><p>  MOV DX,MY8255_B</

95、p><p>  MOV AL,00H</p><p>  OUT DX,AL</p><p>  POP AX</p><p>  POP DX</p><p><b>  RET</b></p><p>  CLEAR END

96、P</p><p>  DALLY PROC NEAR ;軟件延時子程序</p><p>  PUSH CX</p><p>  MOV CX,00FFH</p><p>  RD1: MOV AX,00FFH</p><p>  RD2: DEC

97、 AX</p><p>  JNZ RD2</p><p>  LOOP RD1</p><p>  POP CX</p><p><b>  RET</b></p><p>  DALLY ENDP </p><p>  CODE

98、 ENDS</p><p>  END START</p><p><b>  C語言源代碼:</b></p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #include

99、<conio.h></p><p>  #include <bios.h></p><p>  #include <ctype.h></p><p>  #include <process.h></p><p>  void dis(void);</p><p>  vo

100、id key(void);</p><p>  void clear(void);</p><p>  void ccscan(void);</p><p>  void putbuf(void);</p><p>  void getkey(void);</p><p>  void delay(int time);

101、</p><p>  void getkey1(void);</p><p>  void jian(void);</p><p>  void che(void);</p><p>  //****************根據(jù)查看配置信息修改下列符號值*******************</p><p>  #de

102、fine IOY0 0xE400</p><p>  #define IOYO2 0xE440</p><p>  //*****************************************************************</p><p>  #define MY8255_A IOY0 + 0x

103、00*4</p><p>  #define MY8255_B IOY0 + 0x01*4</p><p>  #define MY8255_C IOY0 + 0x02*4</p><p>  #define MY8255_MODE IOY0 + 0x03*4</p><p>  char a[] = {0x3f, 0

104、x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};</p><p>  int b[] = {0, 0, 0, 0, 0};</p><p>  char c[] = {0x11,0x41,0x21,0x01,0x14,0x12,0x10};</p>

105、<p><b>  int cc;</b></p><p><b>  int b_n;</b></p><p><b>  int n;</b></p><p>  void main()</p><p>  { int i,j,ad;</p>

106、;<p>  outp(MY8255_MODE, 0x81);</p><p><b>  b_n = 1;</b></p><p><b>  b[4]=10;</b></p><p><b>  while(1)</b></p><p><b>  

107、{jian();</b></p><p>  switch(b[4])</p><p>  { case 10:n=0;b[0]=0;b[1]=0;</p><p>  while(n<=9)</p><p><b>  {</b></p><p><b>  dis(

108、);</b></p><p><b>  clear();</b></p><p><b>  ccscan();</b></p><p><b>  if (cc)</b></p><p><b>  {</b></p><

109、;p><b>  dis();</b></p><p>  delay(0x100);</p><p>  delay(0x100);</p><p><b>  clear();</b></p><p><b>  ccscan();</b></p>&l

110、t;p>  if (cc)getkey();</p><p><b>  }</b></p><p><b>  key();</b></p><p><b>  }</b></p><p>  b[2]=b[0];b[3]=b[1];b[4]=11;</p>

111、<p><b>  break;</b></p><p>  case 11:dis();break;</p><p>  case 12:while(b[4]==12)</p><p>  { b[0]=b[2];</p><p>  b[1]=b[3];</p><p>  a

112、d=b[0]+b[1];</p><p>  outp(IOYO2,c[1]);</p><p>  while(ad) /*到計時*/</p><p><b>  { b[0]--;</b></p><p>  if(b[0]==-1)</p><p><b>  {b[0]

113、=9;</b></p><p><b>  b[1]--;}</b></p><p>  ad=b[0]+b[1];</p><p>  for(i=0;i<=6000;i++)</p><p><b>  {dis();</b></p><p>  che

114、();key();</p><p>  while(n==13){dis();jian();key();}</p><p>  if(n!=12)break;</p><p><b>  }</b></p><p><b>  }</b></p><p><b> 

115、 b[0]=5;</b></p><p><b>  b[1]=0;</b></p><p>  ad=b[0]+b[1];</p><p><b>  while(ad)</b></p><p>  { outp(IOYO2,c[2]);</p><p><

116、;b>  b[0]--;</b></p><p>  if(b[0]==-1)</p><p><b>  {b[0]=9;</b></p><p><b>  b[1]--;}</b></p><p>  ad=b[0]+b[1];</p><p>  f

117、or(i=0;i<=2000;i++)</p><p>  {dis();che();key();</p><p>  while(n==13){dis();jian();key();}</p><p>  if(n!=12)break;</p><p><b>  } </b></p><p&

118、gt;  outp(IOYO2,c[3]);</p><p>  for(i=0;i<=4000;i++)</p><p>  {dis();che();key();</p><p>  while(n==13){dis();jian();key();}</p><p>  if(n!=12)break;}</p><

119、;p><b>  }</b></p><p>  b[0]=b[2];</p><p>  b[1]=b[3];</p><p>  ad=b[0]+b[1];</p><p>  outp(IOYO2,c[4]);</p><p>  while(ad) /*到計時*/</

120、p><p><b>  { b[0]--;</b></p><p>  if(b[0]==-1)</p><p><b>  {b[0]=9;</b></p><p><b>  b[1]--;}</b></p><p>  ad=b[0]+b[1];<

121、;/p><p>  for(i=0;i<=6000;i++)</p><p>  {dis();che();key();</p><p>  while(n==13){dis();jian();key();}</p><p>  if(n!=12)break;</p><p><b>  }</b&g

122、t;</p><p><b>  }</b></p><p><b>  b[0]=5;</b></p><p><b>  b[1]=0;</b></p><p>  ad=b[0]+b[1];</p><p><b>  while(ad)

123、</b></p><p>  { outp(IOYO2,c[5]);</p><p><b>  b[0]--;</b></p><p>  if(b[0]==-1)</p><p><b>  {b[0]=9;</b></p><p><b>  b[

124、1]--;}</b></p><p>  ad=b[0]+b[1];</p><p>  for(i=0;i<=2000;i++)</p><p>  {dis();che();key();</p><p>  while(n==13){dis();jian();key();}</p><p>  i

125、f(n!=12)break;</p><p><b>  }</b></p><p>  outp(IOYO2,c[6]);</p><p>  for(i=0;i<=4000;i++)</p><p>  {dis();che();key();</p><p>  while(n==13)

126、{dis();jian();key();}</p><p>  if(n!=12)break;}</p><p><b>  }</b></p><p><b>  }break;</b></p><p>  case 13:dis();break;</p><p>  ca

127、se 14:outp(IOYO2,c[0]);</p><p>  b[0]=0;b[1]=0;for(i=0;i<=50;i++)dis();break;</p><p>  case 15:exit(0);break;</p><p>  default: exit(0);}</p><p><b>  }</b&g

128、t;</p><p><b>  } </b></p><p>  void getkey(void)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  int j = 0xfe;</

129、p><p>  for(i=0;i<=3;i++)</p><p><b>  {</b></p><p>  outp(MY8255_A, j);</p><p>  if ( !( (inp(MY8255_C)) & 0x01) )</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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論