xiahaiming 发表于 2011-5-5 11:05:09

PS2鼠标发送与接收程序

大家帮忙看看这个PS2鼠标接收与发送的程序我按照PS2协议来写的应该还有些问题望高手指点
#include"PS2.h"
#include"iom16v.h"
#include"macros.h"
#include"delay.h"
#defineCLK_IN_DDR    DDRA&=0XF7      
//时钟线设为输入
#defineCLK_OUT_DDR   DDRA|=0X08
//时钟线设为输出
#defineDATA_IN_DDR    DDRA&=0XFB
//数据线设为输入
#defineDATA_OUT_DDR   DDRA|=0X04
//数据线设为输出
#defineDATA_L         PORTA&=0XFB
//数据线拉低
#defineDATA_H          PORTA|=0X04
//数据线拉高
#defineCLK_L          PORTA&=0XF7
//时钟线拉低
#defineCLK_H         PORTA|=0X08
//时钟线 拉高
#defineDATA_STATE      (PINA&0X04)
//((PINA&0X04)==0X04)
//数据位为高??
#defineCLK_STATE      (PINA&0X08)
//((PINA&0X08)==0X08)
//时钟信号为高??
#defineuchar   unsigned char
unsigned char a;
int z;
void send_mouse(unsigned char sentchar)    //单片机向PS2鼠标发送数据
{
unsigned char sentbit_cnt= 0x00;
unsigned char sentchar_chk = 0x00;


while(CLK_STATE==0);//clk=high??
while(DATA_STATE==0);//DATA=HIGH??
   CLK_OUT_DDR;//时钟线设为输出
   CLK_L;//拉低时钟线;
   delaynus(100);//延时100us。
   DATA_OUT_DDR;DATA_L;//数据线设为输出,并拉低数据线;
   CLK_H;//释放时钟线;
   CLK_IN_DDR;//时钟线设为输入上拉
   CLK_H;
    for(sentbit_cnt=0;sentbit_cnt<8;sentbit_cnt++)
    {
   while(CLK_STATE==0X08);//等待时钟线变LOW
       
          if((sentchar&0X01)==0X01)
           {
             DATA_H;
               sentchar_chk= sentchar_chk+1;
           }
          elseDATA_L;
          while(CLK_STATE==0);//等待时钟线变高
          sentchar=sentchar>>1;                        //待发送数据右移一位
   
    }
   while(CLK_STATE==0X08);//等待时钟线变LOW
       
       switch(sentchar_chk)
        {
          case0:
          case2:
          case4:
          case6:   DATA_H;break;//KB_DATA = 1; break;                //奇校验
          case1:
          case3:
          case5:
          case7:   DATA_L; break;//KB_DATA = 0; break;                //奇校验
          default: break;
        }
        while(CLK_STATE==0);                   //等待时钟线变高
        while(CLK_STATE==0X08);                         //等待时钟线变为低
        //-------------发送停止位,停止位总为1
        DATA_H;//MS_DATA = 1;        
                                       
        while(CLK_STATE==0);                   //等待时钟线变高
               //-------------SEND ACK
       DATA_IN_DDR;DATA_H;
        while(CLK_STATE==0X08);                         //等待时钟线变为低
         while(DATA_STATE==0X04);                         //等待DATA线LOW
        while((CLK_STATE==0)&&(DATA_STATE==0));    //等待时钟线变高等待DATA线变高
       
}

xiahaiming 发表于 2011-5-5 11:08:42

这个是主机发给PS2鼠标设备的程序大家帮忙看看啊!

xiahaiming 发表于 2011-5-5 11:19:48

向鼠标读取数据的函数
unsigned char mouse_read(void)
{
        unsigned char k,data,t={0};
        DDRA=0XF0;PORTA=0XFF;//设数据线和时钟线为输入上拉
        while(CLK_STATE==0);//时钟线在高处
        while(DATA_STATE==0);//数据线在高处
        while(DATA_STATE==0X04);//等待数据线为低
        while(CLK_STATE==0X08); //读取起始位,在下降沿读取

        while(CLK_STATE==0);//等待高电平,开始接收数据位
   

        for(k=0;k<8;k++)
        {
                while(CLK_STATE==0X08);
                        if(DATA_STATE==0X04)
                        {
                                t=1;
                        }
                        else
                        {
                                t=0;
                        }
                while(CLK_STATE==0);       
        }       
        while(CLK_STATE==0X08);//接收校验位
        while(CLK_STATE==0);
       
        while(CLK_STATE==0X08);//接收停止位
        while(CLK_STATE==0);
       
        data=128*t+64*t+32*t+16*t+8*t+4*t+2*t+1*t;
       
        return data;
       
}

xiahaiming 发表于 2011-5-5 11:26:42

鼠标复位函数
void reset_mouse(void)
{   
   
        unsigned char mouse_data;
       
        send_mouse(0XFF);//发送复位命令
       
         mouse_data=mouse_read();a=mouse_data;//鼠标的应答
        mouse_data=mouse_read();a=mouse_data;
        mouse_data=mouse_read();a=mouse_data;
               
        send_mouse(0XF4);   
        mouse_data=mouse_read();
        a=mouse_data;


}

xiahaiming 发表于 2011-5-5 11:27:56

然后我用一个IO口接LED灯来显示鼠标的应答,可是毫无反应啊!望高手指点

hero245 发表于 2011-5-5 12:19:51

mark

wujinwang 发表于 2014-5-17 10:58:20

最近在做课设,也是做鼠标通讯的。求楼主帮忙一下!谢谢
页: [1]
查看完整版本: PS2鼠标发送与接收程序