📄 ps2_mouse.c
字号:
//====================================================================================
//文 件 名:PS2_Mouse.c
//功能描述: PS2鼠标驱动程序
//维护记录: 2007年3月17日
//====================================================================================
#include "PS2_Mouse.h"
#define MOUSE_CMD_RESET 0xFF
#define MOUSE_CMD_SAMPLERATE 0xF3
#define MOUSE_CMD_DEVICEID 0xF2
#define MOUSE_CMD_REMOTE 0xF0
#define MOUSE_CMD_STREAM 0xEA
#define MOUSE_CMD_PAUSE 0xF5
#define MOUSE_CMD_RESUME 0xF4
#define MOUSE_CMD_READ 0xEB
#define MOUSE_RSP_ACK 0xFA
#define MOUSE_RSP_TESTOK 0xAA
unsigned short Mouse_Type = 0;
unsigned short Mouse_Mode;
//=============================================================
//语法格式: short Mouse_Init(void);
//实现功能: Mouse初始化
//参数: 无
//返回值: 0: 普通三键鼠标
// 3: 带滚轮的三键鼠标
// 4: 带滚轮的五键鼠标
// -1: 初始化失败
//=============================================================
short Mouse_Init(void)
{
PS2_Init();
return Mouse_Reset();
}
//=============================================================
//语法格式: short Mouse_Command(unsigned char Command);
//实现功能: 向鼠标发送命令(内部调用)
//参数: Command: 待发送的命令字
//返回值: 0: 成功
// -1: 失败
//=============================================================
short Mouse_Command(unsigned char Command)
{
PS2_ClearBuf();
PS2_Write(Command);
while(PS2_Status()&PS2_STATUS_WRITING); // 等待写入完成
if(PS2_Status()&PS2_STATUS_WRITEERR)
return -1;
while((PS2_Status()&PS2_STATUS_DATARDY)==0)
{
if(PS2_Status()&PS2_STATUS_READERR)return -1;
}
if(PS2_Read()!=MOUSE_RSP_ACK)
return -1;
return 0;
}
//=============================================================
//语法格式: short Mouse_Reset(void);
//实现功能: 复位鼠标
//参数: 无
//返回值: 0: 成功
// -1: 失败
//=============================================================
short Mouse_Reset(void)
{
if(Mouse_Command(MOUSE_CMD_RESET)!=0)
return -1;
while((PS2_Status()&PS2_STATUS_DATARDY)==0)
if(PS2_Status()&PS2_STATUS_READERR)return -1;
if(PS2_Read()!=MOUSE_RSP_TESTOK)
return -1;
while((PS2_Status()&PS2_STATUS_DATARDY)==0)
if(PS2_Status()&PS2_STATUS_READERR)return -1;
PS2_Read();
Mouse_SetSampleRate(200); // 测试是否三键滚轮鼠标
Mouse_SetSampleRate(100);
Mouse_SetSampleRate(80);
Mouse_Type = Mouse_GetDeviceID();
if(Mouse_Type == 0)
{
Mouse_SetSampleRate(200); // 测试是否五键滚轮鼠标
Mouse_SetSampleRate(200);
Mouse_SetSampleRate(80);
Mouse_Type = Mouse_GetDeviceID();
}
if(Mouse_SetMode(MOUSE_MOD_STREAM)!=0) // 初始化为Stream模式
return -1;
return Mouse_Type;
}
//=============================================================
//语法格式: short Mouse_SetSampleRate(unsigned char SampleRate);
//实现功能: 设置鼠标的采样速率
//参数: SampleRate: 采样速率,必须是10/20/40/60/80/100/200其中之一
//返回值: 0: 成功
// -1: 失败
//=============================================================
short Mouse_SetSampleRate(unsigned char SampleRate)
{
if(Mouse_Command(MOUSE_CMD_SAMPLERATE)!=0)
return -1;
if(Mouse_Command(SampleRate)!=0)
return -1;
return 0;
}
//=============================================================
//语法格式: short Mouse_GetDeviceID(void);
//实现功能: 获取鼠标的设备号
//参数: 无
//返回值: 鼠标的设备号,对于普通鼠标,设备号为0
//=============================================================
short Mouse_GetDeviceID(void)
{
if(Mouse_Command(MOUSE_CMD_DEVICEID)!=0)
return -1;
while((PS2_Status()&PS2_STATUS_DATARDY)==0)
if(PS2_Status()&PS2_STATUS_READERR)return -1;
return PS2_Read();
}
//=============================================================
//语法格式: short Mouse_SetMode(unsigned short Mode);
//实现功能: 设置鼠标的工作模式
//参数: Mode: MOUSE_MOD_STREAM Stream模式,当鼠标有动作时,主动向主机发送数据包
// MOUSE_MOD_REMOTE Remote模式,仅当主机查询时,鼠标才将动作信息发给主机
//返回值: 0: 成功
// -1: 失败
//=============================================================
short Mouse_SetMode(unsigned short Mode)
{
if(Mode == MOUSE_MOD_STREAM)
{
if(Mouse_Command(MOUSE_CMD_STREAM)!=0)
return -1;
if(Mouse_Command(MOUSE_CMD_RESUME)!=0)
return -1;
}
else
{
if(Mouse_Command(MOUSE_CMD_REMOTE)!=0)
return -1;
}
Mouse_Mode = Mode;
return 0;
}
//=============================================================
//语法格式: short Mouse_Pause(void);
//实现功能: 在Stream模式下,使鼠标暂停发送数据包
//参数: 无
//返回值: 0: 成功
// -1: 失败
//=============================================================
short Mouse_Pause(void)
{
if(Mouse_Mode == MOUSE_MOD_STREAM)
{
if(Mouse_Command(MOUSE_CMD_PAUSE)!=0)
return -1;
Mouse_Mode = MOUSE_MOD_PAUSE;
return 0;
}
else
return -1;
}
//=============================================================
//语法格式: short Mouse_Resume(void);
//实现功能: 在Stream模式下,恢复发送数据包
//参数: 无
//返回值: 0: 成功
// -1: 失败
//=============================================================
short Mouse_Resume(void)
{
if(Mouse_Mode == MOUSE_MOD_PAUSE)
{
if(Mouse_Command(MOUSE_CMD_RESUME)!=0)
return -1;
Mouse_Mode = MOUSE_MOD_STREAM;
return 0;
}
return -1;
}
//=============================================================
//语法格式: short Mouse_Get(MOUSE_STATUS *pMouse_Status);
//实现功能: 获取鼠标的动作信息
//参数: pMouse_Status: 存储鼠标动作信息的结构体地址
//返回值: 0: 成功
// -1: 失败
//=============================================================
short Mouse_Get(MOUSE_STATUS *pMouse_Status)
{
unsigned char PackageBuf[4], i, PackageLen;
if(Mouse_Type==0)
PackageLen = 3;
else
PackageLen = 4;
if(Mouse_Mode==MOUSE_MOD_STREAM) // 自动模式
{
if((PS2_Status()&0xFF)<PackageLen)
return -1;
for(i=0; i<PackageLen; i++)
{
PackageBuf[i] = PS2_Read();
}
}
else
{
if(Mouse_Command(MOUSE_CMD_READ)!=0)
return -1;
for(i=0; i<PackageLen; i++)
{
while((PS2_Status()&PS2_STATUS_DATARDY)==0)
if(PS2_Status()&PS2_STATUS_READERR)return -1;
PackageBuf[i] = PS2_Read();
}
}
pMouse_Status->Left = ((PackageBuf[0]&0x01)!=0); // 左键
pMouse_Status->Right = ((PackageBuf[0]&0x02)!=0); // 右键
pMouse_Status->Mid = ((PackageBuf[0]&0x04)!=0); // 中键
pMouse_Status->MoveX = PackageBuf[1]; // X位移
if(PackageBuf[0]&0x10) // 负数
pMouse_Status->MoveX |= 0xFF00;
pMouse_Status->MoveY = PackageBuf[2]; // Y位移
if(PackageBuf[0]&0x20)
pMouse_Status->MoveY |= 0xFF00;
if(Mouse_Type==3) // 三键滚轮鼠标
{
pMouse_Status->MoveZ = (short)(char)PackageBuf[3];
pMouse_Status->Btn4 = 0;
pMouse_Status->Btn5 = 0;
}
else if(Mouse_Type==4) // 五键滚轮鼠标
{
short TempZ;
TempZ = PackageBuf[3]&0x0F;
if(TempZ>7)
{
TempZ ^= 0x0F;
TempZ += 1;
TempZ = -TempZ;
}
pMouse_Status->MoveZ = TempZ;
pMouse_Status->Btn4 = ((PackageBuf[3]&0x10)!=0);
pMouse_Status->Btn5 = ((PackageBuf[3]&0x20)!=0);
}
else // 普通鼠标
{
pMouse_Status->MoveZ = 0;
pMouse_Status->Btn4 = 0;
pMouse_Status->Btn5 = 0;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -