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

📄 kbv10work.c

📁 用单片机的i/o口模拟ps/2键盘的通信协议
💻 C
📖 第 1 页 / 共 5 页
字号:


#include "reg52.h"
#include "stdio.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define XBYTE  ((uchar *) 0x50000L)
#define PRESSKEY_MAX   5
#define MAX_LEN   16
#define  WAITPS2CLK      250
#define CONFIG_COM    0X53
#define KEYMAP_COM    0X5C
#define READ_COM        0X7f
#define OSTEST_COM     0X63
#define VERSION_COM   0X62
#define CHECKKEYBEGIN_COM   0X67
#define CHECKKEYOVER_COM   0X68
#define  PS2MARK    0XF2
#define MEMORYMARK  0XF3
#define CARDMARK   0XF4
#define PS2MARKERROR  0XF5
#define MEMORYMARKERROR 0XF6
#define CARDMARKERROR   0XF7
#define   SENDCHARMAX      3000
#define  ISP_COM    0X66
#define CONFIGADDL   0X00
#define CONFIGADDH   0X70
#define CONFIG_BASE     0X7000
#define KEYADD_BASE     0X7200
#define KEYMSG_BASE     0X8600
#define  KEYADDH  0X72
#define  TRK1DELAY_MS    3
#define  KEYDELAY_MS   3
#define  ACKTOHOST   0X31
#define  ROWNUM     7
#define  COLNUM      11
#define  ROWCOL1   (2*COLNUM)
#define  ROWCOL2  (ROWNUM*COLNUM*2 )
#define  READDELAY   3
#define  CARDBEEP    200
#define  HOSTACK  0X31
#define  CHECKACK  0X01
#define  CHECKACK1  0Xfb

sfr  ISPFAH=0XF4;
sfr  ISPFAL=0XF5;
sfr  ISPFD=0XF6;
sfr  ISPC=0XF7;
sfr  SCONF=0XBF;
sfr  WDTC= 0X9F;

sbit JP_DATA=P1^3;
sbit JP_CLK=P1^0;
sbit BJP_CLK=P3^6;
sbit BJP_DATA=P3^5;
sbit READER_CLK=P3^1;
sbit READER_DATA=P3^2;
sbit BEEP_EN=P2^7;
sbit LED1_EN=P1^5;
sbit LED2_EN=P1^6;
sbit LED3_EN=P1^7;
sbit SCAN_A0=P2^0;
sbit SCAN_A1=P2^1;
sbit SCAN_A2=P2^2;
sbit SCAN_A3=P2^3;
sbit EN_SCAN=P3^7;
sbit LOCK_EN=P2^4;


bit HostApa_Flag=0;
bit DelayPs2_Flag=0;
bit Timer2_Flag=0;
bit CheckCard_Flag=0;
bit Caps_Flag=0,ProBeep_Flag=0;
bit SendApa_Flag=0;
bit ReadHost_Flag=0;
bit Config_Flag=0,KeyMap_Flag=0,Isp_Flag=0; 
bit FirstPress_Flag=0;
bit ED_Flag=0;
bit TypeDelay_Flag=0;
bit LockShiftOld_Flag=0,LockShiftNew_Flag=0,LockCtrlOld_Flag=0,LockCtrlNew_Flag=0,LockAltOld_Flag=0,LockAltNew_Flag=0;
bit LockOldCaps_Flag=0,LockNewCaps_Flag=0,LockOldNum_Flag=0,LockNewNum_Flag=0,LockNewScroll_Flag=0,LockOldScroll_Flag=0;

uchar  Lock_Layer=0,KeyNew_Layer=0;
uchar TypeMaticCount=0,LockNew_Status=0,LockOld_Status=0;
bit   SpecialTypeDelay_Flag=0;
uchar   SpecialTypeMaticCount=0;
bit KeyOldCaps_Flag=0,KeyNewCaps_Flag=0,KeyOldNum_Flag=0,KeyNewNum_Flag=0, KeyOldScroll_Flag=0,KeyNewScroll_Flag=0;
uchar   WriteIndex=0,ReadIndex=0,DataCount=0;
uchar  xdata  DataBuffer[MAX_LEN];
uchar    SendApa=0;
uchar    LayerNew_Sum=0,LayerOld_Sum=0;
uint    KeySendRow=0,KeySendCol=0;
uchar   KeyNew_Num=0,KeyOld_Num=0,KeyNewAsci_Num=0,KeyOldAsci_Num=0;
uint xdata  OldKey[PRESSKEY_MAX],CurKey[PRESSKEY_MAX],KeyNewAsci[PRESSKEY_MAX],KeyOldAsci[PRESSKEY_MAX];
bit ShiftNew_Flag=0,ShiftOld_Flag=0,AltNew_Flag=0,AltOld_Flag=0,CtrlNew_Flag=0,CtrlOld_Flag=0;
uchar   rece_host_byte=0,rece_ps2_byte=0;
 const  code bitmask[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40};
 const  code  tableChar[]=  {'!',   	'@',   	'#',    	'$',   	 '%',   	 '^',    	 '&',    	'*',    	'(',     	')',      	'+',   	 '_',     	':',   		 '<',   	'>',   	 '?',   
                                           'A',    	'B',  		 'C',   	 'D',   	 'E',     	 'F',     	 'G',    	'H',   	'I',    	'J',     	'K',     	 'L',         'M',    	 'N',         'O',   	 'P',  
                                           'Q',    	'R',   	 'S',    	 'T',   	 'U',    	 'V',     	 'W',    	'X',    	'Y',  	       'Z',          '{',     	 '|',     	'}' ,   	 '~' ,    '"',       0
                                           };
                                          
const   code  tableChar1[]={'1',    	'2',   	'3',    	'4',   	 '5',    	 '6',     	 '7',      	'8',     	 '9',   	 '0',    	 '=',   	 '-',   	 ';',   	  ',',   	  '.',    	 '/',  
                                           'a',         'b',    	'c',    	'd',    	 'e',    	 'f',      	 'g',      	'h',     	 'i',     	 'j',      	 'k',    	 'l',    	 'm',    	  'n',   	   'o',   	 'p',  
                                           'q',    	 'r',     	's',    	't',    	 'u',    	 'v',     	 'w',      	'x',     	 'y',    	 'z',    	 '[',    	  '\\',    	 ']',    	  '`',     	   '\'',    	 ' '    
   	                                        };
                                          
const   code  tableScan[]= {0x16,    0x1e,    0x26,    0x25,      0x2e,     0x36,     0x3d,      0x3e,     0x46,    0x45,     0x55,    0x4e,    0x4c,     0x41,     0x49,     0x4a,  
                                           0x1c,    0x32,    0x21,    0x23,      0x24,     0x2b,     0x34,      0x33,     0x43,    0x3b,     0x42,    0x4b,    0x3a,    0x31,      0x44 ,    0x4d,  
                                          0x15,    0x2d,    0x1b,    0x2c,      0x3c,      0x2a,     0x1d,      0x22,     0x35,    0x1a,     0x54,    0x5d,    0x5b,    0x0e,      0x52,    0x29  
                                           };
void Delay_ms(uint);
void Delay_40us(void);
void Delay_10us(void);
void Delay_25us(void);
void Delay_5us(void);																					
bit  Key_Scan(void);
bit SendMakeToHost(uchar);
void Service_Timer1(void);
void Service_Timer2(void);
uchar Lock_Scan(void);
void Service_In0(void);
void Ini_Int0(void);
void Ini_Timer2(void);
void Ini_Timer1(void);
bit SendComToPs( uchar);
uchar CheckLock_Layer(uchar );
uchar CheckKey_Layer(void);
void  CheckKey_Special(void);
bit CompareSame_Special(void);
bit CompareSame_Asci(void);																						
void  SendCurKeyCode(uint ,uint );
void UpDateOldKey(void);
void ClearAll_Flag(void);
void Send_Locks(uchar );
void AddDataToBuffer(uchar );
void SendDataToHost(void);							
void  GetByteFromHost(void);
void SendSpecialKeyCode(void);
void Version_IAP(void);
void Ini_Flash(void);
void SendLock_Msg(uchar );
void SendMakeToHostCount(uchar );
void  Version_IAP(void);
				
/*--------------------------------------------------*/

/*--------------------------------------------------*/
/*                    Delay1ms()                   */
/*--------------------------------------------------*/

 void Delay_ms(uint lin)
 {
  uchar  j;
  while(lin>0)
  {
        for(j=0;j<125;j++);
        lin--;
   }
 }
 /*--------------------------------------------------*/
/*                    Delay5us()                   */
/*--------------------------------------------------*/
 void Delay_5us()
 {
 }

 /*--------------------------------------------------*/
/*                    Delay10us()                   */
/*--------------------------------------------------*/
 void Delay_10us()
{
 uchar  i;
 i=0;
 i++;
 i++;
 i++;
}
 /*--------------------------------------------------*/
/*                    Delay25us()                   */
/*--------------------------------------------------*/
 void Delay_25us(void)
 {
     uchar i;
     for(i=0;i<1;i++);
 }
  /*--------------------------------------------------*/
/*                    Delay40us()                   */
/*--------------------------------------------------*/

 void Delay_40us(void)
 {
     uchar i;
     i=0;
     for(i=0;i<2;i++);
     while(i==0);
     while(i==0);
     while(i==0);
 }
 /*--------------------------------------------------*/
/*                    ClearBuffer()                   */
/*--------------------------------------------------*/
void ClearBuffer()
{
      uchar i;
      WriteIndex=0;
      ReadIndex=0;
      DataCount=0;
      for(i=0;i<MAX_LEN;i++)
                 DataBuffer[i]=0;
}
 /*--------------------------------------------------*/
/*                    AddDataToBuffer()                   */
/*--------------------------------------------------*/
void   AddDataToBuffer(uchar aData)
{
	if(DataCount<MAX_LEN)
	{
		DataBuffer[WriteIndex]=aData;
		WriteIndex++;
		if(WriteIndex==MAX_LEN)
		{
			WriteIndex=0;
		}
		DataCount++;
	}

}
 /*--------------------------------------------------*/
/*                    SendDataToHost()                   */
/*--------------------------------------------------*/
void SendDataToHost(void)
{
   if(!DelayPs2_Flag)
   {

		while(DataCount>0)
		{
                  BJP_CLK=0;
		        if(SendMakeToHost(DataBuffer[ReadIndex])==1)
			     {
			          	break;
			     }
				else
				{
				      ReadIndex++;
				      if(ReadIndex==MAX_LEN)
				      	{
				      		ReadIndex=0;
				      	}
		              DataCount--;
				}
		}
   }
BJP_CLK=1;
}
  /*--------------------------------------------------*/
/*                  void  GetByteFromHost(void )       */
/*--------------------------------------------------*/
void  GetByteFromHost(void)
{

    uchar i;
    bit flag_check=1;
    uchar rece_host_data[11];
    BJP_CLK=0;
    EA=0;
    TF2=0X00;
    ET2=0;     
    TR2=0;

     while(!JP_CLK);

     if(!JP_DATA)
     {
	        Delay_10us();      
	        rece_host_data[0]=JP_DATA;  
	        Delay_10us();
	        for(i=1;i<10;i++)
	        {
	             JP_CLK =0;
	             Delay_10us();
	             Delay_10us();
	             Delay_10us();
	             Delay_5us();
	             JP_CLK=1;        
	             Delay_10us();
	             rece_host_data[i]=JP_DATA;
	             Delay_10us();
	        }
	        Delay_5us();
	        JP_CLK=0;
	        Delay_10us();
	        Delay_10us();
	        Delay_10us();
	        Delay_5us();
	        JP_CLK=1;         
	        Delay_10us();
	        rece_host_data[10]=JP_DATA;
	        Delay_5us();
	        if(rece_host_data[10]!=1)
	        {
	               //error   host not realse data line
	        }

	        Delay_5us();
	        JP_DATA=0;
	        Delay_10us();
	        JP_CLK=0;
	        Delay_10us();
	        Delay_10us();
	        Delay_10us();
	        Delay_5us();
	        JP_CLK=1;
	        Delay_10us();
	        JP_DATA=1;
	        //receive over check the data
	        for(i=1;i<9;i++)
	        {
	               if(rece_host_data[i]==1)
	               {
	                        flag_check=!flag_check;
	               }
	        }
	    if(rece_host_data[10]==1)
	     {
		        if(flag_check==rece_host_data[9])   
		        {
		             rece_host_byte=0;
		             for(i=1;i<9;i++)
		                    rece_host_byte+=rece_host_data[i]<<(i-1);
		             ReadHost_Flag=1;
				    if((!Config_Flag)&&(!KeyMap_Flag)&&(!Isp_Flag)&&(HostApa_Flag))
					    {
                                    DelayPs2_Flag=1;
						}
                    if((!Config_Flag)&&(!KeyMap_Flag)&&(!Isp_Flag)&&(!HostApa_Flag))
					    {
						    if((rece_host_byte==0xed)||(rece_host_byte==0xee)||(rece_host_byte>=0xf0))
                                    DelayPs2_Flag=1;
						}
		        }
		        else
		        {
		            //error data return error message
		        }

         	}
		}
		else
		 {
		  ReadHost_Flag=0;
		  rece_host_byte=0;
		 }
	   TR2=1;    
	   ET2=1;
	   EA=1;
	   BJP_CLK=1;
}
/*--------------------------------------------------*/
/*                  send_make_to HOST                   */
/*--------------------------------------------------*/
bit SendMakeToHost(uchar x)
{
   uchar i,tmpChar;
   bit Parity_make=1 ;
   bit tmpBit;
   ET2=0;  
   TR2=0;
   if(!JP_CLK)
   {
        Timer2_Flag=1;
        ET2=1;
        TR2=1;
        return(1);
   }
   tmpChar=x;
  Delay_40us();  
  Delay_10us();
  if(!JP_CLK)
  {
      Timer2_Flag=1;
      ET2=1;
      TR2=1;
      return (1);
  }
  JP_DATA=0; 
  Delay_10us();
  Delay_10us();
  JP_CLK=0;
  Delay_40us();
  JP_CLK=1;
  for(i=0;i<8;i++) 
  {
  	 tmpBit=tmpChar&0X01;
  	 if(tmpBit)    
  	 {
  	 	Parity_make=!Parity_make;
  	 }
  	 else
  	 {
  	 	Parity_make=Parity_make;   
  	 }
  	 if(!JP_CLK) 
   	{
	         Timer2_Flag=1;
             ET2=1;

⌨️ 快捷键说明

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