单片机学习小组
直播中

贾伟刚

7年用户 1574经验值
私信 关注

51单片机ps2鼠标驱动mouse.h头文件下载

在代码的底部 点击全部复制,保存为mouse.h即可头文件下载到电脑
  • /******************************************************
  •      演示鼠标引脚定义
  • CLK : 白色
  • SDA  : 绿色
  • GND:   橙色
  • VCC:   蓝色
  • *******************************************************/
  • #include"delay52.h"
  • #ifndef MOUSE_H
  • #define MOUSE_H
  • ***it mouse_SDA=P3^4;//数据线P3_5
  • ***it mouse_CLK=P3^3;//时钟线P3_3
  • unsigned char bdata mouse_byte; //接收字节
  • ***it mouse_byte_bit0=mouse_byte^0;//mouse_byte第0位
  • ***it mouse_byte_bit1=mouse_byte^1;//mouse_byte第1位
  • ***it mouse_byte_bit2=mouse_byte^2;//mouse_byte第2位
  • ***it mouse_byte_bit3=mouse_byte^3;//mouse_byte第3位
  • ***it mouse_byte_bit4=mouse_byte^4;//mouse_byte第4位
  • ***it mouse_byte_bit5=mouse_byte^5;//mouse_byte第5位
  • ***it mouse_byte_bit6=mouse_byte^6;//mouse_byte第6位
  • ***it 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[3];//接收鼠标数据缓冲区,分别存放:功能信息字节,x位移量,y位移量
  • unsigned char mouse_data_bit=0;//mouse_data[mouse_data_bit]
  • unsigned int move_x=10000;//存放横坐标
  • unsigned int move_y=10000;//存放纵坐标
  • void Init_mouse(void)
  • {
  •      TCON=0x00;
  •      EA=1;
  •      EX1=1;//允许外部中断1
  •      ET0=0x01;//允许全局中断,允许定时器/计数器0溢出中断
  •      PX1=1;//设置中断优先级
  • }
  • /***********************************************************************
  •   发送数据
  • ************************************************************************/
  • void mouse_send_data(unsigned char dat)
  • {
  • unsigned char i;
  • EX1=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);
  • EX1=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<3)
  •    mouse_data[mouse_data_bit++]=mouse_byte;
  •   if(mouse_data_bit==3)
  •   {
  •    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坐标加
  •    }
  •   }
  • }
  • }
  • /**************************************************
  •        外部中断1
  • ***************************************************/
  • void ReceiveData(void)  interrupt 2
  • {
  • 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;
  • }
  • }
  • #endif




更多回帖

发帖
×
20
完善资料,
赚取积分