小磷光一

BF533鼠标的初始化函数

0
阅读(2535)

 

****************************************************************************/ 
#include "dm_bf5xx.h"
struct mousedat 
	{
	    int_t   dat;
	    int_t   newly;
	}mousedat;
struct mousedat mdat1,mdat2,mdat3;
int_t   RecNewDat;       				// 接收到新的数据
int_t   ResOrDat;						// 响应 或 是数据  响应为1 数据为0
int_t   ResNum ;						// 响应数据字节数
int_t   RecDat=3;
int_t   WR;								// 中断程序中是发送子程序还是接收子程序 WR=1 发送
									// WR =0 接收
int_t   sendok ;						// 标志发送成功
extern int_t   mkey;
int_t   newflag ;
int_t   mcmd ;

/****************************************************************************
* 名称 : Init_CPLD
* 功能 : 允许连接鼠标数据线的74HC245工作
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Init_MCPLD()
{
	*pCtrIner_Flag_OE =~MOUSE_SW_OE;//MOUSE_SW_OE=0
}
/****************************************************************************
* 名称 : PS2_DAT_DIR_IN
* 功能 : 允许连接鼠标数据线PF口为输入状态
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void PS2_DAT_DIR_IN()
{
	*pFIO_DIR = (*pFIO_DIR)&(~SDA); // 输入允许
	*pFIO_INEN |= SDA;
	*pCtrOut_Flag_A =PS_DAT_DIR;
}
/****************************************************************************
* 名称 : PS2_DAT_DIR_OUT
* 功能 : 允许连接鼠标数据线PF口为输出状态
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void PS2_DAT_DIR_OUT()
{
	*pFIO_DIR = ((*pFIO_DIR)|SDA); // 数据输出允许
 	*pFIO_INEN &= ~SDA;
 	*pCtrOut_Flag_A =(~PS_DAT_DIR);
}
/****************************************************************************
* 名称 :PS_CLK_IN
* 功能 :CPLD内部鼠标时钟切换到输入状态
* 入口参数 :无
* 出口参数 :无
***************************************************************************/
void PS_CLK_IN()
{
	*pCtrOut_Flag_C  = MOUSE_SW;//MOUSE_SW=1 SHU RU 
}
/****************************************************************************
* 名称 :PS_CLK_OUT
* 功能 :CPLD内部鼠标时钟切换到输出状态
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void PS_CLK_OUT()
{
	*pCtrOut_Flag_C  = 0x00;//(Out_Flag_C &(~MOUSE_SW ));//MOUSE_SW=0 SHU CHU
}
/****************************************************************************
* 名称 :PS2_Disable
* 功能 :CPLD内部ps2sw 不允许 此时不能进行鼠标操作
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void PS2_Disable()
{
	*pCtrIner_Flag_OE = 0xff;//Iner_Flag_OE;//MOUSE_SW_OE=1
}
/****************************************************************************
* 名称 : ps_send_start
* 功能 :发送鼠标命令起始条件
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void ps_send_start()
{
	uint8_t   i;	
	*pFIO_MASKA_C	= 0x0020;		//允许中断
	PS2_DAT_DIR_OUT();
	SET_PF(SDA); 					 // 拉高数据
	PS_CLK_IN();
	for(i=0;i<50;i++)
	{
		udelay(0xfff);
	}
	*pCtrOut_Flag_C  =0x00;//(Out_Flag_C &(~MOUSE_SW ));
	for(i=0;i<50;i++)
	{
		udelay(0xfff);
	}
	CLR_PF(SDA);  					// 拉低数据
	udelay(0xffff);
	PS_CLK_IN(); 					//时钟输入 ,同时拉高CLK 释放
	*pFIO_MASKA_S	= 0x0020;		//允许中断
}

/****************************************************************************
* 名称 : Decode_Dat
* 功能 :打印鼠标动作信息
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Decode_Dat(void)
{
 	if((mdat3.dat&LeftBtn)!=0x00)    { printf("LeftBtn is pressing!\n\r");   }
 	if((mdat3.dat&RightBtn)!=0x00)   { printf("RightBtn is pressing!\n\r");  }
 	if((mdat3.dat&Middle )!=0x00)    { printf("Middle is pressing!\n\r");    }
 	if((mdat3.dat&Xsign)!=0x00)      { printf("Mouse Xsign move to left !\n\r");  }
 	else                             { printf("Mouse Xsign move to right !\n\r");  }
 	if((mdat3.dat&Ysign)!=0x00)      { printf("Mouse Ysign move to down !\n\r");  }
 	else                             { printf("Mouse Ysign move to up !\n\r");  }
}
/****************************************************************************
* 名称 : Decode_Res
* 功能 :对鼠标进行复位
* 入口参数 :num  当为1时对鼠标进行复位
* 出口参数 :0
****************************************************************************/
int_t   Decode_Res(int_t   num)          // 响应正确返回 1 ,响应错误返回0
{
    if(num== 1) 
    	{
    		if (mdat1.newly == 1 )
    			{
    				if(mdat1.dat == 0xfa)
    				return 1;
    				else 
    				return 0;
    				mdat1.newly =0 ;
    			}
    		else return 0;
    	}

}
/****************************************************************************
* 名称 : Zero_dat
* 功能 :清除变量值
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Zero_dat(void)
{
	mdat1.dat = 0 ;
    mdat1.newly = 0; 
   	mdat2.dat = 0 ;
    mdat2.newly = 0; 
   	mdat3.dat = 0 ;
    mdat3.newly = 0;      

}
/****************************************************************************