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

📄 ps2key.c

📁 用AT89S52单片机模拟PS2键盘时序向PC机发送指令
💻 C
字号:
#include <reg52.h>

sbit ps2dat=P2^0;
sbit ps2clk=P2^2;
sbit SPK=P3^7;
sbit K1=P1^6;
sbit K2=P1^7;

bit parity;

unsigned char sdata;

void delayus(unsigned char n)
{  n=n>>1;
   while(n--);
}

void delayms(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}

void send_char(unsigned char send_data)
{unsigned char i;
 parity=1;
 while(!ps2clk)
        {delayus(10);}//等待主机释放抑制
 if(!ps2dat)
        return;//主机要发送数据,传输中止
 delayus(20);
 //  发送起始位
 ps2dat=0;
 delayus(10);
 ps2clk=0;
 delayus(20);
 ps2clk=1;
 delayus(10);
 ps2dat=1;

 //发送数据
 for(i=0;i<8;i++)
   {ps2dat=send_data&0x01;
    parity=parity^(ps2dat^0);
    send_data=send_data>>1;
	delayus(10);
	ps2clk=0;
	SPK=0;
	delayus(20);
	ps2clk=1;
	SPK=1;
	delayus(10);

   }
 //发送校验位
 ps2dat=parity;
 delayus(10);
 ps2clk=0;
 delayus(20);
 ps2clk=1;
 delayus(10);
 ps2dat=1;
 //发送停止位
 ps2dat=1;
 delayus(10);
 ps2clk=0;
 delayus(20);
 ps2clk=1;
 
}

main()
{unsigned char kk1,kk2;
 kk1=1;
 kk2=1;
 while(1)
    {/*if(K1==0)
	   { delayms(50);
	     if(K1==0)
		    {send_char(0x11);
			 delayms(10);
			 send_char(0x0d);
			 delayms(10);
			 send_char(0xf0);
			 delayms(10);
			 send_char(0x0d);
			 delayms(10);
			 send_char(0xf0);
			 delayms(10);
			 send_char(0x11);
			 delayms(100);
			}

	    }
	 if(K2==0)	 
	   { delayms(50);
	     if(K2==0)
		    {send_char(0x2e);
			 delayms(10);
			 send_char(0xf0);
			 delayms(10);
			 send_char(0x2e);
			 delayms(100);
			}

	    } */
      if(K1==0&&kk1==1)	 //K1按下
	      {kk1=0;
		   send_char(0x11);
			 delayms(10);
		  }
	  if(K1==1&&kk1==0)	 //K1弹起
	      {kk1=1;
		   send_char(0xf0);
			 delayms(10);
		   send_char(0x11);
			 delayms(10);
		  }
	  if(K2==0&&kk2==1)	 //K2按下
	      {kk2=0;
		   send_char(0x0d);
			 delayms(10);
		  }
	  if(K2==1&&kk2==0)	 //K2按下
	      {kk2=1;
		   send_char(0xf0);
			 delayms(10);
		   send_char(0x0d);
			 delayms(10);
		  }
	}
}

/*

#include <intrins.h>

sbit ps2data = P2^0;
sbit ps2clock = P2^2;
sbit speak = P3^7;
unsigned char bdata ps2char;
unsigned char bdata status;
sbit ps2lsb = ps2char^0;
sbit pverify = status^0;

unsigned char bdata keystatus;
sbit key1_up=keystatus^0;


sbit    AN1 = P1^6;
sbit    AN2 = P1^7;
sbit  LED1 = P0^2;
sbit irt = P0^0;
sbit gdt = P0^1;
void delayus(unsigned char us)	
{	us=us*2;
    while(--us) ;
}

void send_char()
{
    unsigned char cnt = 9;
    while(!ps2clock)
        delayus(10);
    if(!ps2data)
        return;
    //起始位
    ps2data = 0;
    delayus(10);
    ps2clock = 0;
    delayus(20);
    ps2clock = 1;
    delayus(10);

    ACC = ps2char;
    pverify = ~P;
    
    while(--cnt)
    {
        ps2data = ps2lsb;
        ps2char = _cror_(ps2char,1);
        delayus(10);
        ps2clock = 0;
        speak = 0;
        delayus(20);
        ps2clock = 1;
        speak = 1;
        delayus(10);
    }

    ps2data = ps2lsb;
    delayus(10);
    ps2clock = 0;
    delayus(20);
    ps2clock = 1;
    delayus(10);

    ps2data = 1;
    delayus(10);
    ps2clock = 0;
    delayus(20);
    ps2clock = 1;
}

void delayms(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}

void main(void)
{
    P0=0xFF;
    keystatus = 0xFF;
    gdt = 0;
    while(1)
    {
		LED1 = irt;
        speak = irt;
        if(AN1==0)		// 扫描按键
		{
			delayms(100);			// 延时去抖动
			if(AN1==0)			// 再次扫描
			{
                key1_up = AN1;
                //if(!key1_up)
                {
                    LED1 = 0;
                    ps2char = 0x1c;
                    send_char();
					delayms(10);
                }
                //else
                {
                    LED1 = 1;
                    ps2char = 0xF0;
                    send_char();
                    delayms(10);
                    ps2char = 0x1c;
                    send_char();
                }
			}
		}
    }    
}
	 */
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -