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

📄 key_ps2.c

📁 PS/2口向PC发送键盘信息;并通过UART发送
💻 C
字号:
/*****************************************************************************/
//hanshu.c
//功能:向Host's PS/2口发送键盘信息;并通过UART发送 
//修改:
//时间:2007-6-8
 /*****************************************************************************/
#include <regx52.h>
#include "pr/twj.h"
 BYTE  	f=0;
 bit falg_key=0;
unsigned char code table[17]={0x45,0x16,0x1E,0x26,0x25, //0~4
                   0x2E,0x36,0x3D,0x3E,0x46, //5~9
                   0x49,0x05,0x76,0x04,0x29,0x66}; //A~F


/*********************************************************/
//函数:keyscan()
//功能:扫描键盘
//输入:
//输出:键盘值
//描述:
/*********************************************************/
unsigned char keyscan(void)
{
     BYTE  i, hang,lei,key_vale;
  	 KEY=0XF0;
	 if(KEY!=0xf0)
	 {
	  delayx(60);
	  if(KEY!=0xf0)
	  {
	   falg_key=1;
	   hang=KEY;
	   hang=~(hang&0xf0);
	   hang&=0xf0;
	   KEY=0X0F;
	   lei=KEY;
	   lei=~(lei&0x0f);
	   lei&=0x0f;
	   
	   key_vale=(hang+lei);
 
   	  switch(key_vale)
	  {
	    case  0x11 :  i=0;break;
		
		case  0x21 :  i=1;break;
		
		case  0x41 :  i=2;break;
		
		case  0x81 :  i=3;break;
		
		case  0x12 :  i=4;break;
		
		case  0x22 :  i=5;break;
		
		case  0x42 :  i=6;break;
		
		case  0x82 :  i=7;break;
		
		case  0x14 :  i=8;break;
		
		case  0x24 :  i=9;break;
		
		case  0x44 :  i=10;break;
		
		case  0x84 :  i=11;break; 
			  
		case  0x18 :  i=12;break;
	
		case  0x28 :  i=13;break;
		
		case  0x48 :  i=14;break;
		
		case  0x88 :  i=15;break;
		

		default	:  i=0xaa; break;
		     
	  }
	  SBUF= i;
	  while(!TI);
	  TI=0;
	  while(KEY!=0X0F);
	  delayx(160);
	 
	  /*SBUF=0X0D;
	  while(!TI);
	  TI=0;
	  SBUF=0X0A;
	  while(!TI);
	  TI=0;	 */
	   }

 	  return table[i]; 
   	  }
}
/*********************************************************/
//函数:key_send()
//功能:发送键盘通码值
//输入:键盘值
//输出: 
//描述:
/*********************************************************/
void  key_send(BYTE m)
{
    BYTE i=8,temp,buffer;
	bit flag_check=1;
	temp=m;
	
	for(i=0;i<8;i++)
	{
	 buffer=(temp&0x01);
	 if(buffer)	flag_check=!flag_check;
	 temp>>=0x1;
	}
	SDA0;//起始位
				delay ( );
				SCLK0;
				delay ( );
	
    do{
    	SCLK1;//从时钟脉冲的上升沿到一个数据转变的时间至少要有5 微秒
    	delay();
    	if((m&0x1)==0x1)//数据变化到时钟脉冲的下降沿的时间至少要有5 微秒并且不大于25 微秒
       	   	SDA1;
		else
      	  	SDA0;
    	delay();
	    SCLK0;
    	m=m>>1;
	   	delay();
    	i--;
    }while(i);
    SCLK1;
	delay();


	DATA=flag_check;
	delay();
	SCLK0;
    delay();
	
				SCLK1;
				delay ( );
			    SDA1;	   //STOP BIT
				delay ( );
				SCLK0;
				delayx(6);
				SCLK1;

}
/*********************************************************/
//函数:key_break()
//功能:发送键盘断码值
//输入:键盘值
//输出: 
//描述:
/*********************************************************/	
void key_break(m)
{
 
    BYTE i=8,temp,buffer;
	bit flag_check=1;
	temp=m;
	/* */
	for(i=0;i<8;i++)
	{
	 buffer=(temp&0x01);
	 if(buffer)	flag_check=!flag_check;
	 temp>>=0x1;
	} 
       
	temp=0xf0;
	do{
    	SCLK1;
    	delay();
    	if((temp&0x1)==0x1)
       	   	SDA1;
		else
      	  	SDA0;
    	delay();
	    SCLK0;
    	temp=temp>>1;
	   	delay();
    	i--;
    }while(i);
	SCLK1;
	delay();
	SDA1;  //校验位
	delay();
	SCLK0;
	delay();
	SCLK1;
	delay();
	SDA1;
	delay();
	SCLK0;
	delay();
	delay();
	delay();
	SCLK1;

	delayx(200);
	delayx(200);
	
	SDA0;//起始位
	delay ( );
	SCLK0;				  
    delay ( );
	 i=8;
    do{
    	SCLK1;
    	delay();
    	if((m&0x1)==0x1)
       	   	SDA1;
		else
      	  	SDA0;
    	delay();
	    SCLK0;
    	m=m>>1;
	   	delay();
    	i--;
    }while(i);
    SCLK1;
	delay();


	DATA=flag_check;
	delay();
	SCLK0;
    delay();
}
/*********************************************************/
//函数:scan_key()
//功能:主调函数,检查PS2以及键盘
//输入: 
//输出: 
//描述:
/*********************************************************/
void scan_key(void)
{	
  if(CLK==1&&DATA==1)
	      {
	        delayx(30);
	        if(CLK==1&&	DATA==1)
		     {	
			    unsigned char pp;
			    pp= keyscan();

			    if((falg_key==1)&&(pp!=0xaa))
				{
				ABH;//
			    			  
			  	KEY=0XFF;
			 	key_send(pp);//
				
				delayms(100);
				key_send(0xf0);
			    delayms(5);
				key_send(0xf0);
			   /*
 			    if(CLK==1&&DATA==1)
			    {
			    SDA0;
				delay ( );
				SCLK0;				 
			    delay ( );
			    key_break(pp);					  				
				SCLK1;
				delay ( );
			    SDA1;	   //STOP BIT
				delay ( );
				SCLK0;
				delayx(6);
				SCLK1;
				delayx(160); delayx(160);
				
                               
			     }	*/
				 falg_key=0;
				ABL;
				}
		     }
   
      }
}

⌨️ 快捷键说明

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