📄 pcmouse.c
字号:
/****************************************************************************
* 文 件 名:pcmouse.c
* 功 能:鼠标驱动
* 说 明:将跳线JP23全部短接,JP15跳线全部断开。
****************************************************************************/
#include "config.h"
/****************************************************************************
* 名 称:DelayMS()
* 功 能:短延时
* 入口参数:uint32 no 延时参数
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<50000; i++);
}
}
/****************************************************************************
* 名 称:SetMouseDatIn()
* 功 能:设置DAT为输入
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetMouseDatIn(void)
{
IODIR = IODIR & (~MOUSE_DAT);
}
/****************************************************************************
* 名 称:SetMouseDatOut()
* 功 能:设置DAT为输出
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetMouseDatOut(void)
{
IODIR = IODIR | MOUSE_DAT;
}
void SetMouseClkIn(void)
{
IODIR = IODIR & (~MOUSE_CLK);
}
void SetMouseClkOut(void)
{
IODIR = IODIR | MOUSE_CLK;
}
/****************************************************************************
* 名 称:WaitMouseClk0()
* 功 能:等待CLK变为低电平
* 入口参数:无
* 出口参数:无
****************************************************************************/
void WaitMouseClk0(void)
{
while((IOPIN&MOUSE_CLK) == MOUSE_CLK); // 等待CLK为低电平
}
/****************************************************************************
* 名 称:WaitMouseClk1()
* 功 能:等待CLK变为高电平
* 入口参数:无
* 出口参数:无
****************************************************************************/
void WaitMouseClk1(void)
{
while((IOPIN&MOUSE_CLK) == 0); // 等待CLK为高电平
}
/****************************************************************************
* 名 称:SendMouseCmd()
* 功 能:发送鼠标命令函数
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SendMouseCmd(uint8 ord)
{ uint8 bitcount; // 数据(位)计数器
uint8 m_cnt; // 校验字变量
WaitMouseClk1(); // 确认总线正常
SetMouseClkOut(); // 通知鼠标,主机要发送命令
CMOUSE_CLK(); // CLK = 0;
DelayNS(1);
SetMouseDatOut();
CMOUSE_DAT(); // DAT = 0;
m_cnt = 0;
/* 发送11位数据,会有11个while(CLK==1) */
SetMouseClkIn();
WaitMouseClk0(); // while(CLK==1); 已发送起始位
/* 发送8位命令数据 */
for(bitcount=0; bitcount<8; bitcount++)
{ if((ord&0x01) != 0) // 数据位的判断
{
SMOUSE_DAT(); // DAT=1;
m_cnt++; // 校验字加1
}
else
{
CMOUSE_DAT(); // DAT=0;
}
WaitMouseClk1(); // while(CLK==0);
WaitMouseClk0(); // while(CLK==1);
ord = ord>>1; // 对数据位进行移位处理
}
/* 发送C位,即校验位 */
if((m_cnt&0x01) != 0)
{
CMOUSE_DAT(); // DAT=0;
}
else
{
SMOUSE_DAT(); // DAT=1;
}
WaitMouseClk1(); // while(CLK==0);
WaitMouseClk0(); // while(CLK==1);
/* 发送停止位 */
SMOUSE_DAT(); // DAT=1;
WaitMouseClk1(); // while(CLK==0);
WaitMouseClk0(); // while(CLK==1);
SetMouseDatIn(); // 恢复(主机)DAT为输入模式
DelayNS(10);
}
/****************************************************************************
* 名 称:RcvMouseDat()
* 功 能:接收鼠标的数据
* 入口参数:无
* 出口参数:uint16 放开按键时,返回值高8位为0xF0
****************************************************************************/
uint16 RcvMouseDat(void)
{ uint16 mouse;
uint8 j;
mouse = 0; // 键盘扫描码接收变量初化为0
WaitMouseClk1(); // while(CLK==0);
for(j=0; j<8; j++) // 读取8位数据
{
mouse = mouse>>1;
WaitMouseClk0(); // while(CLK==1);
if((IOPIN&MOUSE_DAT) == MOUSE_DAT)
{
mouse = mouse+0x80;
}
WaitMouseClk1(); // while(CLK==0);
}
WaitMouseClk0(); // while(CLK==1); 接收校验位
WaitMouseClk1(); // while(CLK==0);
WaitMouseClk0(); // while(CLK==1); 接收完一侦数据11个下降沿,即11位数据0 d0---d7 C 1
WaitMouseClk1(); // while(CLK==0);
/*****************************************************************
* if(key==0xF0) // 若是放开码,则不处理
* {
* WaitMouseClk0(); // while(CLK==1);
* WaitMouseClk1(); // while(CLK==0);
*
* for(i=0;i<8;i++) // 8个数据,即8个while(CLK==1)
* {
* key = key>>1;
* WaitMouseClk0(); // while(CLK==1);
* if((IOPIN&MOUSE_DAT) == MOUSE_DAT)
* {
* key = key+0x80;
* }
*
* WaitMouseClk1(); // while(CLK==0);
* }
* key |= 0xF000;
*
* WaitMouseClk0(); // while(CLK==1);
* WaitMouseClk1(); // while(CLK==0);
*
* WaitMouseClk0(); // while(CLK==1); 第11位数据
* WaitMouseClk1(); // while(CLK==0);
* } // end of if(key==0xf0)...
************************************************
*/
DelayNS(1);
return(mouse);
}
/****************************************************************************
* 名 称:My_GetCh()
* 功 能:完整获得键值
* 入口参数:无
* 出口参数:uint16 读取到的按键值
****************************************************************************/
uint16 My_GetDat(void)
{
SetMouseDatIn(); // 设置(主机)DAT为输入模式
WaitMouseClk0(); // 等待起动位,第一个CLK下降沿
return(RcvMouseDat());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -