⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2_mouse.c

📁 ps2键盘的时序介绍和开发程序
💻 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 + -