找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机解码PS2鼠标,用1602显示哦

[复制链接]
跳转到指定楼层
楼主
可以用51单片机来驱动PS2鼠标,然后通过LCD1602显示。
PS2鼠标控制实验.rar (30.33 KB, 下载次数: 74)



部分源码:
  1. //Download by
  2. #include"delay52.h"
  3. #ifndef MOUSE_H
  4. #define MOUSE_H

  5. sbit mouse_SDA=P3^2;//数据线P3_2
  6. sbit mouse_CLK=P3^3;//时钟线P3_3

  7. sbit led1=P1^3;
  8.                            
  9. unsigned char bdata mouse_byte; //接收字节
  10. sbit mouse_byte_bit0=mouse_byte^0;//mouse_byte第0位
  11. sbit mouse_byte_bit1=mouse_byte^1;//mouse_byte第1位
  12. sbit mouse_byte_bit2=mouse_byte^2;//mouse_byte第2位
  13. sbit mouse_byte_bit3=mouse_byte^3;//mouse_byte第3位
  14. sbit mouse_byte_bit4=mouse_byte^4;//mouse_byte第4位
  15. sbit mouse_byte_bit5=mouse_byte^5;//mouse_byte第5位
  16. sbit mouse_byte_bit6=mouse_byte^6;//mouse_byte第6位
  17. sbit mouse_byte_bit7=mouse_byte^7;//mouse_byte第7位

  18. unsigned char bdata mouse_fuction;//功能信息字节
  19.                      
  20. unsigned char mouse_buffer[11];//接收位数据缓冲区
  21. unsigned char mouse_buffer_bit=0;//mouse_buffer[mouse_buffer_bit]
  22. unsigned char mouse_data[3];//接收鼠标数据缓冲区,分别存放:功能信息字节,x位移量,y位移量
  23. unsigned char mouse_data_bit=0;//mouse_data[mouse_data_bit]

  24. unsigned int move_x=10000;//存放横坐标
  25. unsigned int move_y=10000;//存放纵坐标

  26. void Init_mouse(void)
  27. {
  28.      TCON=0x00;
  29.      EA=1;
  30.      EX1=1;//允许外部中断1
  31.      ET0=0x01;//允许全局中断,允许定时器/计数器0溢出中断
  32.      PX1=1;//设置中断优先级
  33. }


  34. /***********************************************************************
  35.                 发送数据
  36. ************************************************************************/
  37. void mouse_send_data(unsigned char dat)
  38. {
  39.         unsigned char i;
  40.         EX1=0;                              /*关闭外部中断1*/
  41.         ACC=dat;                            /*将要发送的数据放入A寄存器*/
  42.         mouse_CLK=0;                       /*拉低时钟线*/
  43.         delay10us(200);                      /*延时100us以上*/
  44.         mouse_SDA=0;                        /*拉低数据线*/
  45.         delay10us(40);
  46.         mouse_CLK=1;                       /*释放时钟线*/
  47.         for(i=0;i<=7;i++)             /*低位在前,一次发送8个数据位*/
  48.         {
  49.                 while(mouse_CLK==1);           /*等待设备拉低时钟线*/
  50.                 mouse_SDA=(dat>>i)&0x01;      /*发送数据位*/
  51.                 while(mouse_CLK==0);           /*等待设备释放时钟线*/
  52.         }
  53.         while(mouse_CLK==1);
  54.         mouse_SDA=~P;                       /*发送校验位,奇校验*/
  55.         while(mouse_CLK==0);
  56.         while(mouse_CLK==1);
  57.         mouse_SDA=1;                        /*发送停止位*/
  58.         while(mouse_CLK==0);                                                          
  59.         while(mouse_CLK==1);                                /*应答位*/
  60.         while(mouse_CLK==0);       
  61.         EX1=1;                              /*打开外部中断1*/
  62. }

  63. /*********************************************
  64.                          奇校检
  65. **********************************************/
  66. unsigned char Checkout(void)                       
  67. {
  68.         ACC=mouse_byte;
  69.         if(~P==mouse_buffer[9])
  70.                 return 1;
  71.         else
  72.                 return 0;
  73. }

  74. /*********************************************************
  75.                    数据分析及处理
  76. **********************************************************/
  77. void data_analyse(void)
  78. {
  79.         //将收到的11位信号中截取8位数据放进mouse_byte
  80.         mouse_byte_bit0=mouse_buffer[1];
  81.         mouse_byte_bit1=mouse_buffer[2];
  82.         mouse_byte_bit2=mouse_buffer[3];
  83.         mouse_byte_bit3=mouse_buffer[4];
  84.         mouse_byte_bit4=mouse_buffer[5];
  85.         mouse_byte_bit5=mouse_buffer[6];
  86.         mouse_byte_bit6=mouse_buffer[7];
  87.         mouse_byte_bit7=mouse_buffer[8];       
  88.         if(Checkout())//如果校验正确
  89.         {
  90.                 if(mouse_data_bit<3)         
  91.                         mouse_data[mouse_data_bit++]=mouse_byte;
  92.                 if(mouse_data_bit==3)
  93.                 {
  94.                         mouse_data_bit=0;
  95.                         if(mouse_data[0]&0x10)//如果"X sign bit"为1,表示鼠标向左移
  96.                         {
  97.                                 move_x-=(256-mouse_data[1]);//x坐标减
  98.                         }
  99.                         else
  100.                         {
  101.                                 move_x+=mouse_data[1];//x坐标加
  102.                         }
  103.                         if(mouse_data[0]&0x20)
  104.                         {
  105.                                 move_y-=(256-mouse_data[2]);//y坐标减
  106.                         }
  107.                         else
  108.                         {
  109.                                 move_y+=mouse_data[2];//y坐标加
  110.                         }
  111.                 }
  112.         }
  113. }

  114. /**************************************************
  115.                                    外部中断1
  116. ***************************************************/
  117. void ReceiveData(void)  interrupt 2
  118. {
  119.         if(mouse_buffer_bit<=10)
  120.         {                                                
  121.                 while(mouse_CLK==0);//等待设备拉高时钟线
  122.                 mouse_buffer[mouse_buffer_bit++]=mouse_SDA;//接收数据
  123.         }       
  124.         if(mouse_buffer_bit==10)
  125.         {
  126.                 data_analyse();//数据分析及处理
  127.                 mouse_buffer_bit=0;
  128.         }                                                                         
  129. }

  130. #endif

复制代码


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:166723 发表于 2017-2-26 14:14 | 只看该作者
学习一下,谢谢楼主
回复

使用道具 举报

板凳
ID:166771 发表于 2017-2-26 18:16 | 只看该作者
非常厉害
回复

使用道具 举报

地板
ID:302991 发表于 2018-4-7 06:22 | 只看该作者
你好。。。我想用单片机读取鼠标的位移信息并保存。请问能不能通过您这个实现啊
回复

使用道具 举报

5#
ID:313563 发表于 2018-4-22 10:38 | 只看该作者
学习下
回复

使用道具 举报

6#
ID:218023 发表于 2018-7-6 19:14 | 只看该作者
不能用
回复

使用道具 举报

7#
ID:287196 发表于 2018-7-16 17:37 | 只看该作者
鼠标是用哪个的?我的不能用,示波器看了下波形,可能鼠标选的不对。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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