51单片机程序设计:[2]51单片机读取PS鼠标
1、根据下图,连接系统电路:
如果不一致在程序中可以修改,这些引脚定义。
![51单片机程序设计:[2]51单片机读取PS鼠标](https://exp-picture.cdn.bcebos.com/6834ecc4ec995943df47fd4d95425d6b05d1049e.jpg)
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鼠标](https://exp-picture.cdn.bcebos.com/58021a0148fe1e42832db162c2299a883813039e.jpg)
![51单片机程序设计:[2]51单片机读取PS鼠标](https://exp-picture.cdn.bcebos.com/3852f6e5eceeadbc5869f2c3cd18dfdae53b7b9e.jpg)
![51单片机程序设计:[2]51单片机读取PS鼠标](https://exp-picture.cdn.bcebos.com/e57a258602214f577d10e608732064fb970b739e.jpg)
![51单片机程序设计:[2]51单片机读取PS鼠标](https://exp-picture.cdn.bcebos.com/52fae62064fb960bc267b0d28fa355e982ae6c9e.jpg)