學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序+LCD1602顯示坐標(biāo)_第1頁(yè)
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序+LCD1602顯示坐標(biāo)_第2頁(yè)
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序+LCD1602顯示坐標(biāo)_第3頁(yè)
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序+LCD1602顯示坐標(biāo)_第4頁(yè)
學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序+LCD1602顯示坐標(biāo)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

學(xué)習(xí)51單片機(jī)與PS2鼠標(biāo)程序簡(jiǎn)介:PS2鼠標(biāo),LCD1602顯示坐標(biāo),有LED指示燈,等等 其實(shí)發(fā)現(xiàn)學(xué)起來(lái)也很簡(jiǎn)單。第一步:PS/2接口和協(xié)議簡(jiǎn)介1PS/2接口和協(xié)議1.1接口的物理特性PS/2接口用于許多現(xiàn)代的鼠標(biāo)和鍵盤(pán),由IBM最初開(kāi)發(fā)和使用。物理上的PS/2接口有兩種類(lèi)型的連接器:5腳的DIN和6腳的mini-DIN。圖1就是兩種連接器的引腳定義。使用中,主機(jī)提供+5V電源給鼠標(biāo),鼠標(biāo)的地連接到主機(jī)電源地上。播敢亂}―■ 插頭(to5科的DIN 6WMmuu-DEN5卿的DIN◎y1時(shí)鐘(CLOCK)L_?__3數(shù)據(jù)(DATA}未囊現(xiàn).親女現(xiàn)、孫瞬電源地(僦冊(cè)6腳的4電源地(GNS5電W+5V{VCCr時(shí)鐘(CLOCK)未實(shí)現(xiàn)、SB圖1PS/2接口連接器引腳定文1.2接口協(xié)議原理PS/2鼠標(biāo)接口采用一種雙向同步串行協(xié)議。即每在時(shí)鐘線上發(fā)一個(gè)脈沖,就在數(shù)據(jù)線上發(fā)送一位數(shù)據(jù)。在相互傳輸中,主機(jī)擁有總線控制權(quán),即它可以在任何時(shí)候抑制鼠標(biāo)的發(fā)送。方法是把時(shí)鐘線一直拉低,鼠標(biāo)就不能產(chǎn)生時(shí)鐘信號(hào)和發(fā)送數(shù)據(jù)。在兩個(gè)方向的傳輸中,時(shí)鐘信號(hào)都是由鼠標(biāo)產(chǎn)生,即主機(jī)不產(chǎn)生通信時(shí)鐘信號(hào)。如果主機(jī)要發(fā)送數(shù)據(jù),它必須控制鼠標(biāo)產(chǎn)生時(shí)鐘信號(hào)。方法如下:主機(jī)首先下拉時(shí)鐘線至少100“S抑制通信,然后再下拉數(shù)據(jù)線,最后釋放時(shí)鐘線。通過(guò)這一時(shí)序控制鼠標(biāo)產(chǎn)生時(shí)鐘信號(hào)。當(dāng)鼠標(biāo)檢測(cè)到這個(gè)時(shí)序狀態(tài),會(huì)在10ms內(nèi)產(chǎn)生時(shí)鐘信號(hào)。如圖3中A時(shí)序段。主機(jī)和鼠標(biāo)之間,傳輸數(shù)據(jù)幀的時(shí)序如圖2、圖3所示。2.2數(shù)據(jù)包結(jié)構(gòu)在主機(jī)程序中,利用每個(gè)數(shù)據(jù)位的時(shí)鐘脈沖觸發(fā)中斷,在中斷例程中實(shí)現(xiàn)數(shù)據(jù)位的判斷和接收。在實(shí)驗(yàn)過(guò)程中,通過(guò)合適的編程,能夠正確控制并接收鼠標(biāo)數(shù)據(jù)。但該方案有一點(diǎn)不足,由于每個(gè)CLOCK都要產(chǎn)生一次中斷,中斷頻繁,需要耗用大量的主機(jī)資源。停止位校驗(yàn)位數(shù)據(jù)值量的主機(jī)資源。停止位校驗(yàn)位數(shù)據(jù)值?數(shù)據(jù)&§數(shù)據(jù)位4?搗位3數(shù)據(jù)拉2數(shù)據(jù)位1數(shù)據(jù)ffio廻始檢Lnj-LFUrU-UTLnJ-LTLj-LJ/應(yīng)答&/應(yīng)答&、停止位校驗(yàn)位故據(jù)位予?據(jù)位4數(shù)據(jù)位3數(shù)據(jù)位2數(shù)據(jù)拉1敷據(jù)他O起始位3主機(jī)到鼠標(biāo)的傳輸時(shí)序2PS/2鼠標(biāo)的工作模式和協(xié)議數(shù)據(jù)包格式2.1PS/2鼠標(biāo)的四種工作模式PS/2鼠標(biāo)的四種工作模式是:Reset模式,當(dāng)鼠標(biāo)上電或主機(jī)發(fā)復(fù)位命令0xFF給它時(shí)進(jìn)入這種模式;Stream模式鼠標(biāo)的默認(rèn)模式,當(dāng)鼠標(biāo)上電或復(fù)位完成后,自動(dòng)進(jìn)入此模式,鼠標(biāo)基本上以此模式工作;Remote模式,只有在主機(jī)發(fā)送了模式設(shè)置命令OxFO后,鼠標(biāo)才進(jìn)入這種模式;Wrap模式,這種模式只用于測(cè)試鼠標(biāo)與主機(jī)連接是否正確。PS/2鼠標(biāo)在工作過(guò)程中,會(huì)及時(shí)把它的狀態(tài)數(shù)據(jù)發(fā)送給主機(jī)。發(fā)送的數(shù)據(jù)包格式如表1所示。表】亂標(biāo)發(fā)送的數(shù)據(jù)包榕式Bit6Bit5Bit4Bil2BitlBitOBytclYoverflowXoverflow¥ bitXsignbitLMiddle:B-tnRightBtnLeftStnXMovemenl¥MovemenlZMnvrmfinlBytel中的Bit0、Bit1、Bit2分別表示左、右、中鍵的狀態(tài),狀態(tài)值0表示釋放,1表示按下。Byte2和Byte3分別表示X軸和Y軸方向的移動(dòng)計(jì)量值,是二進(jìn)制補(bǔ)碼值。Byte4的低四位表示滾輪的移動(dòng)計(jì)量值,也是二進(jìn)制補(bǔ)碼值,高四位作為擴(kuò)展符號(hào)位。這種數(shù)據(jù)包由帶滾輪的三鍵三維鼠標(biāo)產(chǎn)生。若是不帶滾輪的三鍵鼠標(biāo),產(chǎn)生的數(shù)據(jù)包沒(méi)有Byte4其余的相同。第二步:/**********************XXXX.C部分*********************/#include<reg52.h>#include"mouse.h"#include"LCD1602_4.h"#include"DELAY52.h"sbitbeep=P3人7;voidmain(){LCD1602_Init();〃初始化液晶1602Init_mouse();mouse_send_data(0xf4);〃向鼠標(biāo)發(fā)送0xF4命令發(fā)其開(kāi)始工作//mouse_send_data(0xc8);//mouse_send_data(0x64);//mouse_send_data(0x50);EX1=0;〃關(guān)掉外部中斷以避開(kāi)鼠標(biāo)發(fā)回的應(yīng)答delayms(100);EX1=1;〃重開(kāi)外部中斷while(1){led=1;CLEARSCREEN;//清屏LCD1602_write_string(0,0,"x:");num(0,2,move_x);//x坐標(biāo)值LCD1602_write_string(0,8,"y:");num(0,10,move_y);//y坐標(biāo)值// LCD1602_write_string(1,8,"z:");// num(1,10,move_z);//y坐標(biāo)值if(mouse_data[0]&0x01)〃如果點(diǎn)下左鍵{beep=0;LCD1602_write_string(1,0,"left");}elseif(mouse_data[0]&0x02)〃如果點(diǎn)下右鍵{beep=0;LCD1602_write_string(1,0,"right");}elseif(mouse_data[0]&0x04)〃如果點(diǎn)下中鍵{beep=0;LCD1602_write_string(1,0,"middle");}else{beep=1;LCD1602_write_string(1,0,"nothing");}delayms(50);}}#ifndefMOUSE_H#defineMOUSE_H#include"DELAY52.h"http://Setsamplerate200;//Setsamplerate200;//Setsamplerate80;sbitmouse_SDA=P3人4;//數(shù)據(jù)線P3_5sbitmouse_CLK=P3人3;//時(shí)鐘線P3_3sbitled=P3A6;//sbitled1=P1A3;ucharbdatamouse_byte;//接收字節(jié)bdata-->可尋址的片內(nèi)RAMsbitmouse_byte_bitO=mouse_byteAO;//mouse_byte第0位sbitmouse_byte_bitl=mouse_byteAl;//mouse_byte第1位sbitmouse_byte_bit2=mouse_byteA2;//mouse_byte第2位sbitmouse_byte_bit3=mouse_byteA3;//mouse_byte第3位sbitmouse_byte_bit4=mouse_byteA4;//mouse_byte第4位sbitmouse_byte_bit5=mouse_byteA5;//mouse_byte第5位sbitmouse_byte_bit6=mouse_byteA6;//mouse_byte第6位sbitmouse_byte_bit7=mouse_byteA7;//mouse_byte第7位ucharbdatamouse_fuction;//功能信息字節(jié)ucharmouse_buffer[11];//接收位數(shù)據(jù)緩沖區(qū)ucharmouse_buffer_bit=0;//mouse_buffer[mouse_buffer_bit]ucharmouse_data[3];〃接收鼠標(biāo)數(shù)據(jù)緩沖區(qū),分別存放:功能信息字節(jié),x位移量,y位移量

ucharmouse_data_bit=0;//mouse_data[mouse_data_bit]uintmove_x=10000;〃存放橫坐標(biāo)uintmove_y=10000;〃存放縱坐標(biāo)voidInit_mouse(void){TCON=0x00;// //中斷觸發(fā)方式0EA=1; //開(kāi)放中斷EX1=1;〃允許外部中斷1ETO=OxO1;〃允許全局中斷,允許設(shè)定時(shí)器/計(jì)數(shù)器0溢出中斷開(kāi)定時(shí)器中斷0PX1=1;〃設(shè)置中斷優(yōu)先級(jí) 設(shè)外部中斷1為最高優(yōu)先級(jí)別}發(fā)送數(shù)據(jù)voidmouse_send_data(uchardat){uchari;EX1=0;ACC=dat;{uchari;EX1=0;ACC=dat;mouse_CLK=0;delay10us(200);mouse_SDA=0;delay10us(40);mouse_CLK=1;for(i=0;i<=7;i++)/*將要發(fā)送的數(shù)據(jù)放入A寄存器*//*拉低時(shí)鐘線*//*延時(shí)100us以上*//*拉低數(shù)據(jù)線*//*釋放時(shí)鐘線*//*低位在前,一次發(fā)送8個(gè)數(shù)據(jù)位*/{while(mouse_CLK==1);mouse_SDA=(dat>>i)&0x01;while(mouse_CLK==0);}while(mouse_CLK==1);mouse_SDA=~P;while(mouse_CLK==0);while(mouse_CLK==1);mouse_SDA=1;while(mouse_CLK==0);while(mouse_CLK==1);while(mouse_CLK==0);EX1=1;/*等待設(shè)備拉低時(shí)鐘線*//*發(fā)送數(shù)據(jù)位*//*等待設(shè)備釋放時(shí)鐘線*//*發(fā)送校驗(yàn)位,奇校驗(yàn)*//*發(fā)送停止位*//*應(yīng)答位*//*打開(kāi)外部中斷1*/奇校檢ucharCheckout(void){ACC=mouse_byte;if(~P==mouse_buffer[9])return1;elsereturn0;}數(shù)據(jù)分析及處理voiddata_analyse(void){//將收到的11位信號(hào)中截取8位數(shù)據(jù)放進(jìn)mouse_bytemouse_byte_bit0=mouse_buffer[1];mouse_byte_bit1=mouse_buffer[2];mouse_byte_bit2=mouse_buffer[3];mouse_byte_bit3=mouse_buffer[4];mouse_byte_bit4=mouse_buffer[5];mouse_byte_bit5=mouse_buffer[6];mouse_byte_bit6=mouse_buffer[7];mouse_byte_bit7=mouse_buffer[8];if(Checkout())〃女口果校驗(yàn)正確{if(mouse_data_bit<3)mouse_data[mouse_data_bit++]=mouse_byte;if(mouse_data_bit==3){mouse_data_bit=0;if(mouse_data[0]&0xlO)〃如果"Xsignbit"為1,表示鼠標(biāo)向左移{move_x-=(256-mouse_data[1]);//x坐標(biāo)減}else{move_x+=mouse_data[1];//x坐標(biāo)力口}if(mouse_data[0]&0x20){move_y-=(256-mouse_data[2]);//y坐標(biāo)減}else{move_y+=mouse_data[2];//y坐標(biāo)加}}}}外部中斷1voidReceiveData(void)interrupt2{led=0;if(mouse_buffer_bit<=10){while(mouse_CLK==0);〃等待設(shè)備拉高時(shí)鐘線mouse_buffer[mouse_buffer_bit++]=mouse_SDA;//接收數(shù)據(jù)}if(mouse_buffer_bit==10){data_analyse();〃數(shù)據(jù)分析及處理mouse_buffer_bit=0;}}#endif#ifndefLCD1602_4_H#defineLCD1602_4_H#include<intrins.h>#include"DELAY52.h"#defineLCD1602_DATAP0#defineCLEARSCREENLCD1602_write_cmd(0x01)sbitLCD1602_RS=P2人5;sbitLCD1602_RW=P2A6;sbitLCD1602_EN=P2A7;voidLCD1602_Init(void); //液晶

初始化voidLCD1602_write_cmd(ucharcommand); //寫(xiě)命令voidLCD1602_write_data(uchartemp); //寫(xiě)數(shù)據(jù)voidLCD1602_set_xy(ucharx,uchary); //設(shè)置坐標(biāo)voidLCD1602_write_char(ucharx,uchary,uchardat); //寫(xiě)一個(gè)字符到第x行y列voidLCD1602_write_string(ucharx,uchary,uchar*s);/Z寫(xiě)字符串到第x行y歹UvoidLCD1602_Read_BF(void); //讀忙信號(hào)voidnum(ucharx,uchary,uintn); //在第x行,第y歹顯示整型數(shù)字nvoidLCD1602_Init(void){LCD1602_write_cmd(0x28);LCD1602_write_cmd(0x28);LCD1602_write_cmd(0x28);〃設(shè)置4位數(shù)據(jù)傳輸模式LCD1602_write_cmd(0x0C);LCD1602_write_cmd(0x80);CLEARSCREEN;}voidLCD1602_Read_BF(void){//RW1//RW1//RS0//EN1ReadBFLCD1602_RS=0;LCD1602_EN=1;LCD1602_DATA=LCD1602_DATA&0x0F|0xf0;while(LCD1602_DATA&0x80);LCD1602_EN=0;}voidLCD_en_write(void) //EN端產(chǎn)生一個(gè)高電平脈沖,寫(xiě)LCDLCD1602_EN=1;_nop_();LCD1602_EN=0;voidLCD1602_write_cmd(ucharcommand){LCD1602_Read_BF();LCD1602_RS=0; //RS0LCD1602_RW=0; //RW0LCD1602_DATA&=0x0F;LCD1602_DATA=command&0xf0|LCD1602_DATA&0x0f;LCD_en_write();command=command<<4;LCD1602_DATA&=0x0F;LCD1602_DATA=command&0xf0|LCD1602_DATA&0x0f;LCD_en_write();}voidLCD1602_write_data(uchardat){LCD1602_Read_BF();LCD1602_RS=1;//RS1LCD1602_RW=0;//RW0LCD1602_DATA&=0x0F;LCD1602_DATA=dat&0xf0|LCD1602_DATA&0x0f;LCD_en_write();dat=dat<<4;LCD1602_DATA&=0x0F;LCD1602_DATA=dat&0xf0|LCD1602_DATA&0x0f;LCD_en_write();}voidLCD1602_set_xy(ucharx,uchary){ucharaddress;y&=0x0f;if(!x)address=0x80+y;elseaddress=0xc0+y;LCD1602_write_cmd(address);}voidLCD1602_writ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論