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

📄 pckeydrive.c

📁 PS2的按键解析驱动程序,已经在实际应用
💻 C
字号:
/*

DIN:                PS/2
1 - CLOCK           1 - DATA
2 - DATA            2 - nc
3 - nc              3 - GND
4 - GND             4 - +5V
5 - +5V             5 - CLOCK
                    6 - nc

nc = not connected


Pins:
     |_|
  1       3         5 || 6
   4     5         3      4
      2              1  2


*/
#include  "..\INC\config.h"


unsigned char PcByteCount;    //用于接收每个字节的中断次数
unsigned char PcByteOk;       //正确读取一个数据
unsigned char PckeyCode;
unsigned char PckeyPar;       //存校验位

unsigned char xdata Pcodetemp[100];
unsigned char pccount;
unsigned char pcsub;
#define PCKEYERR  0
#define PCKEYOK   1

//读出一个字节
unsigned char readtemp(unsigned char *rpt)
{
   if(pcsub == pccount)return 0;
   *rpt =  Pcodetemp[pcsub]; 
   pcsub++;
   if(pcsub>99)pcsub=0;
   return 	1;
}
//加一个字节
void insbytstemp(unsigned char prt)
{
   if((pccount+1) == pcsub) return;
   Pcodetemp[pccount] = prt;
   pccount++;
   if(pccount>99)pccount=0;
   
}

/*
//PC键盘延时函数
void Pckeydelayus(unsigned int pcd)
{
    unsigned int i = pcd;
	while(i--)
	{
        _nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}

}
//时钟高电平超时判断 <1ms
unsigned char PcKey_Clk_Hei_Over()
{
   unsigned int i = 1000;
   
   while(i--)
   {
        _nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		if(!PClk)return PCKEYOK;
   }
   return PCKEYERR;
}

//时钟低电平超时判断 <1ms  未超时返回1  超时返回0
unsigned char PcKey_Clk_Low_Over()
{
	unsigned int i = 1000;

	while(i--)
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		if(PClk)return PCKEYOK;
	}
	return PCKEYERR;
}
   */
//初始化PcKey IO初始化
void PcKeyReadIOInit()
{

    //Pdat
	PSD_reg.DIRECTION_B.bits.bit7 = 1;  //位为0为输入,为1输出
	PSD_reg.DATAOUT_B.bits.bit7 = 1;

	//Pclk
	PSD_reg.DIRECTION_B.bits.bit1 = 1;  //位为0为输入,为1输出
	PSD_reg.DATAOUT_B.bits.bit1 = 1;
    
	//Pdat
	PSD_reg.DIRECTION_B.bits.bit7 = 0;  //位为0为输入,为1输出
	PSD_reg.DATAIN_B.bits.bit7 = 0;

	//Pclk
	PSD_reg.DIRECTION_B.bits.bit1 = 0;  //位为0为输入,为1输出
	PSD_reg.DATAIN_B.bits.bit1 = 0;


   	P3_3 = 1;

    PcKeyInitVar();

	IT1 = 1;       //INT1下降沿有效
	EX1 = 1;       //开INT1中断;
	PX1 = 1;
}


//初始化PCKEY的相关变量
void PcKeyInitVar()
{
    PcByteCount = 0;
	PcByteOk = 0;
	pccount = 0;
	pcsub = 0;
}
/************************************************************************/
/* 从键盘读取一个字节                                                   */
/* 正确返回1,错误返回0,且不改变指针内容                                 */
/***********************************************************************
unsigned char HostReadPcKeyChar(unsigned char *Hpc)
{
    unsigned char i=0;             //
	unsigned char par = 0;           //校验位
	unsigned char hrtemp = 0;
    
    PcKeyReadIOInit();

    if(!PcKey_Clk_Hei_Over())  return PCKEYERR;  //如果在1ms内Clk一直处于高电平,说明没有数据要发送到主机
	
	if(!PcKey_Clk_Low_Over())  return PCKEYERR;
	  
		for(i=0;i<9;i++)
		{
		   
			
            if(!PcKey_Clk_Hei_Over()) return PCKEYERR;//等待低电平
			
                if(i < 8)
				{
                    hrtemp >>= 1;
				    if(PDat == 0x01)
					    hrtemp |= 0x80;
				}
				else
				{
                     if(PDat == 0x01)
					 {
                        par = 0x01;
					 }
					 else
					 {
                        par = 0x00;
					 }
				}
                

			if(!PcKey_Clk_Low_Over()) return PCKEYERR;


		}

        ACC = hrtemp;
        
		if(P == 0 && par ==1)
		{
		   	 *Hpc = hrtemp;
		     return PCKEYOK;
		}

		if(P == 1 && par ==0)
		{
		     *Hpc = hrtemp;
		     return PCKEYOK;
		}
 
        return PCKEYERR;

}
*/

unsigned char SeachrCode(unsigned char *pcode)
{
	unsigned char i=0;
	//先找noshift
	for(i=0;i<80;i++)
	{
	   if((*pcode) == noshift[i][0])
	   {
		  *pcode = noshift[i][1];
		  return PCKEYOK;
	   }
	}
	
	//先找addshift
	for(i=0;i<47;i++)
	{
	   if((*pcode) == addshift[i][0])
	   {
		  *pcode = noshift[i][1];
		  return PCKEYOK;
	   }
	}
	
	return PCKEYERR;

}



void ISR_INT1() interrupt 2
{ 
   if( ReadPCKey(&PckeyCode))
   {
	  insbytstemp(PckeyCode);
   }

}

void PckeyFun()
{
	unsigned char xt = 0;
	if(readtemp(&xt))
	{
		
		//查找相应的代码
//		if(xt == 0xE0) return;
//		if(xt == 0xF0) 
//		{
//		   readtemp(&xt);
		
//		}
//		else
	    {
//		    if(SeachrCode(&xt))
			{ 	
				PrintChCom2(xt);
				
			}
		}
		
	}
}

⌨️ 快捷键说明

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