80C196單片機(jī)鼠標(biāo)接口程序設(shè)計(jì)實(shí)例
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)通過MAX232E形成滿足鼠標(biāo)要求的串行接口,包括生成標(biāo)準(zhǔn)RS-232C電平和提供電源供應(yīng)。圖1中最右邊為9針或24針標(biāo)準(zhǔn)串行接插件。由于鼠標(biāo)的電源供應(yīng)采用功率竊取方案,由DTR/RTS提供,這里為DTR加限流電阻防止對(duì)鼠標(biāo)造成傷害。RTS由MAX232E垢信號(hào)發(fā)送端提供,通過80C196的P2.0控制MAX232E的10腳(對(duì)應(yīng)的輸出腳為7腳)電平高低以改變7腳電位,使鼠標(biāo)可以接收來自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串行接口的四種工作方式均不滿足鼠標(biāo)的幀格式要求;但其工作方式1(1位起始位、8位數(shù)據(jù)位、1位停止位)的總傳送位數(shù)與鼠標(biāo)(1位起始位、7個(gè)數(shù)據(jù)位、2個(gè)停止位)相同,均為10位。接收過程中80C196收到7個(gè)數(shù)據(jù)位后,將2個(gè)停止位中的第一個(gè)作為數(shù)據(jù)位裝入接收緩沖器的最高位,由于停止位在物理層是高電平,作為數(shù)據(jù)被接收后相當(dāng)于邏輯“0”;剩下的第二個(gè)停止位給好為80C196提供了有效的停止位。利用80C196的工作方式1完全可以保證正確接收鼠標(biāo)信息。 單片機(jī)起動(dòng)后,通過鼠標(biāo)驅(qū)動(dòng)模塊對(duì)鼠標(biāo)進(jìn)行初始化,即通過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í)間,還可能因來不及處理而丟失信息。有效的處理方法是采用中斷方式接收,應(yīng)用模塊通過軟件接口獲得鼠標(biāo)信息。完整的鼠標(biāo)接口程序流程圖如圖2所示。在初始化階段,首先檢查鼠標(biāo)是否存在,根據(jù)結(jié)果設(shè)置標(biāo)志位,以備以后取鼠標(biāo)信息時(shí)判斷用;根據(jù)需要設(shè)定鼠標(biāo)初始化位置、按鈕原始狀態(tài);最后設(shè)置串行接口參數(shù)(幀格式等)并開放鼠標(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)一步通過有效性檢驗(yàn)后保存;若不是首字節(jié),則必須經(jīng)過一系列檢驗(yàn)后保存起來。收到三個(gè)字節(jié)后立即進(jìn)行命令分析和執(zhí)行。具體處理過程可參看源程序。用戶模塊通過特定接口模塊(圖2(b))獲得鼠標(biāo)當(dāng)前位置和按鈕狀,并可通過進(jìn)位標(biāo)志C=0/1判斷鼠標(biāo)是否安裝。 下面是圖2、3程序流程圖如圖對(duì)應(yīng)的程序清單。該程序要求80C196單片機(jī)的工作頻率為12MHz;如果采有其它工作頻率,通過修改串行口的波特率設(shè)置參數(shù)以及延時(shí)程序的時(shí)間常數(shù)即可。 ; ;8098特殊功能寄存器預(yù)定義 R0 EQU 00H:Word SBUD 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 ICH 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 ;開串行中斷 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.2=0 LD AX,#8000H ;延遲200ms DLY0:DEC AX JNE DLY0 LDB AL,LRB_OK LBS 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方向位數(shù) 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














評(píng)論