51单片机程序设计:[2]51单片机读取PS鼠标

2025-11-03 02:25:21

1、根据下图,连接系统电路:

如果不一致在程序中可以修改,这些引脚定义。

51单片机程序设计:[2]51单片机读取PS鼠标

2、由于代码在百度这里面显示的格式不太好看,特截图对照。代码先贴下面吧:

/*--------------------------------------------------------------*/sbit mouse_sda = P2^0;  //鼠标数据线sbit mouse_clk = P3^3;  //鼠标时钟线sbit led       = P1^3;  //按键LED指示sbit beep      = P2^2;  //蜂鸣器指示

/*--------------------------------------------------------------*///数据定义unsigned char n, m;   //循环变量unsigned int  mouse_word; //接收字16bitsunsigned char mouse_data[3];//接收字节缓冲区unsigned int  move_x;  //横坐标unsigned int  move_y;  //纵坐标bit mouse_left;    //左键bit mouse_right;   //右键bit mouse_middle;   //中键

/*--------------------------------------------------------------*///函数声明void INT0_init(void);      //外部中断INT0初始化void delay120us(void);      //延时120us 函数定义void mouse_write_dat(unsigned char dat); //发送数据void mouse_read_dat(void);     //读出数据void mouse_data_process(void);    //数据处理void mouse_init(void);      //鼠标初始化

/*--------------------------------------------------------------*///外部中断INT0初始化void INT0_init(void) {    EA  = 1;   //总中断 EX1 = 1;   //外部中断 PX1 = 1;   //中断优先级 IT1 = 0;   //低电平触发}

/*--------------------------------------------------------------*///延时120us 函数定义void delay120us(void){    unsigned char i, j;    for(i = 23; i > 0; i--)    for(j = 1; j > 0; j--);}

/*--------------------------------------------------------------*///发送数据//发送11位数据:1START-8DATA-1PARITY-1STOP//并接收一个应答位ack = 0 void mouse_write_dat(unsigned char dat){ unsigned char i; //循环变量 bit parity;   //奇校验位

 EX1 = 0;   //关闭外部中断 ACC = dat;   //存入累加器A,得到P(为偶校验) parity = ~P;  //获得奇校验位

 mouse_clk = 0;  //拉低时钟线 delay120us();  //至少延时100us mouse_sda = 0;  //发送起始位

 mouse_clk = 1;  //释放时钟线 mouse_sda = 1;  //释放数据线

 for(i = 0; i < 8; i++) {        //至少要在25us内完成发送一位!!!  while(!mouse_clk);   //等待设备把时钟线拉高  mouse_sda =(bit)(dat& 0x01);//先发送最低位  dat >>= 1;     //下降沿写入数据  while(mouse_clk);   //等待设备把时钟线拉低 }

 while(!mouse_clk);    //等待设备把时钟线拉高 mouse_sda = parity;    //发送奇校验位 while(mouse_clk);    //等待设备把时钟线拉低

 while(!mouse_clk);    //等待设备把时钟线拉高 mouse_sda = 1;     //发送停止位 while(mouse_clk);    //等待设备把时钟线拉低

 while(!mouse_clk);    //等待设备把时钟线拉高 while(mouse_sda);    //等待接收应答位(总是为0) while(mouse_clk);    //等待设备把时钟线拉低

 while(!mouse_clk);    //等待设备释放时钟线 while(!mouse_sda);    //等待设备释放数据线 EX1 = 1;      //打开外部中断INT0}

/*--------------------------------------------------------------*///奇校验bit check_parity(void){  ACC = mouse_data[m]; if(~P == (bit)(mouse_word & 0x0200)) return 1; //奇校验成功则返回1 else          return 0; //奇校验失败则返回0}

/*--------------------------------------------------------------*///读出3字节数据void mouse_read_dat(void){ mouse_data[m] = (unsigned char)(mouse_word >> 1); //去掉最高两位和最后一位 if(check_parity())         //奇校验成功 {   mouse_word = 0;         //清接收数据字  m++; if(m == 3) {mouse_data_process(); m = 0;} //读出三字节数据 }}

   /*--------------------------------------------------------------*///数据处理void mouse_data_process(void){               //水平移动 if(mouse_data[0] & 0x10) move_x -= 256 - mouse_data[1]; //x坐标减 else      move_x += mouse_data[1];  //x坐标加               //垂直移动 if(mouse_data[0] & 0x20) move_y -= 256 - mouse_data[2]; //y坐标减 else      move_y += mouse_data[2];  //y坐标加

 if(mouse_data[0] & 0x01) mouse_left = 1;    //左键 else      mouse_left = 0;

 if(mouse_data[0] & 0x02) mouse_right = 1;    //右键 else      mouse_right = 0;

 if(mouse_data[0] & 0x04) mouse_middle = 1;    //中键 else      mouse_middle = 0;}

/*--------------------------------------------------------------*///外部中断INT0服务//接收11位数据:1START-8DATA-1PARITY-1STOPvoid INT0_intservice(void) interrupt 2   { mouse_word >>= 1;       //先向右空移一位 if(mouse_sda) mouse_word |= 0x0400;   //先接收最低位 n++; if(n == 11) {mouse_read_dat(); n = 0;} //接收完成则读出数据}

/*--------------------------------------------------------------*///鼠标初始化void mouse_init(void){ INT0_init();     //外部中断INT0初始化 mouse_write_dat(0xf4);   //Enable Data Reporting while(mouse_data[0] != 0xfa); //等待鼠标应答 mouse_data[0] = 0;    //清应答数据 m = 0;       //重新定义接收数据指针}

/*--------------------------------------------------------------*/

51单片机程序设计:[2]51单片机读取PS鼠标

51单片机程序设计:[2]51单片机读取PS鼠标

51单片机程序设计:[2]51单片机读取PS鼠标

51单片机程序设计:[2]51单片机读取PS鼠标

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢