单片机与PS2鼠标程序滚轮识别显示3D坐标(2)

2020-03-29 19:15

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;


单片机与PS2鼠标程序滚轮识别显示3D坐标(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:安徽第一卷 2013年中考安徽名校大联考语文试题(二)扫描版 - 图

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: