⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 06.c

📁 这是一个用单片机接收和发送鼠标程序
💻 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 + -