PS2鼠标发送与接收程序
大家帮忙看看这个PS2鼠标接收与发送的程序我按照PS2协议来写的应该还有些问题望高手指点#include"PS2.h"
#include"iom16v.h"
#include"macros.h"
#include"delay.h"
#defineCLK_IN_DDR DDRA&=0XF7
//时钟线设为输入
#defineCLK_OUT_DDR DDRA|=0X08
//时钟线设为输出
#defineDATA_IN_DDR DDRA&=0XFB
//数据线设为输入
#defineDATA_OUT_DDR DDRA|=0X04
//数据线设为输出
#defineDATA_L PORTA&=0XFB
//数据线拉低
#defineDATA_H PORTA|=0X04
//数据线拉高
#defineCLK_L PORTA&=0XF7
//时钟线拉低
#defineCLK_H PORTA|=0X08
//时钟线 拉高
#defineDATA_STATE (PINA&0X04)
//((PINA&0X04)==0X04)
//数据位为高??
#defineCLK_STATE (PINA&0X08)
//((PINA&0X08)==0X08)
//时钟信号为高??
#defineuchar unsigned char
unsigned char a;
int z;
void send_mouse(unsigned char sentchar) //单片机向PS2鼠标发送数据
{
unsigned char sentbit_cnt= 0x00;
unsigned char sentchar_chk = 0x00;
while(CLK_STATE==0);//clk=high??
while(DATA_STATE==0);//DATA=HIGH??
CLK_OUT_DDR;//时钟线设为输出
CLK_L;//拉低时钟线;
delaynus(100);//延时100us。
DATA_OUT_DDR;DATA_L;//数据线设为输出,并拉低数据线;
CLK_H;//释放时钟线;
CLK_IN_DDR;//时钟线设为输入上拉
CLK_H;
for(sentbit_cnt=0;sentbit_cnt<8;sentbit_cnt++)
{
while(CLK_STATE==0X08);//等待时钟线变LOW
if((sentchar&0X01)==0X01)
{
DATA_H;
sentchar_chk= sentchar_chk+1;
}
elseDATA_L;
while(CLK_STATE==0);//等待时钟线变高
sentchar=sentchar>>1; //待发送数据右移一位
}
while(CLK_STATE==0X08);//等待时钟线变LOW
switch(sentchar_chk)
{
case0:
case2:
case4:
case6: DATA_H;break;//KB_DATA = 1; break; //奇校验
case1:
case3:
case5:
case7: DATA_L; break;//KB_DATA = 0; break; //奇校验
default: break;
}
while(CLK_STATE==0); //等待时钟线变高
while(CLK_STATE==0X08); //等待时钟线变为低
//-------------发送停止位,停止位总为1
DATA_H;//MS_DATA = 1;
while(CLK_STATE==0); //等待时钟线变高
//-------------SEND ACK
DATA_IN_DDR;DATA_H;
while(CLK_STATE==0X08); //等待时钟线变为低
while(DATA_STATE==0X04); //等待DATA线LOW
while((CLK_STATE==0)&&(DATA_STATE==0)); //等待时钟线变高等待DATA线变高
} 这个是主机发给PS2鼠标设备的程序大家帮忙看看啊! 向鼠标读取数据的函数
unsigned char mouse_read(void)
{
unsigned char k,data,t={0};
DDRA=0XF0;PORTA=0XFF;//设数据线和时钟线为输入上拉
while(CLK_STATE==0);//时钟线在高处
while(DATA_STATE==0);//数据线在高处
while(DATA_STATE==0X04);//等待数据线为低
while(CLK_STATE==0X08); //读取起始位,在下降沿读取
while(CLK_STATE==0);//等待高电平,开始接收数据位
for(k=0;k<8;k++)
{
while(CLK_STATE==0X08);
if(DATA_STATE==0X04)
{
t=1;
}
else
{
t=0;
}
while(CLK_STATE==0);
}
while(CLK_STATE==0X08);//接收校验位
while(CLK_STATE==0);
while(CLK_STATE==0X08);//接收停止位
while(CLK_STATE==0);
data=128*t+64*t+32*t+16*t+8*t+4*t+2*t+1*t;
return data;
} 鼠标复位函数
void reset_mouse(void)
{
unsigned char mouse_data;
send_mouse(0XFF);//发送复位命令
mouse_data=mouse_read();a=mouse_data;//鼠标的应答
mouse_data=mouse_read();a=mouse_data;
mouse_data=mouse_read();a=mouse_data;
send_mouse(0XF4);
mouse_data=mouse_read();
a=mouse_data;
} 然后我用一个IO口接LED灯来显示鼠标的应答,可是毫无反应啊!望高手指点 mark 最近在做课设,也是做鼠标通讯的。求楼主帮忙一下!谢谢
页:
[1]