学习51单片机与PS2鼠标程序.docx
- 文档编号:2387852
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:33
- 大小:388.81KB
学习51单片机与PS2鼠标程序.docx
《学习51单片机与PS2鼠标程序.docx》由会员分享,可在线阅读,更多相关《学习51单片机与PS2鼠标程序.docx(33页珍藏版)》请在冰豆网上搜索。
学习51单片机与PS2鼠标程序
学习51单片机与PS2鼠标程序滚轮识别,显示3D坐标
简介:
PS2鼠标,具有滚轮识另U,LCD1602显示3D坐标,有LED指示灯,等等
其实发现学起来也很简单。
由丁在网上找不到51单片机可以识别鼠标带滚轮的完整可用程序,也就是3D,X,Y,Z;轴功能的程序,笔者花了很长时间尝试,终丁整出来了,特拿出来与所有单片机菜鸟分享。
第一步:
PS/2接口和协议简介
1PS/2接口和协议
1.1接口的物理特性
PS/2接口用于许多现代的鼠标和键盘,由旧M最初开发和使用?
物理上的PS/2接口有两种类型的
连接器:
5脚的DIN和6脚的mini-DIN?
图1就是两种连接器的引脚定义?
使用中,主机提供+5V电源给鼠标
鼠标的地连接到主机电源地上?
掩崖(孔)
推头(ft)
J.■
5脚的DIN
6MI的岫ADIN
5脚的DIN
Q
1
时W(CLOCK)
数据(DATA)
2
(DATA)
未实现,保留
3
未实现.保宙
电*地伽)
6脚的mini-DIN
4
电源地(GND)
用源+5V1VCC)
「5一
电W+5V(VCC>
Bitt(CLOCK)
6
未实现,保窗
图IPS/2接口逐接器弓1脚定义
1.2接口协议原理
,就在数据线上发送一位数
PS/2鼠标接口采用一种双向同步串行协议?
即每在时钟线上发一个脉冲
据?
在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标的发送?
方法是把时钟线一直拉低,鼠
标就不能产生时钟信号和发送数据?
在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产生通信时
钟信号?
如果主机要发送数据,它必须控制鼠标产生时钟信号?
方法如下:
主机首先下拉时钟线至少100卬s抑
制通信,然后再下拉数据线,最后释放时钟线?
通过这一时序控制鼠标产生时钟信号?
当鼠标检测到这个时序
状态,会在10ms内产生时钟信号?
如图3中A时序段?
主机和鼠标之间,传输数据帧的时序如图2?
图3所
示?
2.2数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位的判断和
接收?
在实验过程中,通过合适的编程,能够正确控制并接收鼠标数据?
但该方案有一点不足,由于每个
CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源?
5^r"LrLrLrT_rLnj~L_rLrururLJ
图2鼠标到主机的传输时序
*时曾LTLrL_rUrLTLJrLnJTJ~LrLJ
T厦答位\_停止位校验位数据位7«据fir*数据位5&据位4*掘位3数据位2敷据位1»据{fto起始位
«
图3宪机到(鼠标的传辘时序
2PS/2鼠标的工作模式和协议数据包格式
2.1PS/2鼠标的四种工作模式
PS/2鼠标的四种工作模式是:
Reset模式,当鼠标上电或主机发复位命令0xFF给它时进入这种模
式;Stream模式鼠标的默认模式,当鼠标上电或复位完成后,自动进入此模式,鼠标基本上以此模式工
佗Remote模式,只有在主机发送了模式设置命令0xF0后,鼠标才进入这种模式;Wrap模式,这种模式只用
于测试鼠标与主机连接是否正确?
PS/2鼠标在工作过程中,会及时把它的状态数据发送给主机?
发送的数据包格式如表1所示?
表1威标发送的数据包格式
Bil7
Bit6
Bit4
BitJ
Bil2
Bitl
BiiD
Bytcl
Yoverflow
Xovcrflcm
Ysipibit
tstfFihit
Always1
MiddleBtn
RijitBin
UftBin
XMowemenl
"31
YMowmenl
Iiytr4
ZMrjvrnMnl
Bytel中的Bit0?
Bit1?
Bit2分别表示左?
右?
中键的状态,状态值。
表示释放,1表示按下?
Byte2和Byte3
分别表示X轴和丫轴方向的移动计量值,是二进制补码值?
Byte4的低四位表示滚轮的移动计量值,也是二进制补码值,高四位作为扩展符号位?
这种数据包由带滚轮的三键三维鼠标产生?
若是不带滚轮的三键鼠标,产
生的数据包没有Byte4其余的相同?
第二步:
11.3PS/2鼠标原理
目前最常见的鼠标有PS/2鼠标和USB鼠标。
本章介绍PS/2鼠标。
PS/2鼠标有4种工作模式,具体如下:
(1)复位模式。
当上电后或接收到复位命令FF后鼠标即处于此模式。
鼠标进行自检和初始化,
再向主机发送0xFA,0xAA和0x00,一些参数将恢复到默认值,即采样率为100sample/s非自动流速、流模式、分辨率为4计数/mm、禁止状态。
(2)流模式。
如果有按键或滚轮动作,即向系统发送信息,最大发送速率就是可编程的采样率。
(3)遥控模式。
只有主机发送了模式设置指令0xF0后,鼠标才进入这种模式。
(4)这种模式只用于检测鼠标与主机是否连接正确,在该模式下鼠标收到什么就返回什么,除
非收到退出卷绕指令0xEC或复位指令0xFF。
流模式是默认模式。
大多数应用系统使用流模式,鼠标的任何动作都会报告给主机。
也可以使用
遥控模式,主机使用0xEB命令请求数据,鼠标进行应答。
标准的PS/2协议数据格式为3字节,如表11-4所示。
鼠标的按键和滚动信息都采用这种格式汇报给主机。
表11-4标准的PS/2协议数据格式
Y
X
Y
X
1
Middl
Right
Left
Overflo
Overflo
Sig
Sig
e
Butto
Butto
w
w
n
n
Butto
n
n
n
Xmovement
Ymovement
标准鼠标指支持左右移动和三个鼠标键。
微软智能鼠标支持滚轮。
当主机向鼠标发送魔幻序列0xF3
0xC80xF30x640xF30x50后,鼠标进入滚轮模式。
此时读取鼠标ID返回0x03。
此后通信过程使
用如表11-5所示的4字节协议。
表11-5字节的PS/2协议数据格式
Y
Overflow
X
Overflow
Y
Sign
X
Sign
1
Middle
Butto
n
Right
Button
Left
Button
Xmovement
Ymovement
ZHmovement
ZLmovement
其中ZH和ZL都采用二进制补码表示,范围为-8〜7。
此外,鼠标还有只能IE鼠标和台风(Typhoon)鼠标,通信协议与上述还有不同。
目前最常见的鼠标就是这两种。
主机和鼠标之间的通信命令有很多。
主机向鼠标发出的每一个字节和命令鼠标都必须采用0xFA
应答,但是重传命令0xFE除外。
如果鼠标接收的命令或数据是错误的,鼠标发送0xFE表示NACK,
如果下一个字节重复错误,鼠标使用0xFC表示连续错误。
0xD0表示读扩展ID,可最长达256字节。
0xE1表示读取第二个ID。
0xE2表示RMTrackPoint。
0xE6表示设置鼠标比例为原始比例1:
1,即Xmovement和Ymovement都以原始值发送。
0xE7表示设置鼠标比例为原始比例2:
1,即如果Xmovement或Ymovement大于等于6,则乘
以2后发送;如果小于6,则0,1,2,3,4,5分别被放大到0,1,1,3,6,9。
0xEA表示设置鼠标到流模式。
0xEB表示读取鼠标数据,即读取一个3字节或4字节的包。
0xEC清除卷绕模式。
0xEE表示设置鼠标到卷绕模式。
0xF0表示设置鼠标到遥控模式。
0xF2表示读取鼠标ID。
0xF3表示设置鼠标采样率。
0xF4表示设置鼠标使能。
0xF5表示设置鼠标停止。
0xF6表示设置鼠标到默认值。
0xFE表示请求重新发送。
0xFF表不'复位。
鼠标还有一些其他的更加复杂的命令,读者可参考有关文献。
第三步:
/**********************XXXX.C部分*********************/
#include
#include"mouse.h"
#include"LCD1602_4.h”
#include"DELAY52.h”sbitbeep=P3A7;
voidmain()
(
LCD1602_Init();//初始化液晶1602
CLEARSCREEN;//清屏
Init_mouse();
delayms(500);
num(0,2,mouse_byte);//x坐标值delayms(500);
host_to_mouse(0xf3);
num(0,2,mouse_byte);
num(0,10,1);
delayms(500);
delay10us
(1);
host_to_mouse(0xc8);
num(0,2,mouse_byte);
num(0,10,2);
delayms(500);
delay10us
(1);
host_to_mouse(0xf3);
num(0,2,mouse_byte);
num(0,10,3);
delayms(500);
host_to_mouse(0x64);
num(0,2,mouse_byte);
num(0,10,4);
delayms(500);
host_to_mouse(0xf3);
num(0,2,mouse_byte);
num(0,10,5);
delayms(500);
host_to_mouse(0x50);
num(0,2,mouse_byte);
num(0,10,6);
delayms(50);
delay10us
(1);
host_to_mouse(0xf2);
num(0,2,mouse_byte);
num(0,10,7);
delayms(50);
if(mouse_byte==0x03)
{
LCD1602_write_string(0,0,"OK");
delayms(500);
}
else
{LCD1602_write_string(0,0,"DE");
delayms(500);}
delayms(500);
while
(1)
{led=1;
CLEARSCREEN;//清屏
LCD1602_write_string(0,0,"x:
");
num(0,2,move_x);//x坐标值
LCD1602_write_string(0,8,"y:
");
num(0,10,move_y);//y坐标值
LCD1602_write_string(1,8,"z:
");
num(1,10,move_z);//y坐标值
if(mouse_data[0]&0x01)//如果点下左键
{
beep=0;
LCD1602_write_string(1,0,"left");
}
elseif(mouse_data[0]&0x02)//如果点下右键
{
beep=0;
LCD1602_write_string(1,0,"right");
}
elseif(mouse_data[0]&0x04)//如果点下中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 51 单片机 PS2 鼠标 程序