单片机
返回首页

用单片机(AVR)比较准确地读出PS2鼠标位移(X,Y轴位移)

2016-10-19 来源:eefocus

         之前为了用鼠标对小车的移动坐标进行测量,所以找了很多资料用做```但后来发现网上的资料或者程序基本上都是让鼠标工作在默认模式(Stream模式)而去读鼠标的X,Y轴的位移.后来我经过试验,发现这样很难实现,因为鼠标轻轻一动(状态有任何变化)就立即发送数据,所以,这样的话,单片机的速度是跟不上的,移动速度过快的话误差会非常的大.接着仔细看了关于PS2鼠标的资料就决定让鼠标工作在Remote模式,果然测量的误差大大的减少了(呵呵呵)!!!!!]

工作模式如下

鼠标的工作模式:

1、Reset模式:鼠标上电或受到复位命令(0xFF)时进入次模式。(一般电脑才用吧)
设置缺省的Sample rate:100samples/s;Resolution: 4 counts/mm;Scaling: 1:1; Data report disabled。
复位完成后向Host发送0xAA/0xFC(successful/Error)。Host如果没有收到0xAA,就重新给鼠标上电。
发送完0xAA后,鼠标继续向Host发送自己的ID号:0x00。之后进入Stream模式,此时,禁止向Host发送任何数据包,直到收到0xF4(Data report enable)。 

2、Stream模式:缺省模式。一旦发现鼠标状态有任何变化,就向Host发送数据包。

3、Remote模式:鼠标不主动向Host发送数据包,只有在收到命令0xEB后才发送数据包并复位计数器。(觉得适合单片机)

4、Wrap模式:鼠标将除了Reset(0xFF)和Reset Wrap Mode(0xEC)以外的所有从Host收到的命令发送回去。

让鼠标工作在Remote模式,你可以每过一段时间才去读取那位移值,这样就不怕单片机的速度跟不上了,而且这段时间还可以让单片机去做其他的事情~~~~

如:

   PS2_send(0xeb);
   f=PS2_get();
   f=PS2_get();
   a1=PS2_get();   //a1收到的是X轴的位移     
   a2=PS2_get();   //a2收到的是Y轴的位移

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章