鐘計(jì)算機(jī)綜合實(shí)踐1-5_第1頁(yè)
鐘計(jì)算機(jī)綜合實(shí)踐1-5_第2頁(yè)
鐘計(jì)算機(jī)綜合實(shí)踐1-5_第3頁(yè)
鐘計(jì)算機(jī)綜合實(shí)踐1-5_第4頁(yè)
鐘計(jì)算機(jī)綜合實(shí)踐1-5_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 四川大學(xué)網(wǎng)絡(luò)教育學(xué)院 實(shí)踐課程報(bào)告實(shí)踐課程 計(jì)算機(jī)綜合實(shí)踐 校外學(xué)習(xí)中心 專 業(yè) 電氣工程及其自動(dòng)化 層 次 專升本 年 級(jí) 10秋 學(xué)生姓名 學(xué) 號(hào) 2013年 9 月 18 日實(shí)驗(yàn)一 熟悉、使用DEBUG調(diào)試工具一 實(shí)驗(yàn)?zāi)康模? 了解并逐步熟悉匯編語(yǔ)言的編輯方法及特點(diǎn).2 復(fù)習(xí)8088匯編語(yǔ)言的段結(jié)構(gòu)、常用的指令與偽指令、存儲(chǔ)空間的分配等。3 掌握匯編語(yǔ)言的編輯、匯編及連接的過(guò)程。4 了解并逐步掌握運(yùn)用DEBUG進(jìn)行調(diào)試匯編語(yǔ)言程序。二 實(shí)驗(yàn)內(nèi)容:1 運(yùn)用8086匯編語(yǔ)言,編輯多字節(jié)非壓縮型BCD數(shù)除法的簡(jiǎn)單程序,文件名取為*.ASM。2 運(yùn)用MASMEXE文件進(jìn)行匯編,修改發(fā)現(xiàn)的各種語(yǔ)

2、法錯(cuò)誤,直至正確,形成*.OBJ文件。3 運(yùn)用LINK.EXE文件進(jìn)行連接,形成*.EXE文件。4 仔細(xì)閱讀附錄中的DEBUG部分,掌握各種命令的所有方法。5 運(yùn)用DEBUG。EXE文件進(jìn)行調(diào)試,使用單步執(zhí)行命令T兩次,觀察寄存器中內(nèi)容的變化,使用察看存儲(chǔ)器數(shù)據(jù)段命令D,觀察存儲(chǔ)器數(shù)據(jù)段內(nèi)數(shù)值。6 再使用連續(xù)執(zhí)行命令G,執(zhí)行程序,檢查結(jié)果是否正確,若不正確可使用DEBUG的設(shè)置斷點(diǎn),單步執(zhí)行等功能發(fā)現(xiàn)錯(cuò)誤所在并加以改正。程序清單:多字節(jié)非壓縮型BCD數(shù)除法 (88754/6=14792)DATASEGMENTADB8,8,7,5,4BDB6CDB 5DUP (0)NEQU5DATAENDSCO

3、DESEGMENTASSUMECS:CODE;DS:DATA;ES:DATA,STARTMOVAX,DATAMOVDS,AXMOVES,AXCLDLEASI,ALEBDI,CMOVCX,NMOVAH,0LP1:LODSBAADDIVBSTOSBLOOPLP1MOVCX,NLEADI,CLP2:MOVDL,DI MOVAH,2 開(kāi)始INT21HDECDI 設(shè)置被除數(shù)、商的地址指針LOOPLP2 設(shè)置單位除法次數(shù)計(jì)數(shù)器MOVAH,4CHINT21H 取被除數(shù)一位作十進(jìn)制調(diào)整CODE:ENDSENDSTART 作字節(jié)除法、存商 N 被除數(shù)各位已除完? Y顯示運(yùn)算結(jié)果 結(jié)束 三、實(shí)驗(yàn)體會(huì) 通過(guò)本次實(shí)驗(yàn)

4、,我了解了匯編語(yǔ)言的編輯方法及特點(diǎn),掌握匯編語(yǔ)言的編輯、匯編及連接的過(guò)程,并逐步掌握運(yùn)用DEBUG進(jìn)行調(diào)試匯編語(yǔ)言程序。但對(duì)其的熟悉程度和應(yīng)用還遠(yuǎn)遠(yuǎn)不夠,因此需要經(jīng)過(guò)加強(qiáng)練習(xí),提高水平。實(shí)驗(yàn)二 設(shè)計(jì)匯編語(yǔ)言程序一 實(shí)驗(yàn)內(nèi)容1、字符串統(tǒng)計(jì)程序設(shè)計(jì) 2、雙字乘法程序設(shè)計(jì)二 實(shí)驗(yàn)內(nèi)容1 字符串統(tǒng)計(jì)。 在數(shù)據(jù)段中建立一個(gè)緩沖區(qū)BUFFER,變量VER,編程使得程序具有如下功能:從鍵盤輸入一個(gè)子字符串存入VER,從鍵盤輸入包含一個(gè)或幾個(gè)子字符串的字符串存入BUFFER。統(tǒng)計(jì)BUFFER中的字符串含有多少個(gè)子字符串以及每個(gè)子字符串的位置。2 雙字乘法程序。設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)32位帶符號(hào)雙精度數(shù)乘法運(yùn)算。由于

5、只有8位和16位的乘法指令。因此32位乘法運(yùn)算是不能直接用指令實(shí)現(xiàn)的。但可以用16位乘法指令,通過(guò) 4次想乘然后把部分積想加。對(duì)于帶符號(hào)數(shù),可以先根據(jù)絕對(duì)值求得積。然后判斷積的符號(hào),若積為負(fù)數(shù),應(yīng)將其用補(bǔ)碼表示。三 實(shí)驗(yàn)流程與程序: 子程序入口 AXNUM1 開(kāi)始 DX:AXAX*NUM2 乘積符號(hào)標(biāo)志SIGN=0 MRLTAX,MRLT+2DX 被乘數(shù)>0 ? Y AXNUM1+2 N 被乘數(shù)取補(bǔ) DX:AXAX*NUM2 SIGN標(biāo)志取反 MRLT+2AX+MRLT+2,MRLT+4DX+C 乘數(shù)>0 ? Y AXNUM1 N 乘數(shù)取補(bǔ) DX:AXAX*NUM2+2 SIGN標(biāo)

6、志取反 MRLT+2AX+MRLT+2,MRLT+4DX+C調(diào)用32位無(wú)符號(hào)乘法子程序 保存進(jìn)位 SIGN=0 ? Y AXNUM1+2 N 乘積取補(bǔ) DX:AXAX*NUM2+2 結(jié)束 恢復(fù)進(jìn)位 32位帶符號(hào)數(shù)乘法流程圖 MRLT+4AX+MRLT+4,MRLT+6DX+C RET 32位無(wú)符號(hào)乘法子程序流程圖data segmentioportequ 0d400h-0280hio8253aequ ioport+280hio8253bequ ioport+283hio8255aequ ioport+288hio8255bequ ioport+28bhio0832aequ ioport+290

7、hdata1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h db 80h,66h,4eh,38h,25h,15h,09h,04h db 00h,04h,09h,15h,25h,38h,4eh,66h;正弦波數(shù)據(jù)time db 120,106,94,89,79,70,63,59;發(fā)不同音時(shí)8253的計(jì)數(shù)器初值msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'num db ?;num為8253計(jì)數(shù)器初值的

8、序號(hào)data endscode segment assume cs:code,ds:datastart:mov ax,datamov ds,axmov dx,offset msgmov ah,9int 21h ;顯示提示信息sss:mov ah,7int 21h ;從鍵盤接收字符,不回顯cmp al,1bhje exit ;若為ESC鍵,則轉(zhuǎn)EXITcmp al,31hjl ssscmp al,38hjg sss ;若不在'1'-'8'之間轉(zhuǎn)ssssub al,31hmov num,al ;求出相應(yīng)的時(shí)間常數(shù)的序號(hào)mov cx,60 ;取60次32個(gè)正弦波數(shù)據(jù)d

9、dd:mov si,0lll:mov al,data1si ;取正弦波數(shù)據(jù)mov dx,io0832aout dx,al ;放音call delay ;調(diào)延時(shí)子程序inc sicmp si,32 ;是否取完32個(gè)數(shù)據(jù)jl lll ;若沒(méi)有,則繼續(xù)loop ddd ;總循環(huán)次數(shù)60是否完,沒(méi)有,則繼續(xù)jmp sssexit:mov ah,4chint 21hdelay proc near ;延時(shí)子程序ccc:mov bx,offset timemov dx,io8253b ;置8253通道0為方式0工作mov al,10hout dx,almov dx,io8255b ;設(shè)8255A口輸入mov

10、 al,9bhout dx,almov al,num ;取相應(yīng)的時(shí)間常數(shù)xlatmov dx,io8253aout dx,al ;向8253通道0輸出kkk:mov dx,io8255ain al,dx ;從8255A口讀一字節(jié)test al,01 ;判PA0口是否為1jz kkk ;若不為1,則轉(zhuǎn)KKKret ;子程序返回delay endpcode endsend start四、實(shí)驗(yàn)體會(huì) 編輯程序有很多種,但按功能劃分,主要有兩大類。一類是行編輯程序,如EDIT編輯程序;另一類是全屏幕編輯程序如Quick Edit(QE)。行編輯程序功能較弱,不如全屏幕編輯程序方便、靈活。 實(shí)驗(yàn)三 825

11、3定時(shí)器/計(jì)數(shù)器接口與數(shù)字電子琴一、實(shí)驗(yàn)?zāi)康?改變定時(shí)器2的計(jì)數(shù)值來(lái)改變聲音頻率,通過(guò)編程來(lái)獲得聲調(diào)(頻率)和節(jié)奏(延時(shí)長(zhǎng)短),使計(jì)算機(jī)演奏出樂(lè)曲來(lái)。二、實(shí)驗(yàn)原理 PC機(jī)的主機(jī)箱上裝有一只小喇叭,由定時(shí)器8253和并行接口芯片8255控制其發(fā)音,其電路如下: 8253 DRIVER 19318MHZ CLK OUT2 8255 PB0 GATE2 PB1 8253用定時(shí)器2來(lái)產(chǎn)生896Hz的音頻信號(hào)使喇叭發(fā)聲,我們可以改變定時(shí)器2的計(jì)數(shù)值來(lái)改變聲音頻率,通過(guò)發(fā)聲的延時(shí)程序來(lái)獲得時(shí)間長(zhǎng)短不同的聲音,于是就可以通過(guò)編程;來(lái)獲得聲調(diào)(頻率)和節(jié)奏(延時(shí)長(zhǎng)短),使計(jì)算機(jī)演奏出樂(lè)曲來(lái)。如果再把音符1,2

12、,3,4, . . .5,6,7,1,2,3,······與數(shù)字鍵1,2,3,4,5,6,7,8,9,······對(duì)應(yīng)起來(lái),就可以把計(jì)算機(jī)變成電子琴。以下給出有關(guān)資料: 1音符 1, 2, 3, 4 ,5 ,6, 7, 1, 2, 3, 4, 5, 6, 7, 頻率 131 147 165 175 196 220 247 262 294 330 349 392 440 494 5232計(jì)數(shù)值計(jì)算公式 計(jì)數(shù)值=1.19318MHz(時(shí)鐘頻率)/ 給定頻率 =1234DCH /

13、給定頻率 8253道地地定時(shí)器通道2的端口地址:42H(存放計(jì)數(shù)值,先送低位字節(jié),后送高位字節(jié)) 命令寄存器地址:43H4實(shí)驗(yàn)程序:1) 計(jì)算計(jì)數(shù)值程序段:MOV DI, 給定頻率 MOV DX, 12HMOV AX, 34DCHDIV DIAX中即為計(jì)數(shù)值。2) 打開(kāi)揚(yáng)聲器發(fā)聲,8255PB0,PBI送出高電平:IN AL 61HOR AL 3OUT 61H AL3)關(guān)閉揚(yáng)聲器,停止發(fā)聲:IN AL 61HOR AL 0FCHOUT 61H AL三 實(shí)驗(yàn)體會(huì) 實(shí)驗(yàn)剛開(kāi)始有點(diǎn)不知如何下手,經(jīng)過(guò)請(qǐng)教別人和網(wǎng)上查找資料,慢慢有了思路。通過(guò)學(xué)習(xí)和研究利用8253定時(shí)器/計(jì)數(shù)器的特點(diǎn)和功能,應(yīng)用編程知

14、識(shí)慢慢調(diào)試,最終編出音樂(lè)來(lái)。獲得實(shí)驗(yàn)成功的時(shí)候,覺(jué)得知識(shí)在生活中的應(yīng)用真是太美妙了!以后將學(xué)著去編出其他曲目的程序來(lái)。 實(shí)驗(yàn)四 實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?設(shè)計(jì)一個(gè)時(shí)鐘顯示程序,要求利用定時(shí)器0的定時(shí)中斷記錄時(shí)間。二、 實(shí)驗(yàn)原理PC機(jī)中8253定時(shí)器0是作為系統(tǒng)時(shí)鐘的定時(shí)中斷使用的,它被設(shè)置為每秒產(chǎn)生18。2次定時(shí)中斷。用戶可以改寫中斷向量表,使這個(gè)0級(jí)中斷轉(zhuǎn)入自己的定時(shí)服務(wù)程序中去,也可以重新初始化該計(jì)數(shù)器,使之產(chǎn)生用戶所需要的定時(shí)中斷,這樣就可以在計(jì)算機(jī)控制系統(tǒng)中用來(lái)定時(shí)采樣壓力,溫度等等被控制參數(shù),然后進(jìn)行開(kāi)環(huán)或閉環(huán)控制。BIOS在初始化8253定時(shí)器以后,給用戶留下了一個(gè)INT 1CH的

15、軟件接口,其處理程序只是一條空操作返回指令,用戶可以將其入口地址填入中斷向量表1CH型中斷向量,使得一進(jìn)入1CH型中斷,便立即執(zhí)行用戶自己的程序,執(zhí)行完又返回中斷服務(wù)程序繼續(xù)執(zhí)行第二種方式是重新設(shè)置定時(shí)器0,使其工作在方式3,裝入計(jì)數(shù)值11932,使其每10ms發(fā)一次定時(shí)中斷。由于定時(shí)器0的中斷類型號(hào)是08H,所以應(yīng)將用戶的中斷服務(wù)程序入口地址填入中斷向量表的08H向量中。三、 實(shí)驗(yàn)內(nèi)容:1 用第二種方式重新設(shè)置定時(shí)器0,使其工作在方式3(控制寄存器地址43H),裝入計(jì)數(shù)值11932(端口地址40H),使超10ms產(chǎn)生一次中斷;2 設(shè)計(jì)一個(gè)時(shí)鐘顯示程序,要求利用定時(shí)器0的定時(shí)中斷記錄時(shí)間,然后

16、以hh:mm:ss的形式在屏幕上顯示出來(lái)(hh是小時(shí),mm是分,ss是秒),每秒鐘顯示一次,而且必須在同一位置顯示,才能看見(jiàn)變化數(shù)位的數(shù)字跳動(dòng)。3 將程序的入口地址寫入中斷向量08H,注意在寫入前,必須設(shè)置一個(gè)變量將原中斷向量保存起來(lái),以便在程序結(jié)束時(shí)恢復(fù)。4 程序中要設(shè)計(jì)輸入正確計(jì)時(shí)點(diǎn)(當(dāng)前時(shí)間值)的方法。5 按ESC鍵推出,返回DOS。(注意:要恢復(fù)原來(lái)的中斷向量,此功能才能實(shí)現(xiàn))。6 程序中允許時(shí)鐘和鍵盤中斷。四、簡(jiǎn)略流程圖。開(kāi)始利用PSP參數(shù)區(qū)存放命令行參數(shù)讀按鍵(當(dāng)前時(shí)間與命令行參數(shù)相 定時(shí)中斷子程序入口等時(shí),按回車,程序向下執(zhí)行) 保存原08H型中斷向量 改變時(shí)分秒計(jì)數(shù)值 寫入新的

17、中斷向量 并以ASCII碼形式形成 顯示字符串 初始化8253通道0, 使其工作在 方式3, 每10ms發(fā)一次中斷 IRET 檢查秒計(jì)數(shù)值改變否,若改變?cè)?同一位置顯示時(shí)間,否則不顯示 定時(shí)中斷子程序流程圖 有鍵按下否? N Y 恢復(fù)原中斷向量 返回DOS 主程序流程圖五、實(shí)驗(yàn)程序 1、利用RTC的增量功能進(jìn)行1s的定時(shí),當(dāng)定時(shí)時(shí)間到,取反LED控制#include "config.h"#define LED1CON 0x00000400 /*P0.10口為L(zhǎng)ED1控制器*/*定義Fpclk值,用于設(shè)置串口波特率*/#define FPCLK 3686250L2、初始化實(shí)時(shí)

18、時(shí)鐘void RTCIni(void) PREINT=FPCLK/32768-1; /設(shè)置預(yù)分頻器 PREFRAC=FPCLK-(FPCLK/32768)*32768; YEAR=2005; /初始化年 MONTH=6; /初始化月 DOM=10; /初始化日 CIIR=0x01; /設(shè)置秒值的增量產(chǎn)生一次中斷 CCR=0x01; /啟動(dòng)RTC3、使用RTC的秒增量中斷功能控制LED閃動(dòng)int main(void) PINSEL0=0x00000000; /引腳連接設(shè)置 PINSEL1=0x00000000; IODIR=LED1CON; RTCIni(); /初始化RTC while(1)

19、IOSET=LED1CON; /熄滅LED1 while(0=(ILR&0x01); /等待RTC增量中斷標(biāo)志 ILR=0x01; /清除中斷標(biāo)志 IOCLR=LED1CON; /點(diǎn)亮LED1 while(0=(ILR&0x01); ILR=0x01; return(0);4、運(yùn)行rtc進(jìn)行計(jì)時(shí),并將所計(jì)時(shí)間值不斷地通過(guò)串口向上位機(jī)發(fā)送#include "config.h"#define LED1CON 0x00000400 /*P0.10口為L(zhǎng)ED1控制端*/* 定義Fpclk值,用于設(shè)置串口波特率*/#define FPCLK 2764800L/*定義串

20、口模式設(shè)置數(shù)據(jù)結(jié)構(gòu)*/typedef struct UartMode uint8 datab; /字長(zhǎng)度,5/6/7/8 uint8 stopb; /停止位,1/2 uint8 parity; /奇偶校驗(yàn)位,0為無(wú)校驗(yàn),1為奇數(shù)校驗(yàn),2為偶數(shù)校驗(yàn) UARTMODE;uint8 send_buf16; /UART0數(shù)據(jù)接收緩沖區(qū) 5、初始化串口0,設(shè)置其工作模式及波特率入口參數(shù): baud 波特率 set 模式設(shè)置(UARTMODE數(shù)據(jù)結(jié)構(gòu))出口參數(shù): 返回值為1時(shí)表示初始化成功,為0時(shí)表示參數(shù)出錯(cuò)uint8 UART0_Ini(uint32 baud, UARTMODE set) uint32

21、 bak; /*參數(shù)過(guò)濾*/ if (0=baud)|(baud>115200)return(0); if (set.datab<5)|(set.datab>8)return(0); if (0=set.stopb)|(set.stopb>2)return(0); if (set.parity>4)return(0); /*設(shè)置串口波特率*/ U0LCR=0x80; /DLAB位置1 bak=(FPCLK>>4)/baud; U0DLM=bak>>8; U0DLL=bak&0xff; /*設(shè)置串口模式*/ bak=set.datab

22、-5; /設(shè)置字長(zhǎng)度 if(2=set.stopb)bak|=0x04; /判斷是否為2位停止位 if(0!=set.parity)set.parity=set.parity-1; bak|=0x08; bak|=set.parity<<4; /設(shè)置奇偶校驗(yàn) U0LCR=bak; return(1);6、向串口發(fā)送字節(jié)數(shù)據(jù),并等待發(fā)送完畢void SendByte(uint8 data) U0THR=data; /發(fā)送數(shù)據(jù) while(U0LSR&0x20)=0); /等待數(shù)據(jù)發(fā)送 7、將緩沖區(qū)的數(shù)據(jù)發(fā)送回主機(jī)入口參數(shù): buf 數(shù)據(jù)緩沖區(qū) no 發(fā)送數(shù)據(jù)的個(gè)數(shù)出口參數(shù):

23、無(wú)void ISendBuf(uint8 const *buf,uint8 no) uint8 i; for(i=0;i<no;i+)SendByte(bufi); 8、讀取rtc的時(shí)間值,并將讀出的時(shí)分秒值由串口發(fā)送到上位機(jī)顯示void SendTimeRtc(void) uint8 const MESSAGE="RTC Time is:" uint32 times; uint8 bak; times=CTIME0; /讀取完整時(shí)鐘寄存器0 bak=(times>>16)&0x1F; /取得時(shí)的值 send_buf0=bak/10+'0&

24、#39; send_buf1=bak%10+'0' send_buf2=':' bak=(times>>8)&0x3F; /取得分的值 send_buf3=bak/10+'0' send_buf4=bak%10+'0' send_buf5=':' bak=times&0x3F; /取得秒的值 send_buf6=bak/10+'0' send_buf7=bak%10+'0' send_buf8='n' ISendBuf(MESSAGE,14

25、); /發(fā)送數(shù)據(jù) ISendBuf(send_buf,9); 9、初始化實(shí)時(shí)時(shí)鐘void RTCIni(void) PREINT=FPCLK/32768-1; /設(shè)置預(yù)分頻器 PREFRAC=FPCLK-(FPCLK/32768)*32768; YEAR=2005; /初始化年 MONTH=6; /初始化月 DOM=10; /初始化日 HOUR=8; MIN=30; SEC=0; CIIR=0x01; /設(shè)置秒值的增量產(chǎn)生一次中斷 CCR=0x01; /啟動(dòng)RTC 10、讀取實(shí)時(shí)時(shí)鐘的值,并從串口發(fā)送出去int main(void) UARTMODE uart0_set; PINSEL0=0x

26、00000005; /設(shè)置I/O連接到UART0 PINSEL1=0x00000000; IODIR=LED1CON; /設(shè)置LED1控制口為輸出,其它I/O為輸入 uart0_set.datab=8; /8位數(shù)據(jù)位 uart0_set.stopb=1; /1位停止位 uart0_set.parity=0; /無(wú)奇偶校驗(yàn)位 UART0_Ini(9600,uart0_set); /初始化串口模式 U0FCR=0x01; /使能FIFO RTCIni(); /初始化RTC while(1) IOSET=LED1CON; /熄滅LED while(0=(ILR&0x01); /等待RTC增量

27、中斷標(biāo)志位 ILR=0x01; /清除中斷標(biāo)志位 SendTimeRtc(); /讀取時(shí)鐘值,并向UART0發(fā)送 IOCLR=LED1CON; /點(diǎn)亮LED while(0=(ILR&0x01); ILR=0x01; SendTimeRtc(); return(0);六、實(shí)驗(yàn)體會(huì) 本次實(shí)驗(yàn),使我對(duì)微機(jī)軟硬件結(jié)合有了進(jìn)一步的了解。原來(lái)并不太清楚是什么意思,一直都很模糊,聽(tīng)課本也是很迷茫;而之前的那些單元實(shí)驗(yàn),也沒(méi)有都做好。之前做的實(shí)驗(yàn),由于大部分是驗(yàn)證性的,所以就很被動(dòng)地去做,甚至并沒(méi)有想為什么要那樣連電路,內(nèi)部的代碼更沒(méi)有認(rèn)真看。這次,因?yàn)橐约喝ピO(shè)計(jì)整個(gè)過(guò)程,所以就不得不去

28、了解學(xué)習(xí)自己原來(lái)并沒(méi)有真正弄懂的東西。這也使我對(duì)前面所做的實(shí)驗(yàn)有了原理性的了解,回頭看一些實(shí)驗(yàn),也知其然其所以然了。同時(shí)對(duì)課本上講的一些內(nèi)容,不再像以前那樣覺(jué)得抽象,通過(guò)這次設(shè)計(jì),有了具體的理解。 實(shí)驗(yàn)五、8255并行接口鍵盤實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?、掌握8255A的功能及方式0、1的實(shí)現(xiàn)2、熟悉8255A與CPU的接口,以及傳輸數(shù)據(jù)的工作原理及編程方法。3、利用09H型中斷設(shè)計(jì)一個(gè)自己的鍵盤中斷服務(wù)程序,程序設(shè)計(jì)應(yīng)考慮在退出時(shí)不破壞原有的設(shè)置。二、實(shí)驗(yàn)內(nèi)容與過(guò)程1 、8255的工作方式一片8255內(nèi)部有3個(gè)端口,A口可以工作在方式0、方式1或方式2,B口可以工作在方式0、方式1,C口可以

29、工作在方式0。方式0是基本型輸入/輸出。這種方式和外設(shè)交換數(shù)據(jù)時(shí),8255端口與外設(shè)之間不使用聯(lián)絡(luò)線。方式1為選通型輸入/輸出。用這種方式和外界交換數(shù)據(jù)時(shí),端口和外設(shè)之間要有聯(lián)絡(luò)信號(hào)。方式2是雙向數(shù)據(jù)傳送,僅A口有這項(xiàng)功能。當(dāng)A口工作在方式2時(shí),B口仍可以工作在方式0或方式1,但此時(shí)B口方式1只能用查詢方式與CPU交換信息。2.、工作方式選擇字8255工作方式選擇字共8位,存放在8255控制寄存器中。最高位D7為標(biāo)志位,D7=1表示控制寄存器中存放的是工作方式選擇字,D7=0表示控制寄存器中存放的是C口置位/復(fù)位控制字。3 、C口置/復(fù)位控制字8255的C口可進(jìn)行位操作,即:可對(duì)8255C口的

30、每一位進(jìn)行置位或清零操作,該操作是通過(guò)設(shè)置C口置/復(fù)位字實(shí)現(xiàn)的(圖8-10)。C口置/復(fù)位字共8位,各位含義如下:4、 命令字與初始化編程8255有兩個(gè)命令字,即方式選擇控制字和C口置0/置1控制字,初始化編程的步驟是: 向8255控制寄存器寫入“方式選擇控制字”,從而預(yù)置端口的工作方式。 當(dāng)端口預(yù)置為方式1或方式2時(shí),再向控制寄存器寫入“C口置0/置1控制字”。這一操作的主要目的是使相應(yīng)端口的中斷允許觸發(fā)器置0,從而禁止中斷,或者使相應(yīng)端口的中斷允許觸發(fā)器置1,從而允許端口提出中斷請(qǐng)求。 注意:“C口置0/置1控制字”雖然是對(duì)C口進(jìn)行操作,但是該控制字是命令字,所以要寫入控制寄存器,而不是寫

31、入C口控制寄存器。 向8255數(shù)據(jù)寄存器寫入“數(shù)據(jù)”或從8255數(shù)據(jù)寄存器讀出“數(shù)據(jù)”。三、實(shí)驗(yàn)操作過(guò)程鍵盤驅(qū)動(dòng)的主要作用就是實(shí)時(shí)監(jiān)測(cè)外部按鍵中斷,一旦發(fā)現(xiàn)外部有鍵按下就向內(nèi)核發(fā)送鍵盤消息實(shí)現(xiàn)鍵盤輸入功能。鍵盤驅(qū)動(dòng)創(chuàng)建了中斷服務(wù)線程和4個(gè)鍵盤中斷事件,每行按鍵對(duì)應(yīng)一個(gè)鍵盤中斷事件。有鍵被按下時(shí),中斷服務(wù)例程得到對(duì)應(yīng)的中斷標(biāo)識(shí)符并報(bào)告給系統(tǒng)任務(wù)調(diào)度進(jìn)程,同時(shí)產(chǎn)生鍵盤中斷事件,鍵盤中斷服務(wù)線程響應(yīng)鍵盤中斷事件,開(kāi)始掃描矩陣鍵盤。根據(jù)產(chǎn)生的中斷事件類型不同,可以首先確定被按下鍵的行位置。由于鍵盤被按下后,該鍵對(duì)應(yīng)的行和列被連通,因此根據(jù)判斷各列對(duì)應(yīng)的I/O口的電平,可以得到被按下鍵的列位置;得到按鍵

32、的準(zhǔn)確位置后,通過(guò)向操作系統(tǒng)發(fā)送鍵盤消息KEYBD_EVENT,實(shí)現(xiàn)一次鍵盤輸入。循環(huán)掃描鍵盤,直到按鍵被彈起則發(fā)送KEYEVENTF_KEYUP事件。響應(yīng)鍵盤中斷輸入的整個(gè)流程如圖。1、 在OAL層加入中斷源矩陣鍵盤采用4路I/O口中斷,每路中斷對(duì)應(yīng)1個(gè)中斷源。矩陣鍵盤驅(qū)動(dòng)首先要在OAL層加入這些中斷源。以其中一路中斷為例:#define SYSINTR_KEYONE(SYSINTR_FIRMWARE+0)2 、中斷服務(wù)例程(ISR)設(shè)計(jì)本鍵盤驅(qū)動(dòng)將GPIO_6、GPIO_7、GPIO_16、GPIO_17四個(gè)I/O口作為中斷I/O口。有鍵被按下時(shí)將產(chǎn)生一個(gè)I/O中斷,內(nèi)核首先進(jìn)入異常中斷處理程序,由它屏蔽所有中斷,再調(diào)用中斷服務(wù)例程ISR得到該中斷的邏輯中斷標(biāo)識(shí)。鑒于ISR的任務(wù)比較單一,ISR通常都要求越短、越快越好。矩陣鍵盤驅(qū)動(dòng)的ISR設(shè)計(jì)如下:if(v_pGPIORegGEDR_x & GPIO_6) /中斷觸發(fā) v_pGPIORegGEDR_x = GPIO_6;/清除中斷 return SYSINTR_KEYONE;/返回中斷標(biāo)識(shí)其他三路中斷的ISR設(shè)計(jì)與

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論