版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自動化課程設(shè)計
- 樓宇自動化課程設(shè)計
- 商業(yè)自動化課程設(shè)計
- 調(diào)度自動化系統(tǒng)課程設(shè)計
- 數(shù)字電路與自動化課程設(shè)計報告
- 調(diào)度自動化系統(tǒng)課程設(shè)計
- 辦公自動化課程設(shè)計
- 微機課程設(shè)計報告
- 太原學(xué)院智能與自動化系課程設(shè)計報告
- 自動化立體倉庫課程設(shè)計
- 水電站自動化課程設(shè)計
- 自動化立體倉庫 課程設(shè)計
- 自動化單片機課程設(shè)計
- 物流自動化課程設(shè)計-- 物流自動分揀系統(tǒng)設(shè)計
- 自動化智能課程設(shè)計報告--智能電機測速儀
- 物流系統(tǒng)附其自動化課程設(shè)計研究報告
- 微機原理課程設(shè)計報告
- 微機原理課程設(shè)計報告
- 單片微機課程設(shè)計報告
- 微機接口課程設(shè)計報告
評論
0/150
提交評論