久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
stc89單片機(jī)模擬鼠標(biāo)單擊的程序問題
[打印本頁]
作者:
loveps2
時間:
2017-11-1 10:55
標(biāo)題:
stc89單片機(jī)模擬鼠標(biāo)單擊的程序問題
因?yàn)槭菃纹瑱C(jī)新手,在網(wǎng)上找了一段程序,是基于stc12系列的,在網(wǎng)上查了一下,修改了延時函數(shù)和端口定義,還是沒有辦法讓電腦識別,現(xiàn)在貼出原程序,請大神指點(diǎn)一下,感激不盡。搗鼓了兩天了,因?yàn)閷φ{(diào)試也不太懂,不知道怎么交互,每次改了后下載、插上電腦實(shí)驗(yàn)
/************************************************************/
/*文件名稱:單片機(jī)模擬PS/2鼠標(biāo)程序 */
/*作 者:蔣毅 */
/*版 本:2008-6 */
/*說 明: */
/*修改記錄: */
/************************************************************/
#include <stc12c5412ad.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************常用命令及參數(shù)定義************************/
//EEPROM
#define isp_read 1
#define isp_program 2
#define isp_erase 3
#define isp_con 0x80
#define ADDRESSH 0X10
#define ADDRESSL 0X00
//HOST-->MOUSE
#define DISABLE_SEND 0XF5 //disable data reprorting
#define ENABLE_SEND 0XF4 //enable data reprorting
#define RESET 0XFF //reset
#define GETID 0XF2 //get device id
#define SATATUS_REQUEST 0XE9 //datatus request
#define HMRESEND 0XFE //host ask mouse resend
#define ERROR 0X55 //receive eeror
//MOUSE-->HOST
#define ANSWERER 0XFA //answerer
#define ID 0X00 //device id
#define BAT 0XAA //bat
#define RESEND 0XFE //resend
#define SATATUS3 0X02 //satatus3
#define SATATUS4 0X64 //satatus4
#define DATABAG 0x08;
/***********************引腳定義*****************************/
sbit mouse_clk=P1^0;
sbit mouse_data=P1^1;
sbit ms1=P1^5;
sbit ms2=P1^6;
sbit ctls=P3^4;
/***********************全局變量*****************************/
uchar flag_send=0;//允許發(fā)送標(biāo)志位
uchar buffer=0;//命令緩沖單元
/***********************函數(shù)聲明*****************************/
extern void delay1us(uchar i);
//*********************讀EEPROM一字節(jié)************************/
uchar read_byte_eeprom(uchar addth,addtl)
{
uchar temp_data;
ISP_ADDRH=addth;
ISP_ADDRL=addtl;
EA=0;
ISP_CONTR=isp_con;
ISP_CMD=isp_read;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
temp_data=ISP_DATA;
EA=1;
return temp_data;
}
//*********************寫EEPROM一字節(jié)***********************/
void program_byte_eeprom(uchar temp_data, addth,addtl)
{
ISP_DATA=temp_data;
ISP_ADDRH=addth;
ISP_ADDRL=addtl;
EA=0;
ISP_CONTR=isp_con;
ISP_CMD=isp_program;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
EA=1;
}
//********************擦除EEPROM一扇區(qū)子函數(shù)*****************/
void erase_sector_eeprom(uchar addth,addtl)
{
ISP_ADDRH=addth;
ISP_ADDRL=addtl;
EA=0;
ISP_CONTR=isp_con;
ISP_CMD=isp_erase;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
EA=1;
}
/*******************ms級延時子函數(shù)***************************/
void delay(uint k)
{
uint i;
while(k--)
{
for(i=0;i<1200;i++);
}
}
/****************ps/2發(fā)送單個位到PC函數(shù)**********************/
void send_bit(bit senbit)
{
mouse_data=senbit; //設(shè)置/復(fù)位數(shù)據(jù)
delay1us(21); //延遲20us
mouse_clk=0; //將時鐘拉低
delay1us(43); //延遲40us
mouse_clk=1; //釋放時鐘
}
/***************ps/2發(fā)送單個字節(jié)到PC函數(shù)*********************/
void send_byte(uchar tmp)
{
uchar i;
uchar temp,check;
temp=0;
check=0;
while(!mouse_clk);//等待CLK為高
delay1us(54);//延時50us
if(mouse_clk)//判斷CLK是否為高,是:發(fā)送,否:放棄,轉(zhuǎn)到接收程序
{
delay1us(21);//延時20us
for(i=0;i<11;i++)
{
delay1us(21);//延時20us
if(i==0) send_bit(0);//發(fā)送起始位0
else
{
if(i>=1&&i<9)//發(fā)送數(shù)據(jù)位
{
temp=tmp;
temp>>=(i-1);
temp=temp&0x01;
if(temp==0x01){send_bit(1);check++;}
else send_bit(0);
}
else
{
if(i==9)//發(fā)送校驗(yàn)位
{
check=check&0x01;
if(check==0x01) send_bit(0);//奇校驗(yàn)
else send_bit(1);
}
else send_bit(1);//發(fā)送停止位
}
}
if(mouse_clk==1) continue;//判斷時鐘是否被主機(jī)拉低,是-放棄發(fā)送
else break;
}
delay1us(32);//延時30us
}
}
/********************ps/2接收PC單個位函數(shù)********************/
bit receive_bit()
{
bit tbit;
tbit=0;
delay1us(21); //延遲20us
mouse_clk=0; //把時鐘線拉低
delay1us(43); //延遲40us
mouse_clk=1; //釋放時鐘
delay1us(21); //延遲20us
tbit=mouse_data; //讀取數(shù)據(jù)
return tbit; //返回數(shù)據(jù)
}
/**********************ps/2輸出應(yīng)答位函數(shù)********************/
void send_answerer()
{
delay1us(16);//延遲15us
mouse_data=0;//把數(shù)據(jù)線拉低
delay1us(5); //延遲5us
mouse_clk=0; //把時鐘線拉低
delay1us(43);//延遲40us
mouse_clk=1; //釋放時鐘線
delay1us(5); //延遲5us
mouse_data=1;//釋放數(shù)據(jù)線
}
/*******************ps/2接收PC單個字節(jié)函數(shù)*******************/
uchar receive_byte()
{
uchar i,temp,rdata,check;
bit tmp,check_bit;
tmp=0;
check_bit=0;
temp=0;
rdata=0;
check=0;
while(!mouse_clk);//等待時鐘為高
if(!mouse_data)//判斷數(shù)據(jù)線為低,是-接收,否-有錯誤發(fā)生,放棄
{
for(i=0;i<10;i++)//接收8個數(shù)據(jù)位,校驗(yàn)位,停止位
{
if(i>=0&&i<8)//讀入8個數(shù)據(jù)位
{
tmp=receive_bit();
if(tmp==1) check++;
temp=(uchar)tmp;
temp<<=i;
rdata=rdata|temp;
}
else if(i==8)//讀入校驗(yàn)位
check_bit=receive_bit();
else //讀入停止位
tmp=receive_bit();
if(mouse_clk==1) continue;//判斷時鐘是否被主機(jī)拉低,是-放棄接收
else return 0x55;
}
/*判斷停止位是否為1,否,產(chǎn)生一錯誤標(biāo)志*/
if(!mouse_data) //否
{
while(!mouse_data);
return 0x55;
}
else //停止位為1
{
send_answerer();//輸出應(yīng)答位
check=(check+(uchar)check_bit)&0x01;
if(check==0)//檢查校驗(yàn)位
return 0x55;//校驗(yàn)錯誤
else return rdata;//返回收到的命令
}
}
else return 0x55;
}
/***********************鍵盤掃描函數(shù)*************************/
void keyscan()
{
uchar i,databag;
uchar scancode,tmp;
tmp=0x01;
scancode=0;
databag=0;
if(flag_send)//判斷是否允許數(shù)據(jù)報告
{
if((P1&0x1c)!=0x1c)//判斷是否有鍵按下
{
delay(20);//延時消抖
if((P1&0x1c)!=0x1c)
{
ctls=0;//打開激光頭
scancode=0x04;//逐鍵掃描
for(i=0;i<3;i++)
{
if((P1&scancode)!=scancode)//有鍵按下,置相應(yīng)標(biāo)志位為1
{
tmp<<=i;
databag=databag|tmp;
scancode<<=1;
}
else scancode<<=1;
}
delay(50);//延時50ms
send_byte(databag);
send_byte(ID);// 發(fā)送位移按鍵數(shù)據(jù)包
send_byte(ID);
databag=DATABAG;
if(ms1==1&&ms2==1)//持續(xù)按常亮無效
{
ctls=1;//關(guān)閉激光頭
while((P1&0x1c)!=0x1c)//判鍵盤釋放
WDT_CONTR=0X3E;//喂狗
send_byte(databag);// 發(fā)送位移按鍵數(shù)據(jù)包
send_byte(ID);
send_byte(ID);
}
else if(ms1==0&&ms2==1)//持續(xù)按常亮有效
{
while((P1&0x1c)!=0x1c)//判鍵盤釋放
WDT_CONTR=0X3E;//喂狗
ctls=1;//關(guān)閉激光頭
send_byte(databag);// 發(fā)送位移按鍵數(shù)據(jù)包
send_byte(ID);
send_byte(ID);
}
else//常亮
{
while((P1&0x1c)!=0x1c)//判鍵盤釋放
WDT_CONTR=0X3E;//喂狗
send_byte(databag);// 發(fā)送位移按鍵數(shù)據(jù)包
send_byte(ID);
send_byte(ID);
}
}
}
}
}
/***********************處理主機(jī)命令函數(shù)*********************/
void manage(uchar ljmp)
{
switch(ljmp)
{
case RESET: //主機(jī)通知MOUSE復(fù)位
send_byte(ANSWERER);
send_byte(BAT);
send_byte(ID);
buffer=ID;
break;
case GETID: //主機(jī)通知MOUSE獲得ID
send_byte(ANSWERER);
send_byte(ID);
buffer=ID;
break;
case ENABLE_SEND : //使能數(shù)據(jù)報告
send_byte(ANSWERER);
buffer=ANSWERER;
flag_send=1;
erase_sector_eeprom(ADDRESSH,ADDRESSL);
program_byte_eeprom(0X01,ADDRESSH,ADDRESSL);
break;
case DISABLE_SEND :
send_byte(ANSWERER);//禁止數(shù)據(jù)報告
buffer=ANSWERER;
flag_send=0;
erase_sector_eeprom(ADDRESSH,ADDRESSL);
break;
case SATATUS_REQUEST://主機(jī)通知MOUSE告訴狀態(tài)信息
send_byte(ANSWERER);
send_byte(ID);
send_byte(SATATUS3);
send_byte(SATATUS4);
buffer=SATATUS4;
break;
case ERROR: //MOUSE接收錯誤,通知主機(jī)重發(fā)
send_byte(RESEND);
buffer=RESEND;
break;
default: //其它命令,都用0XFA回應(yīng)
send_byte(ANSWERER);
buffer=ANSWERER;
break;
}
}
/*************************主函數(shù)*****************************/
void main()
{
uchar order;
delay(500);//延時500ms
send_byte(BAT);
send_byte(ID);
flag_send=read_byte_eeprom(ADDRESSH,ADDRESSL);
WDT_CONTR=0X3E;//看門狗初始化
while(1)
{
keyscan();
if(!mouse_data)
{
order=receive_byte();
manage(order);
}
WDT_CONTR=0X3E;//喂狗
}
}
作者:
loveps2
時間:
2017-11-2 10:17
怎么調(diào)試交互,自己頂一下,希望有人指點(diǎn)。貼出來我改過的代碼。
/************************************************************/
/*文件名稱:單片機(jī)模擬PS/2鼠標(biāo)程序 */
/*作 者:蔣毅 */
/*版 本:2008-6 */
/*說 明: */
/*修改記錄: */
/************************************************************/
#include <STC12C5410AD.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************常用命令及參數(shù)定義************************/
//EEPROM
#define isp_read 1
#define isp_program 2
#define isp_erase 3
#define isp_con 0x80
#define ADDRESSH 0X10
#define ADDRESSL 0X00
//HOST-->MOUSE
#define DISABLE_SEND 0XF5 //disable data reprorting
#define ENABLE_SEND 0XF4 //enable data reprorting
#define RESET 0XFF //reset
#define GETID 0XF2 //get device id
#define SATATUS_REQUEST 0XE9 //datatus request
#define HMRESEND 0XFE //host ask mouse resend
#define ERROR 0X55 //receive eeror
//MOUSE-->HOST
#define ANSWERER 0XFA //answerer
#define ID 0X00 //device id
#define BAT 0XAA //bat
#define RESEND 0XFE //resend
#define SATATUS3 0X02 //satatus3
#define SATATUS4 0X64 //satatus4
#define LBUTTONDOWN 0X09 //left button down
#define LBUTTONUP 0X08 //left button up
#define DATABAG 0x08;
/***********************引腳定義*****************************/
sbit mouse_clk=P3^3;
sbit mouse_data=P3^5;
sbit ms1=P1^0;
//sbit ms2=P1^6;
//sbit ctls=P3^4;
/***********************全局變量*****************************/
uchar flag_send=0;//允許發(fā)送標(biāo)志位
uchar buffer=0;//命令緩沖單元
/***********************函數(shù)聲明*****************************/
void delay10us(void) //誤差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=1;a>0;a--);
}
void delay5us(void) //誤差 0us
{
_nop_(); //if Keil,require use intrins.h
}
void delay20us(void) //誤差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=1;a>0;a--);
}
void delay50us(void) //誤差 0us
{
unsigned char a,b;
for(b=9;b>0;b--)
for(a=1;a>0;a--);
}
//*********************讀EEPROM一字節(jié)************************/
uchar read_byte_eeprom(uchar addth,addtl)
{
uchar temp_data;
ISP_ADDRH=addth;
ISP_ADDRL=addtl;
EA=0;
ISP_CONTR=isp_con;
ISP_CMD=isp_read;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
temp_data=ISP_DATA;
EA=1;
return temp_data;
}
//*********************寫EEPROM一字節(jié)***********************/
void program_byte_eeprom(uchar temp_data, addth,addtl)
{
ISP_DATA=temp_data;
ISP_ADDRH=addth;
ISP_ADDRL=addtl;
EA=0;
ISP_CONTR=isp_con;
ISP_CMD=isp_program;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
EA=1;
}
//********************擦除EEPROM一扇區(qū)子函數(shù)*****************/
void erase_sector_eeprom(uchar addth,addtl)
{
ISP_ADDRH=addth;
ISP_ADDRL=addtl;
EA=0;
ISP_CONTR=isp_con;
ISP_CMD=isp_erase;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
EA=1;
}
/*******************ms級延時子函數(shù)***************************/
void delay50ms(void) //誤差 0us
{
unsigned char a,b;
for(b=165;b>0;b--)
for(a=150;a>0;a--);
}
void delay20ms(void) //誤差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
}
void delay500ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=205;c>0;c--)
for(b=116;b>0;b--)
for(a=9;a>0;a--);
}
/****************ps/2發(fā)送單個位到PC函數(shù)**********************/
void send_bit(bit senbit)
{
mouse_data=senbit; //設(shè)置/復(fù)位數(shù)據(jù)
delay20us(); //延遲20us
mouse_clk=0; //將時鐘拉低
delay20us();
delay20us(); //延遲40us
mouse_clk=1; //釋放時鐘
}
/***************ps/2發(fā)送單個字節(jié)到PC函數(shù)*********************/
void send_byte(uchar tmp)
{
uchar i;
uchar temp,check;
temp=0;
check=0;
while(!mouse_clk);//等待CLK為高
delay50us();//延時50us
if(mouse_clk)//判斷CLK是否為高,是:發(fā)送,否:放棄,轉(zhuǎn)到接收程序
{
delay20us();//延時20us
for(i=0;i<11;i++)
{
delay20us();//延時20us
if(i==0) send_bit(0);//發(fā)送起始位0
else
{
if(i>=1&&i<9)//發(fā)送數(shù)據(jù)位
{
temp=tmp;
temp>>=(i-1);
temp=temp&0x01;
if(temp==0x01){send_bit(1);check++;}
else send_bit(0);
}
else
{
if(i==9)//發(fā)送校驗(yàn)位
{
check=check&0x01;
if(check==0x01) send_bit(0);//奇校驗(yàn)
else send_bit(1);
}
else send_bit(1);//發(fā)送停止位
}
}
if(mouse_clk==1) continue;//判斷時鐘是否被主機(jī)拉低,是-放棄發(fā)送
else break;
}
delay20us();
delay10us();//延時30us
}
}
/********************ps/2接收PC單個位函數(shù)********************/
bit receive_bit()
{
bit tbit;
tbit=0;
delay20us(); //延遲20us
mouse_clk=0; //把時鐘線拉低
delay20us();
delay20us(); //延遲40us
mouse_clk=1; //釋放時鐘
delay20us(); //延遲20us
tbit=mouse_data; //讀取數(shù)據(jù)
return tbit; //返回數(shù)據(jù)
}
/**********************ps/2輸出應(yīng)答位函數(shù)********************/
void send_answerer()
{
delay10us();
delay5us();//延遲15us
mouse_data=0;//把數(shù)據(jù)線拉低
delay5us(); //延遲5us
mouse_clk=0; //把時鐘線拉低
delay20us();
delay20us();//延遲40us
mouse_clk=1; //釋放時鐘線
delay5us(); //延遲5us
mouse_data=1;//釋放數(shù)據(jù)線
}
/*******************ps/2接收PC單個字節(jié)函數(shù)*******************/
uchar receive_byte()
{
uchar i,temp,rdata,check;
bit tmp,check_bit;
tmp=0;
check_bit=0;
temp=0;
rdata=0;
check=0;
while(!mouse_clk);//等待時鐘為高
if(!mouse_data)//判斷數(shù)據(jù)線為低,是-接收,否-有錯誤發(fā)生,放棄
{
for(i=0;i<10;i++)//接收8個數(shù)據(jù)位,校驗(yàn)位,停止位
{
if(i>=0&&i<8)//讀入8個數(shù)據(jù)位
{
tmp=receive_bit();
if(tmp==1) check++;
temp=(uchar)tmp;
temp<<=i;
rdata=rdata|temp;
}
else if(i==8)//讀入校驗(yàn)位
check_bit=receive_bit();
else //讀入停止位
tmp=receive_bit();
if(mouse_clk==1) continue;//判斷時鐘是否被主機(jī)拉低,是-放棄接收
else return 0x55;
}
/*判斷停止位是否為1,否,產(chǎn)生一錯誤標(biāo)志*/
if(!mouse_data) //否
{
while(!mouse_data);
return 0x55;
}
else //停止位為1
{
send_answerer();//輸出應(yīng)答位
check=(check+(uchar)check_bit)&0x01;
if(check==0)//檢查校驗(yàn)位
return 0x55;//校驗(yàn)錯誤
else return rdata;//返回收到的命令
}
}
else return 0x55;
}
/***********************鍵盤掃描函數(shù)*************************/
void keyscan()
{
// uchar i;
if(flag_send)//判斷是否允許數(shù)據(jù)報告
{
if(ms1==0)//判斷是否有鍵按下
{
delay20ms();//延時消抖
if(ms1==0)
{
delay50ms();//延時50ms
send_byte(LBUTTONDOWN);
send_byte(ID);// 發(fā)送位移按鍵數(shù)據(jù)包
send_byte(ID);
}
}
else
{
delay20ms();//延時消抖
if(ms1==1)
{
delay50ms();//延時50ms
send_byte(LBUTTONUP);
send_byte(ID);// 發(fā)送位移按鍵數(shù)據(jù)包
send_byte(ID);
}
}
}
}
/***********************處理主機(jī)命令函數(shù)*********************/
void manage(uchar ljmp)
{
switch(ljmp)
{
case RESET: //主機(jī)通知MOUSE復(fù)位
send_byte(ANSWERER);
send_byte(BAT);
send_byte(ID);
buffer=ID;
break;
case GETID: //主機(jī)通知MOUSE獲得ID
send_byte(ANSWERER);
send_byte(ID);
buffer=ID;
break;
case ENABLE_SEND : //使能數(shù)據(jù)報告
send_byte(ANSWERER);
buffer=ANSWERER;
flag_send=1;
erase_sector_eeprom(ADDRESSH,ADDRESSL);
program_byte_eeprom(0X01,ADDRESSH,ADDRESSL);
break;
case DISABLE_SEND :
send_byte(ANSWERER);//禁止數(shù)據(jù)報告
buffer=ANSWERER;
flag_send=0;
erase_sector_eeprom(ADDRESSH,ADDRESSL);
break;
case SATATUS_REQUEST://主機(jī)通知MOUSE告訴狀態(tài)信息
send_byte(ANSWERER);
send_byte(ID);
send_byte(SATATUS3);
send_byte(SATATUS4);
buffer=SATATUS4;
break;
case ERROR: //MOUSE接收錯誤,通知主機(jī)重發(fā)
send_byte(RESEND);
buffer=RESEND;
break;
default: //其它命令,都用0XFA回應(yīng)
send_byte(ANSWERER);
buffer=ANSWERER;
break;
}
}
/*************************主函數(shù)*****************************/
void main()
{
uchar order;
delay500ms();//延時500ms
send_byte(BAT);
send_byte(ID);
flag_send=read_byte_eeprom(ADDRESSH,ADDRESSL);
WDT_CONTR=0X3E;//看門狗初始化
while(1)
{
keyscan();
if(!mouse_data)
{
order=receive_byte();
manage(order);
}
WDT_CONTR=0X3E;//喂狗
}
}
作者:
loveps2
時間:
2017-11-2 16:18
我在處理收到數(shù)據(jù)的地方加了一句將p13端口置為低電平,重新加電量了一下是低電平,說明ps鼠標(biāo)連接電腦成功了,可是按鍵按下沒有任何反應(yīng),求指教啊。
作者:
6726234500
時間:
2019-7-16 11:10
好了嗎
作者:
6726234500
時間:
2019-7-16 16:02
解決了嗎
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品九九久久
|
夜夜艹
|
天天拍夜夜爽
|
精品亚洲一区二区三区四区五区
|
精品视频在线观看
|
99pao成人国产永久免费视频
|
激情五月激情综合网
|
欧美日本一区
|
久久99精品久久久久久国产越南
|
午夜视频精品
|
97福利在线
|
久久精品国产99国产精品
|
在线电影日韩
|
国产精品久久久久无码av
|
久久九
|
久久91精品久久久久久9鸭
|
国产欧美精品一区二区
|
青青操av
|
伊人亚洲
|
а_天堂中文最新版地址
|
亚洲一区国产精品
|
亚洲午夜精品视频
|
亚洲成人免费在线观看
|
国产精品视频一区二区三区四区国
|
91精品国产91久久久久游泳池
|
成人免费淫片aa视频免费
|
日韩一区二区av
|
一级片av
|
欧区一欧区二欧区三免费
|
日韩高清不卡
|
91av视频在线观看
|
久久久国产精品
|
免费av毛片
|
久久99深爱久久99精品
|
在线 丝袜 欧美 日韩 制服
|
黄色骚片
|
日韩欧美国产一区二区三区
|
91精品国产综合久久婷婷香蕉
|
欧美日韩久久精品
|
成年人在线观看
|
亚州精品天堂中文字幕
|