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

標題: 單片機鼠標驅動源程序 [打印本頁]

作者: 3lian    時間: 2014-2-26 18:26
標題: 單片機鼠標驅動源程序
//PS2鼠標驅動程序
//測試發送其他命令鼠標如何回復。比如0xff
#include <reg51.H>
sbit mouse_sda = P1^6; //鼠標數據線
sbit mouse_clk = P3^2; //鼠標時鐘線:單片機0號中斷
sbit led_jc    = P0^7; //LED檢測鼠標時鐘是否發生
sbit led_L     = P0^3;
//按鍵LED指示,鼠標左鍵
sbit led_R     = P0^4; //按鍵LED指示,鼠標右鍵
//數據定義
unsigned char n, m; //循環變量
unsigned int  mouse_word;mouse_wordbf=0; //接收字16bits,臨時變量用于接受11位的數據
unsigned char mouse_data[3]; //接收字節緩沖區,保存3字節的數據報告
bit mouse_left; //左鍵,
bit mouse_right;//右鍵,按鍵狀態變量
unsigned int  move_x;//橫坐標無符號整形2字節
unsigned int  move_y;//縱坐標
//函數聲明
void int0(void); //外部中斷INT0初始化
void delay100us(void); //延時100微妙 函數定義
void mouse_write_dat(unsigned char dat); //發送數據
void mouse_read_dat(void); //讀出數據
bit check_parity(void); //奇校驗
void ys (x);
void delay50ms(void);  //50毫秒延時
//外部中斷INT0初始化
void int0(void)  //初始化外部中斷p3.2狀態
{EA  = 1;       //總中斷
EX0 = 1; //外部中斷
PX0 = 1; //中斷優先級
IT0 = 0; //低電平觸發
}
void delay100us(void)//這里是亂寫的延時函數居然正確。
{unsigned char i, j;
for(i = 30; i > 0; i--)
for(j = 1; j > 0; j--);
}
void ys (x)//這是一條測試用的延時函數,可以延時幾秒鐘
{unsigned char ii, jj;
for(ii = x; ii > 0; ii--)
for(jj = 9000; jj > 0; jj--);
}
//外部中斷INT0服務
//接收完11位數據就開始處理
void INT0_intservice(void) interrupt 0  //安裝0號中斷
{EX0 = 0;
mouse_word >>= 1; //先向右空移一位
if(mouse_sda) mouse_word |= 0x0400;//先接收最低位00001000 00000000,
n++;
if(n == 11) {mouse_read_dat(); n = 0;}//接收完成則讀出數據
//檢led_jc=1; 測是否有時鐘信號
EX0 = 1;
}
//處理程序段
//讀出3字節數據,數據整理、奇校驗、和指揮拆分3字節數據
void mouse_read_dat(void)
{mouse_data[m] = (unsigned char)(mouse_word >> 1);//去掉
mouse_wordbf=mouse_word;
  mouse_word=0;
  if(check_parity()) //奇校驗成功
   {mouse_word = 0; //清接收數據字
    m++;
    if(m == 3) //數據處理,拆分數據包 注意拆分的是第一字節
     {move_x+=mouse_data[2];//獲得位移量
      move_y+=mouse_data[3];//獲得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;
      m = 0;
       }
    }
}
//奇校驗
bit check_parity(void)
{ACC=mouse_data[m];
if(~P == (bit)(mouse_wordbf & 0x0200)) return 1; //奇校驗成功則返回1
else           return 0; //奇校驗失敗則返回0
}
//發送數據
//發送11位數據:1START-8DATA-1PARITY-1STOP
//并接收一個應答位ack = 0
void mouse_write_dat(unsigned char dat)
{ unsigned char i; //循環變量
  bit parity; //奇校驗位
  EX0 = 0; //關閉外部中斷
  ACC = dat; //存入累加器A,得到P(為偶校驗)
  parity = ~P; //對P求反獲得奇校驗位
  mouse_clk = 0;//拉低時鐘線
  delay100us(); //至少延時100us
  mouse_sda = 0;//發送起始位
  mouse_clk = 1;//釋放時鐘線
for(i = 0; i < 8; i++)
{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_sda);  //等待接收應答位(總是為0)
while(mouse_clk);  //等待設備把時鐘線拉低
while(!mouse_clk); //等待設備釋放時鐘線,把時鐘拉高
while(!mouse_sda); //等待設備釋放數據線,把時鐘拉高
EX0 = 1;    //打開外部中斷INT0
}
void main(void)
{P0=0xff;//先把LED關了
mouse_clk = 1;  //拉高時鐘線
ys(100000);
int0();
mouse_write_dat(0xf4); //立馬發送鼠標使能命令過去
while(mouse_data[0] != 0xfa); //數據包的第一字節判斷鼠標是否應答,不然就一直停在這里
mouse_data[0] = 0;    //清應答數據
m = 0;
while(1)
{
//檢led_jc=0;//guandeng
led_L = mouse_left;//顯示數據包1的內容
led_R = mouse_right;
P0=mouse_x;//P0口直接顯示x位移量的值

}     
}






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产视频一区在线观看 | 午夜视频在线免费观看 | 欧美视频免费 | 少妇视频在线观看 | 日本三级久久 | 日日干日日操 | 亚洲伦理精品 | 亚洲一区中文 | 色羞羞 | 一区二区视频在线播放 | av噜噜噜| 午夜三级 | 美女91网站 | 亚洲不卡在线观看 | 中文字幕亚洲一区 | 国产www视频| 免费看黄色一级片 | 综合网av | 精品国产乱码久久久久久88av | 中文字幕超清在线观看 | 国产精品福利在线观看 | av超碰在线 | 久久久一级片 | 超碰在线免费 | 欧美日韩国产一区二区三区 | 91福利网| 欧美黄色免费网站 | 中文字幕有码在线 | 91禁蘑菇在线看 | 国产福利在线观看 | 亚洲精品系列 | 欧美黄色一区 | 黄色国产视频 | av在线成人 | 18视频在线观看 | 一级做a爱片性色毛片 | 欧美激情视频一区二区三区 | 国产精品国产三级国产aⅴ浪潮 | 日本三极片 | 岛国av噜噜噜久久久狠狠av | 香蕉视频免费看 |