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

標題: 51單片機做PS/2鼠標電路設計 [打印本頁]

作者: 癡人說夢否    時間: 2018-5-7 20:50
標題: 51單片機做PS/2鼠標電路設計
我這個是使用數碼管顯示,直接貼程序吧用的是HC573驅動8位數碼管
前四數碼管顯示X坐標,后四位顯示Y坐標

實物測試有問題,個人感覺是程序問題,麻煩大家圍觀一下,糾糾錯




#include <reg52.h>
#include <intrins.h>
sbit mouse_sda = P2^0;  //鼠標數據線
sbit mouse_clk = P3^3;  //鼠標時鐘線
sbit led       = P1^3;  //按鍵LED指示
sbit beep      = P2^5;  //蜂鳴器指示
/*--------------------------------------------------------------*/
//數據定義
unsigned char n, m;   //循環變量
unsigned int  mouse_word; //接收字16bits
unsigned char mouse_data[3];//接收字節緩沖區
unsigned int  move_x;  //橫坐標
unsigned int  move_y;  //縱坐標
bit mouse_left;    //左鍵
bit mouse_right;   //右鍵
bit mouse_middle;   //中鍵
/*--------------------------------------------------------------*/
//函數聲明
void INT0_init(void);      //外部中斷INT0初始化
void delay120us(void);      //延時120us 函數定義
void mouse_write_dat(unsigned char dat); //發送數據
void mouse_read_dat(void);     //讀出數據
void mouse_data_process(void);    //數據處理
void mouse_init(void);      //鼠標初始化
/*--------------------------------------------------------------*/
//外部中斷INT0初始化
void INT0_init(void)
{   
EA  = 1;   //總中斷打開
EX1 = 1;   //外部中斷打開
PX1 = 1;   //中斷優先級
IT1 = 0;   //低電平觸發
}
/*--------------------------------------------------------------*/
//延時120us 函數定義
void delay120us(void)
{   
unsigned char i, j;   
for(i = 23; i > 0; i--)   
for(j = 1; j > 0; j--);
}
/*--------------------------------------------------------------*/
//發送數據
//發送11位數據:1START-8DATA-1PARITY-1STOP
//并接收一個應答位ack = 0
void mouse_write_dat(unsigned char dat)
{
unsigned char i; //循環變量
bit parity;   //奇校驗位
EX1 = 0;   //關閉外部中斷
ACC = dat;   //存入累加器A,得到P(為偶校驗)
parity = ~P;  //獲得奇校驗位
mouse_clk = 0;  //拉低時鐘線
delay120us();  //至少延時100us
mouse_sda = 0;  //發送起始位
mouse_clk = 1;  //釋放時鐘線
mouse_sda = 1;  //釋放數據線
for(i = 0; i < 8; i++)
{        
//至少要在25us內完成發送一位!!!  
while(!mouse_clk);   //等待設備把時鐘線拉高  
mouse_sda =(bit)(dat& 0x01);//先發送最低位  
dat >>= 1;     //下降沿寫入數據  
while(mouse_clk);   //等待設備把時鐘線拉低
}
while(!mouse_clk);    //等待設備把時鐘線拉高
mouse_sda = parity;    //發送奇校驗位
while(mouse_clk);    //等待設備把時鐘線拉低
while(!mouse_clk);    //等待設備把時鐘線拉高
mouse_sda = 1;     //發送停止位
while(mouse_clk);    //等待設備把時鐘線拉低
while(!mouse_clk);    //等待設備把時鐘線拉高
while(mouse_sda);    //等待接收應答位(總是為0)
while(mouse_clk);    //等待設備把時鐘線拉低
while(!mouse_clk);    //等待設備釋放時鐘線
while(!mouse_sda);    //等待設備釋放數據線
EX1 = 1;              //打開外部中斷INT0
}
/*--------------------------------------------------------------*/
//奇校驗
bit check_parity(void)
{
  ACC = mouse_data[m];
   if(~P == (bit)(mouse_word & 0x0200))
   return 1; //奇校驗成功則返回1
   else         
   return 0;                                      //奇校驗失敗則返回0
   }
/*--------------------------------------------------------------*/
//讀出3字節數據
void mouse_read_dat(void)
{
mouse_data[m] = (unsigned char)(mouse_word >> 1); //去掉最高兩位和最后一位
if(check_parity())         //奇校驗成功
{
   mouse_word = 0;         //清接收數據字  
   m++;
   if(m == 3) {mouse_data_process(); m = 0;} //讀出三字節數據
}
}
/*--------------------------------------------------------------*/
//數據處理
   void mouse_data_process(void)
   {                                       
        if                                                                           //水平移動
              (mouse_data[0] & 0x10)
                  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[0] & 0x01)
               mouse_left = 1;    //左鍵
     else  mouse_left = 0;
    if
             (mouse_data[0] & 0x02)
                      mouse_right = 1;    //右鍵
    else      mouse_right = 0;

   if(mouse_data[0] & 0x04)
           mouse_middle = 1;    //中鍵
     else  mouse_middle = 0;}
/*--------------------------------------------------------------*/
//外部中斷INT0服務
//接收11位數據:1START-8DATA-1PARITY-1STOP
void INT0_intservice(void) interrupt 2   
{
mouse_word >>= 1;       //先向右空移一位
if(mouse_sda) mouse_word |= 0x0400;   //先接收最低位
  n++;
  if(n == 11) {mouse_read_dat();
  n = 0;} //接收完成則讀出數據
}
/*--------------------------------------------------------------*/
//鼠標初始化
void mouse_init(void)
{
INT0_init();     //外部中斷INT0初始化
mouse_write_dat(0xf4);   //Enable Data Reporting
  while(mouse_data[0] != 0xfa); //等待鼠標應答
  mouse_data[0] = 0;    //清應答數據
  m = 0;       //重新定義接收數據指針
  }
  //--定義使用的IO--//
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//--定義全局變量--//
unsigned char code DIG_CODE[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//0、1、2、3、4、5、6、7、8、9的顯示碼
unsigned char disbuff[8]           ={0,0,0,0,0,0,0,0,};
/*******************************************************************************
* 函 數 名         : DigDisplay
* 函數功能                   : 使用數碼管顯示
*******************************************************************************/

void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<8;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
            case(4):
                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//顯示第7位       
                }

                 GPIO_DIG=disbuff[i];
                j=10;         //掃描間隔時間設定
                while(j--);       
                GPIO_DIG=0x00;//消隱
        }
}
   //********************************************************/
//void main ()
//unsigned int
        /********************************************************/

/********************************************************/
   void Conut(void)
        {          
        while(1)
                {       
          disbuff[7]=DIG_CODE[move_x%10000/1000];       
          disbuff[6]=DIG_CODE[move_x%1000/100];                 
      disbuff[5]=DIG_CODE[move_x%100/10];                  
          disbuff[4]=DIG_CODE[move_x%10/1];                         
          disbuff[3]=DIG_CODE[move_y%10000/1000];                          
          disbuff[2]=DIG_CODE[move_y%1000/100];                                  
          disbuff[1]=DIG_CODE[move_y%100/10];                                         
          disbuff[0]=DIG_CODE[move_y%10/1];                                               
     }
         }




作者: 癡人說夢否    時間: 2018-5-7 21:14
嗨呀,頂一下
作者: youngZ    時間: 2018-5-8 10:08
學習一下




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲成人一级片 | 精品av| 午夜精品久久 | 色爱区综合 | 久久久久无码国产精品一区 | 东京av男人的天堂 | 成人三级在线播放 | 国产精品欧美一区二区三区 | 韩日一区二区三区 | 国产欧美一区二区三区在线播放 | 天天干 夜夜操 | 涩涩操| 国产精品亚洲精品日韩已方 | 欧美精品国产精品 | 中文字幕亚洲国产 | 中文一区二区视频 | 成在线人视频免费视频 | 曰韩三级 | 亚洲欧洲一区 | 日皮视频免费 | 精品免费国产一区二区三区四区 | 免费观看黄色一级片 | 在线中文字幕第一页 | 亚洲视频一区 | 亚洲成人自拍网 | 国产精品一区二区在线免费观看 | 午夜视频在线播放 | 欧美区精品 | 亚洲精品在线视频 | 成人性生交大片 | 黄色小视频大全 | 玖玖玖在线| 国产精品久久久久久久久久 | 91久久久www播放日本观看 | 一本大道久久a久久精二百 欧洲一区二区三区 | 美女视频网站久久 | 国产乱码精品一区二区三区五月婷 | 拍拍无遮挡人做人爱视频免费观看 | 波多野结衣二区 | 亚洲欧美在线免费观看 | 欧美精品在欧美一区二区少妇 |