host_to_mouse(0xf3); num(0,2,mouse_byte); num(0,10,5); delayms(500); host_to_mouse(0x50); num(0,2,mouse_byte); num(0,10,6); delayms(50); delay10us(1);
host_to_mouse(0xf2); num(0,2,mouse_byte); num(0,10,7); delayms(50); if(mouse_byte==0x03) { LCD1602_write_string(0,0,\ delayms(500); } else {LCD1602_write_string(0,0,\ delayms(500);} delayms(500); while(1) { led=1; CLEARSCREEN;//清屏 LCD1602_write_string(0,0,\ num(0,2,move_x);//x坐标值 LCD1602_write_string(0,8,\ num(0,10,move_y);//y坐标值 LCD1602_write_string(1,8,\ num(1,10,move_z);//y坐标值 if(mouse_data[0]&0x01)//如果点下左键 { beep=0; LCD1602_write_string(1,0,\ } else if(mouse_data[0]&0x02)//如果点下右键
{ beep=0; LCD1602_write_string(1,0,\ } else if(mouse_data[0]&0x04)//如果点下中键 { beep=0; LCD1602_write_string(1,0,\ } else { beep=1; LCD1602_write_string(1,0,\ } delayms(50); } }
/********************XXX.H文件部分**********************/ #ifndef MOUSE_H #define MOUSE_H #include\#include\
#define delay10 {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();} #define delay100 {delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10 delay10;}
sbit mouse_SDA=P3^4;//数据线P3_5 计数器0输入端口 sbit mouse_CLK=P3^3;//时钟线P3_3 外部中断1输入端口 sbit led=P3^6; bit pp=0; bit ACK=0; uchar recv=0;
uchar bdata mouse_byte; //接收字节 bdata-->可寻址的片内RAM sbit mouse_byte_bit0=mouse_byte^0;//mouse_byte第0位 sbit mouse_byte_bit1=mouse_byte^1;//mouse_byte第1位 sbit mouse_byte_bit2=mouse_byte^2;//mouse_byte第2位 sbit mouse_byte_bit3=mouse_byte^3;//mouse_byte第3位 sbit mouse_byte_bit4=mouse_byte^4;//mouse_byte第4位 sbit mouse_byte_bit5=mouse_byte^5;//mouse_byte第5位 sbit mouse_byte_bit6=mouse_byte^6;//mouse_byte第6位 sbit mouse_byte_bit7=mouse_byte^7;//mouse_byte第7位
uchar bdata mouse_fuction;//功能信息字节
uchar mouse_buffer[11];//接收位数据缓冲区
uchar mouse_buffer_bit=0;//mouse_buffer[mouse_buffer_bit]
uchar mouse_data[4];//接收鼠标数据缓冲区,分别存放:功能信息字节,x位移量,y位移量 uchar mouse_data_bit=0;//mouse_data[mouse_data_bit]
uint move_x=10000;//存放横坐标 uint move_y=10000;//存放纵坐标 uchar move_z=0; void Init_mouse(void) {
// TCON=0x00; // //中断触发方式0 EA=1; //开放中断 EX1=1;//允许外部中断1
// ET0=0x01;//允许全局中断,允许设定时器/计数器0溢出中断 开定时器中断0 PX1=1;//设置中断优先级 设外部中断1为最高优先级别 }
/*********************************************************************** 发送数据
************************************************************************/
void host_to_mouse(uchar cmd) {
uchar i; EX1=0; mouse_CLK=0; delay100; delay100; ACC=cmd;
pp=~P; //获得奇偶校验位 mouse_SDA=0; mouse_CLK=1; for(i=0;i<8;i++) {
while(mouse_CLK==1); mouse_SDA=cmd&0x01; cmd>>=1;
while(mouse_CLK==0); }
while(mouse_CLK==1);
mouse_SDA=pp; //发送奇偶校验位 while(mouse_CLK==0); while(mouse_CLK==1); mouse_SDA=1;
while(mouse_CLK==0); while(mouse_CLK==1);
ACK=mouse_SDA; //接收应答位 while(mouse_CLK==0); EX1=1; }
/********************************************* 奇校检
**********************************************/ uchar Checkout(void) { ACC=mouse_byte; if(~P==mouse_buffer[9]) return 1; else return 0; }
/********************************************************* 数据分析及处理
**********************************************************/ void data_analyse(void) { //将收到的11位信号中截取8位数据放进mouse_byte mouse_byte_bit0=mouse_buffer[1]; mouse_byte_bit1=mouse_buffer[2]; mouse_byte_bit2=mouse_buffer[3]; mouse_byte_bit3=mouse_buffer[4]; mouse_byte_bit4=mouse_buffer[5]; mouse_byte_bit5=mouse_buffer[6]; mouse_byte_bit6=mouse_buffer[7]; mouse_byte_bit7=mouse_buffer[8]; if(Checkout())//如果校验正确 { if(mouse_data_bit<4) mouse_data[mouse_data_bit++]=mouse_byte; if(mouse_data_bit==4) {
mouse_data_bit=0; if(mouse_data[0]&0x10)//如果\为1,表示鼠标向左移 { 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[3]&0x08) { move_z-=(16-(mouse_data[3]&0x0f)); } else { mouse_data[3]=mouse_data[3]&0x0f; move_z+=mouse_data[3]; //Z坐标加 } } } }
/************************************************** 外部中断1
***************************************************/ void ReceiveData(void) interrupt 2 { led=0; if(mouse_buffer_bit<=10) { while(mouse_CLK==0);//等待设备拉高时钟线 mouse_buffer[mouse_buffer_bit++]=mouse_SDA;//接收数据 } if(mouse_buffer_bit==10) { data_analyse();//数据分析及处理 mouse_buffer_bit=0;