1、根据下图,连接系统电路:如果不一致在程序中可以修改,这些引脚定义。
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 = 0void mouse_write_dat(unsigned char dat){unsigned char i;//循环变量bit parity;//奇校验位EX1 = 0;//关闭外部中断ACC = dat;//存入累加器A,得到P(为偶校验)parity = ~P;//获得奇校验位mouse_clk = 0;//拉低时钟线delay120us();//至少延时100usmouse_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;//奇校验成功则返回1else 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 Reportingwhile(mouse_data[0] != 0xfa);//等待鼠标应答mouse_data[0] = 0;//清应答数据m = 0;//重新定义接收数据指针}/*--------------------------------------------------------------*/