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

📄 pcmouse.c

📁 pcmouse.rar PS/2键盘接收代码
💻 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 + -