《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業界動態 > 80C196單片機鼠標接口程序設計實例

80C196單片機鼠標接口程序設計實例

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

??? 摘? 要: 通過對鼠標底層通信原理及協議的深入分析,探討了鼠標在80C196單片機系統中的應用價值與可行性,并介紹了鼠標接口軟件設計的原理及方法,給出了80C196單片機與Microsoft鼠標的具體接口程序。?

??? 關鍵詞: 鼠標? 接口技術? 軟件設計? 接口程序

?

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

1 鼠標信號發送協議與過程?

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

??? 各種串行接口鼠標在物理層普遍采用標準的串行通信協議,波特率為1200bps。幀格式為7個數據位、2個停止位,無奇偶校驗位。上層協議則在此基礎上以十六進制數形式直接發送鼠標信息,包括:初始化報告;移動方向、距離、按鈕狀態。其一般形式如表1所示。?

?

?

2 鼠標接口程序設計?

??? 80C196系列單片機內設RS-232收發器,但需要配置接口芯片實現電平轉換。考慮到鼠標從串口竊取功率,接口芯片必須具有一定的驅動能力,而不能采用簡單的準RS-232電平轉換器。這里采用MAX232E作為接口芯片。?

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

?

?

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

??? 單片機起動后,通過鼠標驅動模塊對鼠標進行初始化,即通過P2.0使RTS電平翻轉一次而令鼠標發送初始化報告,以確認鼠標是否安裝。之后,鼠標即可隨著拖動或按鈕操作向單片機發送動作信息,經接口模塊翻譯即可反應鼠標位置和按鈕狀態。?

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

?

?

?

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

;?

; 8098 特殊功能寄存器預定義?

??? 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?

??? ;?

??? ; 通用寄存器預定義?

??? 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? ;顯示屏高度?

;?

; 變量區?

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

??????? M_X :? DSW??? 1??????? ;光標X值?

??????? M_Y? :? DSW??? 1??????? ;光標Y值?

??????? M_BUF:? DSB??? 4??????? ;接收緩沖區?

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

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

??????? LRB_OK: DSB??? 1??????? ;鼠標狀態,?

;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???? ;設堆棧指針?

??????? 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 ;開串行中斷?

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

??????? LDB???? SP_CON, #09H?? ;設串口模式?

??????? 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?

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

;?

;清單二:取鼠標信息, ?

??????? AL=鼠標及按鈕狀態, BX=X, DX=Y?

GET_M:ANDB? INT_MASK, #0BFH ?

??????? LDB???? AL, LRB_OK???? ;取鼠標信息?

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

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

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

??????? RET?

;?

;清單三:串口中斷服務程序?

SIOINT: PUSHF?????????????? ;中斷服務?

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

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

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

??????? JBS???? AL, 6, ISB0?????? ;第一個字節?

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

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

??????? SJMP??? C99???????????? ;緩沖區空,出錯?

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

??????? JH????? C98???????????? ;緩沖區滿,出錯?

??????? STB???? AL, [M_P]+???? ;存儲收到字節?

??????? 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?? ;確認鼠標正常?

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

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

??????? ORB???? LRB_OK, AL???? ;更新左右鍵狀態?

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

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

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

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

??????? POPF?

??????? RET?

;?

??????? END?

參考文獻?

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

2 徐君毅,張友德.單片微型計算機原理及應用.上海:上海科學技術出版社,1989?

3 孫涵芳,徐愛卿.MCS51-96系列單片機原理及應用.北京:北京航空學院出版社,1988?

4 MAXIM.新產品數據手冊,第四卷.1995

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲淫性视频| 欧美成人一区二免费视频软件| 亚洲国产精品成人| 亚洲欧美日韩国产| 亚洲午夜高清视频| 一本一道久久综合狠狠老精东影业| 亚洲激情校园春色| 亚洲国产黄色片| 在线欧美日韩国产| ●精品国产综合乱码久久久久| 国内久久婷婷综合| 激情综合色综合久久| 黄色一区二区在线观看| 国内精品美女av在线播放| 黑人一区二区| 黑人巨大精品欧美一区二区小视频| 国产一区 二区 三区一级| 国产午夜久久久久| 国内一区二区三区| 亚洲大片av| 亚洲人成亚洲人成在线观看 | 国产一区二区三区久久悠悠色av| 国产美女高潮久久白浆| 国产区在线观看成人精品| 国产一区二区成人久久免费影院| 国语自产精品视频在线看抢先版结局| 国内精品视频一区| 亚洲国产精品va在线观看黑人| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲欧洲一区二区在线播放| 一本一本久久a久久精品牛牛影视| 亚洲午夜在线观看| 午夜欧美大尺度福利影院在线看 | 国产精品永久| 激情成人av| 亚洲伦理在线免费看| 亚洲一区二区三区精品在线观看| 欧美一级理论性理论a| 亚洲福利免费| 一本色道久久综合亚洲精品不卡| 亚洲欧美日本国产有色| 久久九九精品| 欧美第十八页| 国产精品老牛| 国产有码在线一区二区视频| 亚洲国产精品久久久久| 在线亚洲欧美视频| 久久国产精品久久精品国产 | 欧美剧在线免费观看网站| 国产精品免费一区豆花| 国产一区久久久| 亚洲国产一区二区三区高清| 亚洲视频视频在线| 亚洲福利视频在线| 亚洲视频香蕉人妖| 久久久久成人精品| 欧美日韩精品三区| 国产婷婷色一区二区三区| 亚洲国产精品一区二区尤物区| 亚洲社区在线观看| 亚洲国产精品一区二区第四页av | 午夜精品福利电影| 美国成人毛片| 国产精品扒开腿爽爽爽视频| 国产一区二区三区四区| 亚洲精品午夜| 久久国产婷婷国产香蕉| 亚洲一区二区三区激情| 免费高清在线一区| 国产精品视频网址| 亚洲精品一区二| 久久成人一区| 亚洲一区二区三区三| 老司机精品导航| 国产精品www| 亚洲国产欧美一区二区三区同亚洲 | 国内外成人免费激情在线视频网站| 韩曰欧美视频免费观看| 一区二区成人精品| 亚洲欧洲精品一区二区三区不卡 | 韩国久久久久| 亚洲欧美国内爽妇网| 亚洲乱码视频| 久久久久久一区| 国产精品一区二区久久精品| 亚洲精品在线免费| 亚洲国产日韩欧美综合久久 | 欧美日韩精品一区视频| 国产一区清纯| 亚洲永久免费| 在线亚洲一区观看| 你懂的网址国产 欧美| 国产一本一道久久香蕉| 亚洲一区精品在线| 亚洲香蕉网站| 欧美日本在线播放| 亚洲国产精品黑人久久久| 久久精品国产清高在天天线| 欧美影院视频| 国产九九视频一区二区三区| 9色精品在线| 中文国产一区| 欧美日本精品在线| 91久久久久久久久久久久久| 亚洲国产精品国自产拍av秋霞| 久久久精品国产一区二区三区| 国产精品乱人伦中文| 亚洲最快最全在线视频| 一区二区三区你懂的| 欧美日韩国产精品一区| 最新69国产成人精品视频免费| 亚洲激情在线观看| 久久这里有精品15一区二区三区| 国产亚洲精品高潮| 欧美一级视频| 久久精品国产精品亚洲综合| 国产精品婷婷午夜在线观看| 国产精品99久久99久久久二8 | 欧美精品国产一区| 91久久久亚洲精品| 亚洲精品男同| 欧美精品在线极品| 日韩视频免费在线观看| 在线一区二区三区做爰视频网站| 欧美日韩高清不卡| 亚洲最新在线视频| 亚洲欧美综合v| 国产裸体写真av一区二区| 性欧美激情精品| 久久露脸国产精品| 一区视频在线播放| 亚洲精品一区二区三区不| 欧美激情精品久久久六区热门 | 狠狠爱www人成狠狠爱综合网| 久久爱www| 欧美成人国产一区二区| 亚洲人成毛片在线播放| 一区二区免费在线播放| 国产精品二区影院| 小辣椒精品导航| 久久久天天操| 亚洲国产一区二区三区青草影视 | 影音欧美亚洲| 夜夜嗨网站十八久久| 国产精品高清在线| 午夜久久久久久| 蜜臀av一级做a爰片久久| 亚洲精品一区在线观看| 亚洲女同同性videoxma| 国产亚洲欧美另类中文| 亚洲欧洲偷拍精品| 欧美视频在线观看| 先锋影音久久久| 欧美不卡视频一区发布| 亚洲精品综合久久中文字幕| 亚洲欧美国内爽妇网| 国产一区二区三区久久精品| 亚洲人成艺术| 国产精品成人一区| 久久国产主播| 欧美日韩在线观看一区二区三区| 亚洲欧美日韩国产综合| 老司机精品导航| 这里只有精品视频在线| 久久亚洲国产成人| 亚洲精品一区在线观看| 久久se精品一区二区| 亚洲第一搞黄网站| 午夜精品婷婷| 亚洲国产精品99久久久久久久久| 亚洲小视频在线观看| 韩日精品视频| 亚洲一区二区在| 在线高清一区| 午夜精品久久久久影视| 尤物精品国产第一福利三区 | 亚洲第一视频网站| 亚洲欧美在线高清| 1024亚洲| 欧美夜福利tv在线| 最新国产精品拍自在线播放| 欧美在线一区二区三区| 亚洲精品一线二线三线无人区| 久久精品国产亚洲5555| 9色精品在线| 免费不卡视频| 亚洲一区二区三区四区五区午夜 | 国产综合色在线| 亚洲小说欧美另类社区| 伊人成人在线视频| 午夜欧美理论片| 91久久精品日日躁夜夜躁国产| 欧美与欧洲交xxxx免费观看| 亚洲麻豆一区| 久久天堂成人| 亚洲女同同性videoxma| 欧美日韩国产片| 亚洲三级影院| 狠狠色狠狠色综合日日tαg| 亚洲欧美一区二区三区在线|