久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4051|回復: 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.zg4o1577.cn/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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区国产精品 | 欧美精品v国产精品v日韩精品 | 亚洲视频免费 | 国产成人免费观看 | 久久久精彩视频 | 精品国产一区二区三区久久影院 | 国产一区二区三区久久久久久久久 | 久久精品国产一区 | 亚洲风情在线观看 | 五月激情婷婷在线 | 久久精品国产久精国产 | 久久69精品久久久久久久电影好 | 在线亚州 | 2018天天干天天操 | 欧美日韩亚洲视频 | 日韩精品在线一区 | 欧美一级免费 | 综合久久久 | 国内精品成人 | 人妖一区 | 国产综合久久 | 国产91 在线播放 | 美女福利网站 | 久久国产精品视频 | 中文字幕亚洲欧美 | 网黄在线 | 国产色婷婷久久99精品91 | 亚洲免费视频在线观看 | 一区二区av| 欧美h视频 | 在线观看国产视频 | 久草视频观看 | 国产精品国产精品国产专区不卡 | 日本中文字幕在线视频 | 国产免费一区二区 | 女人av | 亚洲精品一区二区三区在线 | 国产精品毛片一区二区三区 | 五月婷婷视频 | 日本精品国产 | 毛片在线视频 |