找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4101|回复: 0
打印 上一主题 下一主题
收起左侧

ps2 3D鼠标 单片机读取···

[复制链接]
跳转到指定楼层
楼主
ID:71259 发表于 2014-12-29 00:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 daming 于 2014-12-29 01:03 编辑


/*此程序是原始版本,只能够在单片机上显示X轴数据,因为偶的单片机的液晶用做他途了*/
#include<reg52.h>
#include"mouse.h"  //
mouse.h头文件下载地址:http://www.51hei.com/bbs/dpj-29724-1.html

void main()
{
Init_mouse();      //初始化素单片机设置      
mouse_send_data(0xff);    //复位鼠标命令
delay(500);       //因为鼠标会自己返回数据给INT0,这儿我们忽略,理论上这个延时是多余的
mouse_send_data(0xf4);    //发送鼠标工作命令,我们忽略所有从鼠标返回的信息值,for 简便程序
while(1)       //大循环  在鼠标不动的时候显示X轴上的数据
{
  init_smg();      //这个也是多余的,单纯测试单片机是否工作
  P1=tab[move_x/10000];   //显示,数码管,没什么多的,这都不会,回家睡觉吧
  P0=4;
  delay(200);
  P1=tab[move_x/1000%10];
  P0=3;
  delay(200);
  P1=tab[move_x/100%10];
  P0=2;
  delay(200);
  P1=tab[move_x/10%10];
  P0=1;
  delay(200);  
  P1=tab[move_x%10];
  P0=0;
  delay(200);
}
}
/*over,谢谢网友提供的资料*/
/*by jack*/


下面是mouse.h的头文件
/******************************************************
     演示鼠标引脚定义
CLK : 白色
SDA  : 绿色
GND:   橙色
VCC:   蓝色
*******************************************************/
#include<reg52.h>
#ifndef MOUSE_H     //避免重复定义
#define MOUSE_H
sbit mouse_SDA=P3^0;//数据线P3_5
sbit mouse_CLK=P3^2;//时钟线P3_3

                           
unsigned char bdata mouse_byte; //接收字节
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位
unsigned char bdata mouse_fuction;//功能信息字节
                     
unsigned char mouse_buffer[11];//接收位数据缓冲区
unsigned char mouse_buffer_bit=0;//mouse_buffer[mouse_buffer_bit]
unsigned char mouse_data[4];//接收鼠标数据缓冲区,分别存放:功能信息字节,x位移量,y位移量
unsigned char mouse_data_bit=0;//mouse_data[mouse_data_bit]
unsigned int move_x=10000;//存放横坐标
unsigned int move_y=10000;//存放纵坐标
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int cnt)   //延时,us级别的
{
while(--cnt);
}
void delay10us(int i)     //延时,貌似接近ms
{
int y;
while(i--)
{
  for(y=1;y<2;y++);
}
}
void  init_smg()     //单片机测试用滴
{
P1=tab[3];
P0=5;
}
void Init_mouse(void)
{
     TCON=0x00;
     EA=1;
     EX0=1;//允许外部中断1
     ET0=0x01;//允许全局中断,允许定时器/计数器0溢出中断
     PX0=1;//设置中断优先级
}

/***********************************************************************
  发送数据
************************************************************************/
void mouse_send_data(unsigned char dat)
{
unsigned char i;
EX0=0;                              /*关闭外部中断1*/
ACC=dat;                            /*将要发送的数据放入A寄存器*/
mouse_CLK=0;                       /*拉低时钟线*/
delay10us(200);                      /*延时100us以上*/
mouse_SDA=0;                        /*拉低数据线*/
delay10us(40);
mouse_CLK=1;                       /*释放时钟线*/
for(i=0;i<=7;i++)             /*低位在前,一次发送8个数据位*/
{
  while(mouse_CLK==1);           /*等待设备拉低时钟线*/
  mouse_SDA=(dat>>i)&0x01;      /*发送数据位*/
  while(mouse_CLK==0);           /*等待设备释放时钟线*/
}
while(mouse_CLK==1);
mouse_SDA=~P;                       /*发送校验位,奇校验*/
while(mouse_CLK==0);
while(mouse_CLK==1);
mouse_SDA=1;                        /*发送停止位*/
while(mouse_CLK==0);         
while(mouse_CLK==1);    /*应答位*/
while(mouse_CLK==0);
EX0=1;                              /*打开外部中断1*/
}
/*********************************************
    奇校检
**********************************************/
unsigned char 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)//如果"X sign bit"为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坐标加
   }
  }
  P1=tab[move_x/10000];    //避免执行串口程序时单片机不显示而设计
  P0=4;
  delay(200);
  P1=tab[move_x/1000%10];
  P0=3;
  delay(200);
  P1=tab[move_x/100%10];
  P0=2;
  delay(200);
  P1=tab[move_x/10%10];
  P0=1;
  delay(200);  
  P1=tab[move_x%10];
  P0=0;
  delay(200);
}
}
/**************************************************
       外部中断1
***************************************************/
void ReceiveData(void)  interrupt 0
{
if(mouse_buffer_bit<=10)
{                                 
  while(mouse_CLK==0);//等待设备拉高时钟线
  mouse_buffer[mouse_buffer_bit++]=mouse_SDA;//接收数据
}
if(mouse_buffer_bit==11)
{
  data_analyse();//数据分析及处理
  mouse_buffer_bit=0;
}           
}
#endif

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表