《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 80C196單片機(jī)鼠標(biāo)接口程序設(shè)計(jì)實(shí)例

80C196單片機(jī)鼠標(biāo)接口程序設(shè)計(jì)實(shí)例

2008-10-16
作者:楊國(guó)田 白 焰1 徐培民2

??? 摘? 要: 通過(guò)對(duì)鼠標(biāo)底層通信原理及協(xié)議的深入分析,探討了鼠標(biāo)在80C196單片機(jī)系統(tǒng)中的應(yīng)用價(jià)值與可行性,并介紹了鼠標(biāo)接口軟件設(shè)計(jì)的原理及方法,給出了80C196單片機(jī)與Microsoft鼠標(biāo)的具體接口程序。?

??? 關(guān)鍵詞: 鼠標(biāo)? 接口技術(shù)? 軟件設(shè)計(jì)? 接口程序

?

??? 80C196單片機(jī)由于價(jià)格低、處理能力強(qiáng),在信號(hào)分析、數(shù)據(jù)采集等很多領(lǐng)域得到廣泛應(yīng)用,在目標(biāo)系統(tǒng)中使用各種規(guī)格的液晶或CRT顯示器也越來(lái)越多。因此在這樣的單片機(jī)系統(tǒng)中引入鼠標(biāo),將會(huì)方便操作,提高工作效率。鼠標(biāo)內(nèi)核本質(zhì)上是一個(gè)二維的角度或位移信號(hào)檢測(cè)裝置,耗電極少、可靠性高、價(jià)格低廉,可以在許多場(chǎng)合發(fā)揮作用。鼠標(biāo)與主機(jī)之間通過(guò)RS-232標(biāo)準(zhǔn)串行接口" title="串行接口">串行接口進(jìn)行通信,信息傳送是單方向、無(wú)條件、無(wú)應(yīng)答連續(xù)進(jìn)行的。此外80C196的UART不直接支持鼠標(biāo)的接口協(xié)議,在程序設(shè)計(jì)" title="程序設(shè)計(jì)">程序設(shè)計(jì)中必須予以注意。本文主要探討80C196單片機(jī)與Microsoft兼容鼠標(biāo)接口程序的設(shè)計(jì)實(shí)現(xiàn)。?

1 鼠標(biāo)信號(hào)發(fā)送協(xié)議與過(guò)程?

??? 鼠標(biāo)是一個(gè)功能高度集中的小型機(jī)電一體化系統(tǒng)。它首先將直線位移轉(zhuǎn)換成角度位移,再轉(zhuǎn)變成數(shù)字量,然后與按鈕狀態(tài)統(tǒng)一編碼,通過(guò)RS-232串口" title="串口">串口發(fā)出。鼠標(biāo)工作所需功率從RS-232串行接口的控制線上竊取(PS/2、USB接口鼠標(biāo)除外)。當(dāng)鼠標(biāo)被拖動(dòng)" title="拖動(dòng)">拖動(dòng)超過(guò)一個(gè)最小距離或某一按鈕被按下時(shí),它按照規(guī)定的協(xié)議將移動(dòng)的距離和按鈕狀態(tài)通過(guò)一次或幾次信息發(fā)送到主機(jī);主機(jī)上的鼠標(biāo)驅(qū)動(dòng)程序?qū)⑿畔⒆儞Q成鼠標(biāo)位置和按鈕狀態(tài)供其它程序模塊調(diào)用。每發(fā)生一次移動(dòng)或按鈕狀態(tài)變化,鼠標(biāo)向上發(fā)送一次信息。通常一般鼠標(biāo)的分辨率為400DPI。理論上即沿著某一方向每拖動(dòng)一英寸(一般速度),會(huì)產(chǎn)生400次信息發(fā)送過(guò)程。如果拖動(dòng)較快,則信息發(fā)送次數(shù)減少,但所反映的總的移動(dòng)距離仍然是400步。?

??? 各種串行接口鼠標(biāo)在物理層普遍采用標(biāo)準(zhǔn)的串行通信協(xié)議,波特率為1200bps。幀格式為7個(gè)數(shù)據(jù)位、2個(gè)停止位,無(wú)奇偶校驗(yàn)位。上層協(xié)議則在此基礎(chǔ)上以十六進(jìn)制數(shù)形式直接發(fā)送鼠標(biāo)信息,包括:初始化報(bào)告;移動(dòng)方向、距離、按鈕狀態(tài)。其一般形式如表1所示。?

?

?

2 鼠標(biāo)接口程序設(shè)計(jì)?

??? 80C196系列單片機(jī)內(nèi)設(shè)RS-232收發(fā)器,但需要配置接口芯片實(shí)現(xiàn)電平轉(zhuǎn)換??紤]到鼠標(biāo)從串口竊取功率,接口芯片必須具有一定的驅(qū)動(dòng)能力,而不能采用簡(jiǎn)單的準(zhǔn)RS-232電平轉(zhuǎn)換器。這里采用MAX232E作為接口芯片。?

??? 圖1中左側(cè)為80C196單片機(jī),P2.0(TXD)、P2.1(RXD)通過(guò)MAX232E形成滿足鼠標(biāo)要求的串行接口,包括生成標(biāo)準(zhǔn)RS-232C電平和提供電源供應(yīng)。圖1中最右邊為9針或25針標(biāo)準(zhǔn)串行接插件。由于鼠標(biāo)的電源供應(yīng)采用功率竊取方案,由DTR/RTS提供,這里為DTR加限流電阻防止對(duì)鼠標(biāo)造成傷害。RTS由MAX232E的信號(hào)發(fā)送端提供,通過(guò)80C196的P2.0控制MAX232E的10腳(對(duì)應(yīng)的輸出腳為7腳)電平高低以改變7腳電位,使鼠標(biāo)可以接收來(lái)自RTS的控制命令,以實(shí)現(xiàn)鼠標(biāo)安裝與否的檢測(cè)。在MAX232E的11腳(對(duì)應(yīng)的輸入腳為14腳)設(shè)置高電平以保證14腳電位為負(fù)RS-232電位,滿足鼠標(biāo)發(fā)送信號(hào)時(shí)的電平要求。?

?

?

??? 從鏈路層看,80C196串行接口的四種工作方式" title="工作方式">工作方式均不滿足鼠標(biāo)的幀格式要求;但其工作方式1(1位起始位、8位數(shù)據(jù)位、1位停止位)的總傳送位數(shù)與鼠標(biāo)(1位起始位、7個(gè)數(shù)據(jù)位、2個(gè)停止位)相同,均為10位。接收過(guò)程中80C196收到7個(gè)數(shù)據(jù)位后,將2個(gè)停止位中的第一個(gè)作為數(shù)據(jù)位裝入接收緩沖器的最高位,由于停止位在物理層是高電平,作為數(shù)據(jù)被接收后相當(dāng)于邏輯“0”;剩下的第二個(gè)停止位恰好為80C196 提供了有效的停止位。利用80C196的工作方式1完全可以保證正確接收鼠標(biāo)信息。?

??? 單片機(jī)起動(dòng)后,通過(guò)鼠標(biāo)驅(qū)動(dòng)模塊對(duì)鼠標(biāo)進(jìn)行初始化,即通過(guò)P2.0使RTS電平翻轉(zhuǎn)一次而令鼠標(biāo)發(fā)送初始化報(bào)告,以確認(rèn)鼠標(biāo)是否安裝。之后,鼠標(biāo)即可隨著拖動(dòng)或按鈕操作向單片機(jī)發(fā)送動(dòng)作信息,經(jīng)接口模塊翻譯即可反應(yīng)鼠標(biāo)位置和按鈕狀態(tài)。?

??? 鼠標(biāo)接口模塊主要包括按鈕狀態(tài)識(shí)別和位置識(shí)別兩個(gè)部分。80C196將根據(jù)接收到的鼠標(biāo)信息不斷刷新鼠標(biāo)信息緩沖區(qū)。由于鼠標(biāo)事件間隔不確定,采用掃描方式不但會(huì)浪費(fèi)CPU時(shí)間,還可能因來(lái)不及處理而丟失信息。有效的處理方法是采用中斷方式接收,應(yīng)用模塊通過(guò)軟件接口獲得鼠標(biāo)信息。完整的鼠標(biāo)接口程序流程圖如圖2所示。在初始化階段,首先檢查鼠標(biāo)是否存在,根據(jù)結(jié)果設(shè)置標(biāo)志位,以備以后取鼠標(biāo)信息時(shí)判斷用;根據(jù)需要設(shè)定鼠標(biāo)初始位置、按鈕原始狀態(tài);最后設(shè)置串行接口參數(shù)(幀格式等)并開(kāi)放鼠標(biāo)中斷。鼠標(biāo)發(fā)送信息時(shí),每三個(gè)字節(jié)為一個(gè)完整的信息報(bào)告。但80C196每接收到一個(gè)字節(jié),就產(chǎn)生一次中斷,然后根據(jù)當(dāng)前字節(jié)是否大于40H確定其性質(zhì)。若是信息報(bào)告的首字節(jié),則還要進(jìn)一步通過(guò)有效性檢驗(yàn)后保存;若不是首字節(jié),則必須經(jīng)過(guò)一系列檢驗(yàn)后保存起來(lái)。收到三個(gè)字節(jié)后立即進(jìn)行命令分析和執(zhí)行。具體處理過(guò)程可參看源程序。用戶模塊通過(guò)特定接口模塊(圖2(b))獲得鼠標(biāo)當(dāng)前位置和按鈕狀態(tài),并可通過(guò)進(jìn)位標(biāo)志C=0/1判斷鼠標(biāo)是否安裝。?

?

?

?

??? 下面是圖2、3程序流程圖對(duì)應(yīng)的程序清單。該程序要求80C196單片機(jī)的工作頻率為12MHz;如果采用其它工作頻率,通過(guò)修改串行口的波特率設(shè)置參數(shù)以及延時(shí)程序的時(shí)間常數(shù)即可。?

;?

; 8098 特殊功能寄存器預(yù)定義?

??? R0????????? EQU?? 00H:Word?

??? SBUF??????? EQU?? 07H:Byte?

??? INT_MASK??? EQU?? 08H:Byte?

??? INT_PEND??? EQU?? 09H:Byte?

??? BAUD_RT ??? EQU?? 0EH:Byte?

??? IOP2??????????? EQU?? 10H:Byte?

??? SP_CON????? EQU?? 11H:Byte?

??? SP_STAT???? EQU?? 11H:Byte?

??? IOC1??????? EQU?? 16H:Byte?

??? SP????????? EQU?? 18H:Word?

??? ;?

??? ; 通用寄存器預(yù)定義?

??? RSEG??? AT???? 1CH?

??????? AX:???? DSW??? 1?

??????? DX:???? DSW??? 1?

??????? AL????? EQU??? AX:BYTE?

??????? AH????? EQU??? (AX+1):BYTE?

??????? DL????? EQU??? DX:BYTE?

??????? DH????? EQU??? (DX+1):BYTE?

??????? SCRNW?? EQU??? 640? ;顯示屏寬度?

??????? SCRNH?? EQU??? 480? ;顯示屏高度?

;?

; 變量區(qū)?

RSEG??? AT????? 20H?

??????? M_X :? DSW??? 1??????? ;光標(biāo)X值?

??????? M_Y? :? DSW??? 1??????? ;光標(biāo)Y值?

??????? M_BUF:? DSB??? 4??????? ;接收緩沖區(qū)?

??????? M_P? :? DSW??? 1??????? ;接收指針?

??????? BX?? :? DSW??? 1?

??????? LRB_OK: DSB??? 1??????? ;鼠標(biāo)狀態(tài),?

;Bit7: 存在, Bit5: 左鍵, Bit4: 右鍵?

;?

CSEG??? AT????? 2000H?

??????? DCW???? INIT?

CSEG??? AT????? 200CH?

??????? DCW???? SIOINT?

??????? DCW???? INIT?

??????? DCW???? 0?

??????? DCB???? 0, 0, 0, 0, 0, 0?

??????? DCB???? 08DH?

??????? DCB???? 000H?

??????? DCB???? 027H, 0FEH?

;?

CSEG??? AT????? 2080H?

INIT:?? LD????? SP, #0100H???? ;設(shè)堆棧指針?

??????? LD????? M_X, #SCRNW/2? ;初始化指針?

??????? LD????? M_Y, #SCRNH/2?

??????? ANDB??? LRB_OK, #7CH?

??????? LD????? M_P, #M_BUF?

??????? CLRB??? INT_PEND??????? ;清除中斷?

??????? LDB???? INT_MASK, #40H ;開(kāi)串行中斷?

??????? LDB???? AL, SP_STAT??????? ;清除RI/TI?

??????? LDB???? SP_CON, #09H?? ;設(shè)串口模式?

??????? LDB???? BAUD_RT, #9BH? ;1200,12MHz?

??????? LDB???? BAUD_RT, #80H?

??????? EI?

??????? ANDB??? IOP2, #0FEH??????? ;P2.0=0?

??????? LD????? AX, #8000H???? ;延遲200ms?

DLY0:?? DEC???? AX?

??????? JNE???? DLY0?

??????? LDB???? AL, LRB_OK?

??????? JBS???? AL,7, M_OK?

??????? ANDB??? INT_MASK, #0BFH?

M_OK:NOP?

;? ... ... ...?

;?

;清單二:取鼠標(biāo)信息, ?

??????? AL=鼠標(biāo)及按鈕狀態(tài), BX=X, DX=Y?

GET_M:ANDB? INT_MASK, #0BFH ?

??????? LDB???? AL, LRB_OK???? ;取鼠標(biāo)信息?

??????? LD????? BX, M_X?

??????? LD????? DX, M_Y?

??????? ORB???? INT_MASK, #40H?

??????? RET?

;?

;清單三:串口中斷服務(wù)程序?

SIOINT: PUSHF?????????????? ;中斷服務(wù)?

??????? PUSH??? AX?

??????? LDB???? AL, SBUF?

??????? LDB???? AH, SP_STAT?

??????? JBS???? AL, 6, ISB0?????? ;第一個(gè)字節(jié)?

??????? CMP???? M_P, #M_BUF?

??????? JNE???? SIO_1?

??????? SJMP??? C99???????????? ;緩沖區(qū)空,出錯(cuò)?

SIO_1:CMP?? M_P, #M_BUF+2?

??????? JH????? C98???????????? ;緩沖區(qū)滿,出錯(cuò)?

??????? STB???? AL, [M_P]+???? ;存儲(chǔ)收到字節(jié)?

??????? CMP???? M_P, #M_BUF+3?

??????? JNE???? C99?

??????? LD????? M_P, #M_BUF??? ;已收到完整命令?

GOLR:LDB??? AL, 1[M_P]???? ;處理X方向位移?

??????? SHLB??? AL, #2?

??????? EXTB??? AL?

??????? SHRA??? AX, #2?

??????? ADD???? M_X, AX?

CKL:??? CMP???? M_X, #0?

??????? JGE???? CKR?

??????? CLR???? M_X?

CKR:??? CMP???? M_X, #SCRNW?

??????? JLT???? GOUD?

??????? LD????? M_X, #SCRNW?

GOUD:?? LDB??? ?AL, 2[M_P] ;處理Y方向位移?

??????? SHLB??? AL, #2?

??????? EXTB??? AL?

??????? SHRA??? AX, #2?

??????? ADD???? M_Y, AX?

CKU:??? CMP???? M_Y, #0?

??????? JGE???? CKD?

??????? CLR???? M_Y?

CKD:??? CMP???? M_Y, #SCRNH?

??????? JLT???? ELRUD?

??????? LD????? M_Y, #SCRNH?

ELRUD:? SJMP?? ?C98?

ISB0:?? STB???? AL, M_BUF?

??????? ANDB??? AL, #0FH?

??????? CMPB??? AL, #03H?

??????? JE????? C97???????????? ;=X3H,?

??????? CMPB??? AL, #0CH?

??????? JE????? C97???????????? ;=XCH?

??????? CMPB??? AL, #0DH?

??????? JNE???? C98???????????? ;<>XDH?

??????? ORB???? LRB_OK, #80H?? ;確認(rèn)鼠標(biāo)正常?

C97:??? ANDB??? AL, M_BUF, #30H?

??????? ANDB??? LRB_OK, #80H?

??????? ORB???? LRB_OK, AL???? ;更新左右鍵狀態(tài)?

??????? LD????? M_P, #M_BUF+1?

??????? SJMP??????? C99?

C98:??? LD????? M_P, #0000H?

C99:??? POP???? AX?

??????? POPF?

??????? RET?

;?

??????? END?

參考文獻(xiàn)?

1 INTEL. 8XC196Kx,8XC196Jx,87C196CA Micro-controller?Family User's Manual,?

2 徐君毅,張友德.單片微型計(jì)算機(jī)原理及應(yīng)用.上海:上??茖W(xué)技術(shù)出版社,1989?

3 孫涵芳,徐愛(ài)卿.MCS51-96系列單片機(jī)原理及應(yīng)用.北京:北京航空學(xué)院出版社,1988?

4 MAXIM.新產(chǎn)品數(shù)據(jù)手冊(cè),第四卷.1995

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。