久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
請(qǐng)教:?jiǎn)纹瑱C(jī)讀ps/2鼠標(biāo)為什么數(shù)據(jù)是錯(cuò)誤的?
[打印本頁(yè)]
作者:
qixiaorui
時(shí)間:
2015-12-12 15:52
標(biāo)題:
請(qǐng)教:?jiǎn)纹瑱C(jī)讀ps/2鼠標(biāo)為什么數(shù)據(jù)是錯(cuò)誤的?
本人新手,使用郭天祥老師的51單片機(jī)學(xué)習(xí)版,GTX TX-1C。想用單片機(jī)讀取ps/2鼠標(biāo)的移動(dòng)信息,但是讀的數(shù)據(jù)是錯(cuò)誤的。
哪位老師能幫忙看一下錯(cuò)在哪里?謝謝。
代碼如下:
主程序:
/**
* 單片機(jī)接PS2口鼠標(biāo),獲取鼠標(biāo)移動(dòng)數(shù)據(jù)和單擊事件
* 并在LCD1602上顯示
*/
#include <reg52.h>
#include <MOUSE.H>
#include <LCD1602_4.H>
#include <DELAY52.H>
#include <SHUMA.H>
sbit beep=P2^3; // 單擊出現(xiàn)時(shí)發(fā)出聲響
sbit test=P3^0;
void init();
void Mouse_start();
/**
* 主程序循環(huán)檢測(cè)鼠標(biāo)位置和按鍵
* 并將相關(guān)信息寫(xiě)入到LCD1602中
*/
void main(){
uchar i=0;
init();
Mouse_start();
// 初始化數(shù)據(jù)指針和接收緩沖區(qū)
mouse_pBuffer=0;
mouse_pData=0;
for(i=0;i<4;i++)
mouse_data[i]=0x74;
for(i=0;i<11;i++)
mouse_buffer[i]=0;
while(1){
// 顯示鼠標(biāo)當(dāng)前位置
CLEARSCREEN;
LCD1602_write_string(0,0,"x:");
LCD1602_write_int(0,2,move_x);
LCD1602_write_string(0,8,"y:");
LCD1602_write_int(0,10,move_y);
// 顯示按鍵狀態(tài)
if(mouse_data[0]&0x01){ // 點(diǎn)下左鍵
//beep=0;
LCD1602_write_string(1,0,"left");
}else if(mouse_data[0]&0x02){ // 點(diǎn)下右鍵
//beep=0;
LCD1602_write_string(1,0,"right");
}else if(mouse_data[0]&0x04){ // 點(diǎn)下中鍵
//beep=0;
LCD1602_write_string(1,0,"middle");
}else {
beep=1;
LCD1602_write_string(1,0,"nothing");
}
delayxms(50);
}
}
/**
* 初始化各元器件
*/
void init(){
LED_init(); // 初始化LED
SHUMA_init(); // 初始化數(shù)碼管
LCD1602_init(); // 初始化液晶1602
Mouse_init(); // 初始化鼠標(biāo)
COM_init(); // 串口初始化
}
/**
* 設(shè)置鼠標(biāo)進(jìn)入流模式
*/
void Mouse_start(){
LCD1602_write_string(1,0,"start mouse....");
host_to_mouse(0xf4); // 設(shè)置鼠標(biāo)使能,開(kāi)始工作
EX1=0;
delayxms(5000);
EX1=1;
}
復(fù)制代碼
與鼠標(biāo)有關(guān)的頭文件MOUSE.H
#ifndef MOUSE_H
#define MOUSE_H
// 晶振在11.0592MHZ下
#include "DELAY52.H"
#include "LCD1602_4.H"
#include "LED.H"
#include "COM.H"
#define delay10{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define delay100{delay10;delay10;delay10;delay10;delay10;delay10;delay10;delay10;delay10;delay10;}
sbit mouse_SDA=P3^6; // 數(shù)據(jù)線
sbit mouse_CLK=P3^3; // 時(shí)鐘線,外部中斷1輸入端口,低電平或下降沿觸發(fā)
bit pp=0; // 奇偶校驗(yàn)位
bit ACK=0; // 響應(yīng)
uchar flag=0; // 標(biāo)志位,鼠標(biāo)初始化成功,開(kāi)始發(fā)送數(shù)據(jù)則置1
uchar bdata mouse_byte; // 接收到的字節(jié),bdata為可尋址的片內(nèi)RAM
sbit mouse_byte_bit0=mouse_byte^0;
sbit mouse_byte_bit1=mouse_byte^1;
sbit mouse_byte_bit2=mouse_byte^2;
sbit mouse_byte_bit3=mouse_byte^3;
sbit mouse_byte_bit4=mouse_byte^4;
sbit mouse_byte_bit5=mouse_byte^5;
sbit mouse_byte_bit6=mouse_byte^6;
sbit mouse_byte_bit7=mouse_byte^7;
uchar bdata mouse_function; // 功能信息字節(jié)
uchar mouse_buffer[11]; // 接收位數(shù)據(jù)緩沖區(qū)
uchar mouse_pBuffer=0; // 接收位數(shù)據(jù)緩沖區(qū)的指針
uchar mouse_data[4]; // 接收鼠標(biāo)數(shù)據(jù)緩沖區(qū),分別存放:功能信息字節(jié),x位偏移量,y位偏移量
uchar mouse_pData=0; // 鼠標(biāo)數(shù)據(jù)緩沖區(qū)的指針
uint move_x=10000;
uint move_y=10000;
uint move_z=0;
void Mouse_start();
void host_to_mouse(uchar cmd);
void Mouse_init(){
mouse_pData=0;
mouse_pBuffer=0;
EA=1; // 開(kāi)放中斷
EX1=1; // 允許外部中斷1
PX1=1; // 設(shè)置外部中斷1為最高優(yōu)先級(jí)
}
/**
* 主機(jī)發(fā)送數(shù)據(jù)
* 因?yàn)橹鳈C(jī)不產(chǎn)生通信時(shí)鐘,所以主機(jī)要發(fā)送數(shù)據(jù),
* 必須控制鼠標(biāo)產(chǎn)生時(shí)鐘信號(hào)
*/
void host_to_mouse(uchar cmd){
uchar i;
EX1=0; // 主設(shè)備向從設(shè)備發(fā)送命令時(shí),關(guān)閉外部中斷
// 計(jì)算奇偶校驗(yàn)位
ACC=cmd;
//P為奇偶標(biāo)志位,反映累加器ACC內(nèi)容的奇偶性
//如果ACC中的運(yùn)算結(jié)果有偶數(shù)個(gè)1,則P為0,否則為1
//使用pp對(duì)P求反的目的是最終使用奇校驗(yàn)
mouse_CLK=0; // 主機(jī)下拉時(shí)鐘線,至少100μs以抑制鼠標(biāo)的通信
delayus(200);
mouse_SDA=0; // 然后下拉數(shù)據(jù)線,等于起始位
delayus(40);
mouse_CLK=1; // 并釋放時(shí)鐘線,鼠標(biāo)檢測(cè)到該序列后會(huì)在10ms內(nèi)產(chǎn)生時(shí)鐘信號(hào)
// 鼠標(biāo)產(chǎn)生時(shí)鐘后,主機(jī)即可向鼠標(biāo)通過(guò)數(shù)據(jù)線發(fā)送指定的數(shù)據(jù)cmd
for(i=0;i<=7;i++){
while(mouse_CLK==1); // 等待低,準(zhǔn)備數(shù)據(jù)
mouse_SDA=(cmd>>i)&0x01;
while(mouse_CLK==0); // 等待高,發(fā)送數(shù)據(jù)
}
while(mouse_CLK==1);
mouse_SDA=~P; // 發(fā)送奇偶校驗(yàn)位
while(mouse_CLK==0);
while(mouse_CLK==1);
mouse_SDA=1; // 發(fā)送停止位
while(mouse_CLK==0);
while(mouse_CLK==1);
//ACK=mouse_SDA; // 接收應(yīng)答位,此時(shí)時(shí)鐘處于低
while(mouse_CLK==0);
EX1=1;
}
/**
* 奇校驗(yàn),正確返回1,否則返回0
*/
uchar Checkout(){
ACC=mouse_byte;
if(~P==mouse_buffer[9])
return 1;
else
return 0;
}
/**
* 分析收到的數(shù)據(jù)
*/
void data_analyse(){
// 將收到的11位信號(hào)中截取8位數(shù)據(jù)存放到mouse_byte字節(jié)中
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];
// 如果校驗(yàn)位正確,則更新新的值,否則原位置不發(fā)生變化
if(Checkout()){
if(mouse_pData<3){
mouse_data[mouse_pData++]=mouse_byte;
}
if(mouse_pData==3){ // 3個(gè)字節(jié)數(shù)據(jù)已經(jīng)收齊
// 向串口發(fā)送收到的三個(gè)字節(jié)
COM_send_hex(mouse_data[0]);
COM_send_hex(mouse_data[1]);
COM_send_hex(mouse_data[2]);
COM_send_char(0x0d);
COM_send_char(0x0a);
mouse_pData=0;
if(mouse_data[0]&0x10){ // 如果"X sign bit"為1,表示鼠標(biāo)向左移
move_x-=(256-mouse_data[1]); // x坐標(biāo)減,值為二進(jìn)制補(bǔ)碼
}else{
move_x+=mouse_data[1];
}
if(mouse_data[0]&0x20){ // 如果"y sign bit"為1,表示鼠標(biāo)向上移
move_y-=(256-mouse_data[2]); // y坐標(biāo)減,值為二進(jìn)制補(bǔ)碼
}else{
move_y+=mouse_data[2];
}
}
}
}
/**
* 外部中斷1,下降沿觸發(fā),觸發(fā)后直接可以讀取數(shù)據(jù)。大約每40us中斷一次
*/
void ReceiveData(void) interrupt 2{
if(mouse_pBuffer<=10){ // 收到11位數(shù)據(jù)
LED_light(1,1);
while(mouse_CLK==1);
mouse_buffer[mouse_pBuffer++]=mouse_SDA; // 接收數(shù)據(jù)
}
if(mouse_pBuffer==10){ // 當(dāng)mouse_pBuffer讀到第9位的時(shí)候,就開(kāi)始分析數(shù)據(jù)
LED_light(1,0);
mouse_pBuffer=0; // 重置偏移值
data_analyse(); // 數(shù)據(jù)分析
}
}
#endif
復(fù)制代碼
謝謝,等回復(fù)。
作者:
qixiaorui
時(shí)間:
2015-12-12 22:39
上位機(jī)顯示從鼠標(biāo)獲取到的數(shù)據(jù)亂七八糟,根本沒(méi)有規(guī)律,不知道怎么回事了,請(qǐng)教....
單片機(jī).jpg
(75.84 KB, 下載次數(shù): 117)
下載附件
2015-12-12 22:39 上傳
作者:
08fuyoucai12
時(shí)間:
2015-12-19 05:54
學(xué)習(xí)一下,期待大神來(lái)解答。
作者:
永遠(yuǎn)的王同學(xué)
時(shí)間:
2015-12-21 23:25
樓主用的哪款芯片?和線纜的長(zhǎng)度等等是否有關(guān)?做ISP下載線時(shí)被線纜的問(wèn)題困擾了好久。再檢查檢查插口定義,祝你成功。
真心希望能夠幫到你。
作者:
jiakuo25
時(shí)間:
2017-3-27 17:32
這數(shù)據(jù)應(yīng)該是對(duì)的,
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲免费观看视频网站
|
激情五月婷婷综合
|
亚洲视频免费在线观看
|
在线观看一区
|
欧美中文字幕在线
|
国产高清av免费观看
|
欧美freesex黑人又粗又大
|
精品欧美在线观看
|
性高湖久久久久久久久3小时
|
www.一级毛片
|
日韩av网址在线观看
|
免费看啪啪网站
|
欧美激情一区二区三区
|
国产在线观看一区二区
|
国产高清在线观看
|
亚洲一区二区在线播放
|
亚洲成人午夜在线
|
午夜小视频在线观看
|
伊人久久精品
|
99久久久久久久久
|
国产在线一区二区
|
亚洲精品一区二区三区在线
|
中文字幕亚洲精品
|
免费在线一区二区
|
午夜精品一区二区三区在线
|
亚洲视频在线播放
|
91精品麻豆日日躁夜夜躁
|
成人国产在线观看
|
日韩有码一区二区三区
|
亚洲美女网站
|
www久久久
|
国产成人一区二区三区
|
中文字幕一区二区三区四区
|
性一交一乱一伦视频免费观看
|
久久久美女
|
亚洲免费毛片
|
国产精品乱码一区二区三区
|
精品二区视频
|
成人在线视频观看
|
国产欧美日韩视频
|
国产三级一区二区三区
|