📄 06.c
字号:
#define uchar unsigned char
#define uint unsigned int
#define PS2_CLOCK 0
#define PS2_DATA 1
#define SetPs2ClockOut() DDRD|=(1<<S2_CLOCK)
#define SetPs2ClockIn() DDRD&=~(1<<S2_CLOCK)
#define SetPs2Clock() PORTD|=(1<<S2_CLOCK)
#define ClrPs2Clock() PORTD&=~(1<<PS2_CLOCK)
#define ReadPs2Clock PIND&(1<<PS2_CLOCK)
#define SetPs2DataOut() DDRD|=(1<<PS2_DATA)
#define SetPs2DataIn() DDRD&=~(1<<PS2_DATA)
#define SetPs2Data() PORTD|=(1<<PS2_DATA)
#define ClrPs2Data() PORTD&=~(1<<PS2_DATA)
#define ReadPs2Data PIND&(1<<PS2_DATA)
uchar PS2_get(void)
{
uchar i,bit,value=0,p=0;
PS2_error=0;
SetPs2DataIn();
SetPs2ClockOut();
SetPs2Clock();
SetPs2ClockIn();
while(PIND&(1<<PS2_CLOCK)); //等待起始位
while(!(PIND&(1<<PS2_CLOCK)));
for(i=0;i<8;i++) //接受8位数据
{ value=value>>1;
while(PIND&(1<<PS2_CLOCK));
if(ReadPs2Data) value|=0x80;
while(!(PIND&(1<<PS2_CLOCK)));
}
while(PIND&(1<<PS2_CLOCK)); //奇校验
p+=ReadPs2Data;
if((p&0x01)==0)
PS2_error=1;
while(!(PIND&(1<<PS2_CLOCK)));
while(PIND&(1<<PS2_CLOCK)); //停止位
if(ReadPs2Clock==0)
PS2_error=1;
Delay20uS(1);
return(value);
}
void PS2_send(uchar value)
{
uchar i,j;
uint p;
p=0;
PS2_error=0;
SetPs2ClockOut();
ClrPs2Clock(); //拉底,主机要发送数据
Delay20uS(5); //》100US
SetPs2DataOut();
ClrPs2Data(); //拉底数据线,起始位
SetPs2Clock(); //释放
SetPs2ClockIn();
for(i=0;i<8;i++) //发送8位数据
{
while(PIND&(1<<PS2_CLOCK));
if((value&0x01)==0x01){SetPs2Data();p++;}
else ClrPs2Data();
while(!(PIND&(1<<PS2_CLOCK)));
value=value>>1;
}
while(PIND&(1<<PS2_CLOCK)); //发送奇校验
if(!(p%2))
SetPs2Data();
else ClrPs2Data();
while(!(PIND&(1<<PS2_CLOCK)));
while(PIND&(1<<PS2_CLOCK)); //发送停止位
SetPs2Data();
while(!(PIND&(1<<PS2_CLOCK)));
while(PIND&(1<<PS2_CLOCK)); //鼠标应答
SetPs2DataIn();
if(PIND&(1<<PS2_DATA))
PS2_error=1;
while(!(PIND&(1<<PS2_CLOCK)));
}
void main(void)
{
uchar key1,key2,key3,key;
port_init();
lcm_init();
display_clear();
loop: PS2_send(0xff); //初试化
PS2_send(0xf6); //选择连续模式
PS2_send(0xf4); //开始发送数据
key=PS2_get(); //接受返回信号
key1=PS2_get(); //
key2=PS2_get(); //X增量
key3=PS2_get(); //Y增量
dispint3(key,0,0); //显示
dispint3(key1,0,1);
dispint3(key2,4,1);
dispint3(key3,8,1);
if(key!=0xfa) goto loop; //KEY=0XFA,初试化成功
while(1)
{
PS2_send(0xf4);
key=PS2_get();
key1=PS2_get();
key2=PS2_get();
key3=PS2_get();
if(key1&0x10)//x- //电机控制
PS2_lbujin(2);
else if(!(key1&0x10))//x+
PS2_rbujin(2);
if(key1&0x20)//y-
PS2_dbujin(2);
else if(!(key1&0x20))//y+
PS2_ubujin(2);
dispint3(key,0,0);
dispint3(key1,0,1);
dispint3(key2,4,1);
dispint3(key3,8,1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -