<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 用單片機pic16f877a實(shí)現鼠標數據的采集

用單片機pic16f877a實(shí)現鼠標數據的采集

作者: 時(shí)間:2016-10-07 來(lái)源:網(wǎng)絡(luò ) 收藏

  最近弄個(gè)用單片機實(shí)現鼠標數據的采集。通過(guò)對鼠標底層通信原理與協(xié)議的分析,以單片機構成鼠標數據的采集的實(shí)現和液晶顯示的實(shí)現。

本文引用地址:http://dyxdggzs.com/article/201610/310912.htm

  現在繼續寫(xiě)下去 !!!!!!盡管和比賽沒(méi)有關(guān)系了

  一、先要熟悉鼠標的協(xié)議和接口

  下面是PS2的接口

 ?。?/p>

 

  這是鼠標在傳輸過(guò)程中數據的一個(gè) 幀:

  

 

  一個(gè)開(kāi)始位:(為0)

  八個(gè)數據位:

  一個(gè)奇校驗位:

  一個(gè)停止位:(它總是1)

  鼠標和單片機通信:

  1、單片機給鼠標發(fā)命令是按下面的格式進(jìn)行的:

  

 

  (注意:一個(gè)應答信號的接收)

  這是它的詳細過(guò)程:

  

 

  2、鼠標向單片機傳送數據是下面的格式:

  

 

  二、下面就是設計鼠標和單片機的通信電路:(可以參考下面這個(gè)接法)

  

 

  (注意:數據和時(shí)鐘都這是集電極開(kāi)路的結構,平時(shí)是高電平 )

  三、外圍布置好了就是具體程序的實(shí)現

  我們可以采用單片機16F877A的外部中斷來(lái)響應鼠標的時(shí)鐘,在中斷中接收數據。

  我 們可按下面的步驟實(shí)現:

  1)把時(shí)鐘線(xiàn)拉低至少100微秒

  2)把數據線(xiàn)拉低

  3)釋放數據線(xiàn)

  4)等待設備把時(shí)鐘線(xiàn)拉低

  5)設置/復位數據線(xiàn)發(fā)送第一個(gè)數據位

  6)等待設備把時(shí)鐘拉高

  7)等待設備把時(shí)鐘拉低

  8)重復5-7步發(fā)送剩下的7個(gè)數據位和校驗位

  9)釋放數據線(xiàn)

  10)等待設備把數據線(xiàn)拉低

  11)等待設備把時(shí)鐘線(xiàn)拉低

  12)等待設備釋放數據線(xiàn)和時(shí)鐘線(xiàn)

  程序如下:

  //外部中斷INT0初始化

  void INTE_init(void)

  {

  INTCON=0X00;

  GIE=1; //總中斷

  RBPU=0;

  //INTE=1;//外部中斷

  //INTEDG=0;//下升沿觸發(fā)有效

  INTEDG=1;//上升沿觸發(fā)有效

  TRISB=0x00;//正常工作下時(shí)鐘RB0和數據RB2均輸入

  INTF=0;//這三句是開(kāi)外部中斷

  PORTB=0X00;

  }

  //發(fā)送數據

  //發(fā)送11位數據:1START-8DATA-1PARITY-1STOP

  //并接收一個(gè)應答位ack = 0

  void mouse_write_dat(unsigned char dat)

  {

  unsigned char i; //循環(huán)變量

  INTE = 0; //關(guān)閉外部中斷

  asm( "nop");

  mouse_clk = 0; //拉低時(shí)鐘線(xiàn)

  delay(33); //至少延時(shí)100us

  mouse_sda = 0; //發(fā)送起始位

  mouse_clk = 1; //釋放時(shí)鐘線(xiàn)

  mouse_sda = 1; //釋放數據線(xiàn)

  TRISB0=1;//時(shí)鐘輸入

  asm( "nop");

  TRISB=0X01;

  for(i = 0; i < 8; i++)

  { //至少要在25us內完成發(fā)送一位

  while(!mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉高

  mouse_sda =(bit)(dat& 0x01);//先發(fā)送最低位

  dat >>= 1; //下降沿寫(xiě)入數據

  while(mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉低

  }

  while(!mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉高

  mouse_sda = 0; //發(fā)送奇校驗位

  while(mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉低

  while(!mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉高

  mouse_sda = 1; //發(fā)送停止位

  while(mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉低

  TRISB2=1;//數據輸入

  asm( "nop");

  asm( "nop");

  while(!mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉高

  while(mouse_sda); //等待接收應答位(總是為0)

  while(mouse_clk); //等待設備把時(shí)鐘線(xiàn)拉低

  while(!mouse_clk); //等待設備釋放時(shí)鐘線(xiàn)

  while(!mouse_sda); //等待設備釋放數據線(xiàn)

  INTE = 1; //打開(kāi)外部中斷INTE

  }

  再就是鼠標的發(fā)數據模塊可以參考下面的步驟:

  1)等待時(shí)鐘線(xiàn)為高

  2)數據線(xiàn)仍然為低嗎 有錯誤發(fā)生放棄

  3)讀入8個(gè)數據位在讀入這些位后

  4)讀入校驗位>測試時(shí)鐘線(xiàn)數否被主機拉低

  5)讀入停止位/這就意味著(zhù)放棄這次傳送

  6)數據線(xiàn)仍舊為0嗎

  是保持時(shí)鐘直到數據1然后產(chǎn)生一個(gè)錯誤

  7)輸出應答位

  8)檢查校驗位

  如果校驗位不正確則產(chǎn)生一個(gè)錯誤

  9)延遲45微秒給主機時(shí)間抑制下次的傳送

  按如下次序讀取每位8個(gè)數據位檢驗位和停止位

  1)延遲20微秒

  2)把時(shí)鐘拉低

  3)延遲40微秒

  4)釋放時(shí)鐘

  5)延遲20微秒

  7)讀數據線(xiàn)

  按如下次序發(fā)送應答位

  1)延遲15微秒

  2)把數據線(xiàn)拉低

  3)延遲5微秒

  4)把時(shí)鐘線(xiàn)拉低

  5)延遲40微秒

  6)釋放時(shí)鐘線(xiàn)

  7)延遲5微秒

  8)釋放數據線(xiàn)

  void interrupt INTE_ISR(void)

  {

  mouse_word >>= 1; //先向右空移一位

  if(mouse_sda) {mouse_word |= 0x0400; } //11位數據先接收最低位0000 010 (0 0000 000) 0 1START-8DATA-1PARITY-1STOP

  n++; if(n == 11) {mouse_read_dat(); n = 0;} //接收完成則讀出數據

  INTF=0;

  }

  接下來(lái)就是讀鼠標的數據了,首先要明白這個(gè)數據包中具體是些什么,看下面的圖:

 

  (一般的鼠標就這些,具體的就要查鼠標的資料了)同志們 還不清楚就看下面的解釋吧!!!

  鼠標內部有一個(gè)位移計數器,位移計數器是一個(gè)9位2的補碼整數。它的最高位作為

  符號位出現在位移數據包的第一個(gè)字節里。這些計數器在鼠標讀取輸入發(fā)現有位移

  時(shí)被更新。這些值是自從最后一次發(fā)送位移數據包給主機后位移的累計量(即最后

  一次包發(fā)給主機后位移計數器被復位)。位移計數器可表示的值的范圍是-255到+255,

  如果超過(guò)了范圍,相應的溢出位就被設置,并且在復位前,計數器不會(huì )增減。正如我前

  面提及的一旦位移數據包成功地發(fā)送給主機,位移計數器就會(huì )復位,同樣鼠標在收到主機

  不是Resend 0xFE命令外的其他命令,計數器也會(huì )復位。



關(guān)鍵詞: pic16f877a 1602

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>