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

📄 kbv10work.c

📁 用单片机的i/o口模拟ps/2键盘的通信协议
💻 C
📖 第 1 页 / 共 5 页
字号:
             TR2=1;
        	return(1);
   	}
  	 JP_DATA=tmpBit;
  	 Delay_10us(); 
  	 Delay_10us();
  	 JP_CLK=0;   
  	 tmpChar=tmpChar>>1; 
  	 Delay_40us();   
  	 JP_CLK=1;  
  }
  Delay_10us();
  Delay_10us();
   if(!JP_CLK)
   {
            Timer2_Flag=1;
            ET2=1;
            TR2=1;
        	return(1);
   }
   JP_DATA=Parity_make;
  Delay_10us();
  Delay_10us();
  JP_CLK=0;
  Delay_40us();
  JP_CLK=1;
  Delay_40us();
   if(!JP_CLK)
   {
			Timer2_Flag=1;
            ET2=1;
            TR2=1;
        	return(1);
   }
   JP_DATA=1 ;  //stop bit
   Delay_10us();
   Delay_10us();
   JP_CLK=0;
   Delay_40us();
   JP_CLK=1;
   //Delay_10us(); 
   JP_DATA=1;
   ET2=1;
   TR2=1;
   while(!JP_CLK);
    if(!JP_DATA)
     {
             Timer2_Flag=1;
             ET2=1;
             TR2=1;
             return (0);
     }
    while(!JP_CLK);
    if(!JP_DATA)
     {
             Timer2_Flag=1;
             ET2=1;
             TR2=1;
             return (0);
     }
    ET2=1;
    TR2=1; 
    return (0);   

}

 /*--------------------------------------------------*/
/*  SendMakeToHostCount                                */
/*--------------------------------------------------*/
void SendMakeToHostCount(uchar  iSendChar)
{
           uint iSendCount=0;
            while ( SendMakeToHost(iSendChar)==1)
            	    {
            	          iSendCount++;
                          GetByteFromHost();
						  if(ReadHost_Flag)
						    {
                                rece_host_byte=0;
                                ReadHost_Flag=0;            
							}						  						  
            	          if(iSendCount==SENDCHARMAX)
            	          	 {
            	          	    iSendCount=0;
            	          	    break ;
            	          	 }
						
            	    }
}

 /*--------------------------------------------------*/
/*                Servive_Timer1()                  */
/*  read the data sending by  expanded ps/2
/*--------------------------------------------------*/
 void Service_Timer1(void) interrupt  3 using 1     
 {
   uchar i,j;
   uchar rece_ps2_data[11];    
   bit flag_check=1;
   ET1=0;  
   TR1=0;
   TF1=0X00;      
   TMOD=0X60;     
   TL1=0XFF;
   TH1=0XFF;
    j=0;
      while(BJP_CLK)  
      	{
      	    j++;
      	    if(j==WAITPS2CLK)
      	    	{
	      	    	    ET1=1;
	      	    	    TR1=1;
	      	    	    BJP_CLK=1;
	      	    	    BJP_DATA=1;
                         return ;
      	    	}
      	}

      rece_ps2_data[0]=BJP_DATA;  
      j=0;
      while(!BJP_CLK)   
      	{
      	    j++;
      	    if(j==WAITPS2CLK)
      	    	{
      	    	      ET1=1;
                    TR1=1;
                    BJP_CLK=1;
      	    	      BJP_DATA=1;
      	    	      return ;
      	       }
      	}
      for( i=1;i<9;i++)
             {
                   j=0;
                   while(BJP_CLK)  
                   	{
                   	   j++;
                   	   if(j==WAITPS2CLK)
                   	   	{
                   	               ET1=1;
                                    TR1=1;
                                    BJP_CLK=1;
      	    	                      BJP_DATA=1;
      	    	                      return ;
                   	   	}
                   	}
                    rece_ps2_data[i]=BJP_DATA;     
                    j=0;
                    while(!BJP_CLK) 
                    	{
                    	     j++;
                    	     if(j==WAITPS2CLK)
                    	     	{
                    	               ET1=1;
                                    TR1=1;
                                    BJP_CLK=1;
      	    	                      BJP_DATA=1;
      	    	                      return ;
                    	     	}
                    	}
            }
        j=0;
       while(BJP_CLK)
       	{
       	      j++;
       	      if(j==WAITPS2CLK)
       	      	{
       	      	        ET1=1;
                             TR1=1;
                             BJP_CLK=1;
      	    	               BJP_DATA=1;
      	    	               return ;
       	      	}
       	}
      rece_ps2_data[9]=BJP_DATA;      //receive parity
      j=0;
       while(!BJP_CLK)
       	{
       	    j++;
       	    if(j==WAITPS2CLK)
       	    	{
       	    	      ET1=1;
                           TR1=1;
                           BJP_CLK=1;
      	    	             BJP_DATA=1;
      	    	             return ;
       	    	}
       	}
       j=0;
       while(BJP_CLK)
       	{
       	      j++;
       	      if(j==WAITPS2CLK)
       	      	{
       	      	         ET1=1;
                              TR1=1;
                              BJP_CLK=1;
	      	    	         BJP_DATA=1;
	      	    	         return ;
       	      	}
       	}

      rece_ps2_data[10]=BJP_DATA;      //receive stop
     BJP_CLK=0;

       if(rece_ps2_data[0]==0)
          {
             for(i=1;i<9;i++)
               {
                  if(rece_ps2_data[i]==1)
                    {
                      flag_check=!flag_check;
                    }
               }
          }

             if(flag_check==rece_ps2_data[9])
               {
                   rece_ps2_byte=rece_ps2_data[1];
                   for(i=2;i<9;i++)
                     {
                        rece_ps2_byte=rece_ps2_byte+(rece_ps2_data[i]<<(i-1));
                     }

                   if(rece_ps2_byte==0xfa)
                           {
                           }
                   else
                      {
                         	      AddDataToBuffer(rece_ps2_byte);
                      }
              }



 if(!JP_CLK)
  {
    if(!JP_DATA)
         Timer2_Flag=1;
  }


    TF1=0X00;       
    TMOD=0X60;      
    TL1=0XFF;
    TH1=0XFF;
    TR1=1;
    ET1=1;
    BJP_CLK=1;
    BJP_DATA=1;

}
/*--------------------------------------------------*/
/*                    service_timer2()                   */
/*     read one Byte_Data sending by the Host            */
/*--------------------------------------------------*/
void Service_Timer2(void) interrupt 5 using 2      
{
    EA=0;
    Timer2_Flag=1;
    TF2=0X00;   
    T2CON=0X02;  //Counter2,the falling of T2-pin cause the interrupt
                // 16-bit auto reload mode
    RCAP2H=0XFF;
    RCAP2L=0XFF;
    TH2=0XFF;
    TL2=0XFF;
	ET2=1;
	TR2=1;   
    EA=1;
}

/*--------------------------------------------------*/
/*         read the data from card and send to the host    INT0() */
/*--------------------------------------------------*/

 void Service_Int0(void) interrupt 0 using 0
 {
  uchar  i,j;
  uchar  temp_trk=0;
  uchar  trk_bit=0;
  uchar  trk_xor=0;
  uchar  ES_num=0;
  uint   SS_num=0;
  uchar xdata mag_trk3[108];
  uchar xdata mag_trk2[40];
  uchar xdata mag_trk1[79];
  uint xdata ddd=0;
  bit trk1_send=0,trk2_send=0,trk3_send=0,error=0;
  bit Dir_trk1=0,Dir_trk2=0,Dir_trk3=0;
  uchar SendTrkFlag=0;
  uchar ii=0;
  

  IE0=0X00;  //
  IT0=0;  //1->0 Cause of the int0
  EX0=0;
  WDTC=0X00;  //CLOSE THE WDT

  trk_xor=Lock_Scan();
  if(!trk_xor)
    {
         if(!CheckCard_Flag)
           {
			  IE0=0X00;  
			  IT0=1;  //1->0 Cause of the int0
			  EX0=1;
			  EA=1;
			  BJP_CLK=1;
			  return ;
           }
	}




		 for(i=0;i<79;i++)
		{
		     mag_trk1[i]=0;            ///ini  mag_trk[]
		}

		for(i=0;i<40;i++)
		{
		    mag_trk2[i]=0;
		}

		for(i=0;i<107;i++)
		{
		    mag_trk3[i]=0;
		}
		   ddd=0;
		  while(READER_DATA)
		   {
			     ddd++;
			     if(ddd==600)
			       {
			            EX0=1;
			            IT0=1;
			            BJP_CLK=1;
			            return ;
			       }
		   }

		  READER_CLK=0;   //clr flag bit     4-5us (>500ns)
		  Delay_5us();
		  while(!READER_DATA);
		  READER_CLK=1;
		  Delay_5us();
		  READER_CLK=0;    //stop bit   15us(>=12.4us)
		  Delay_10us();
		  for(i=0;i<16;i++)    //8.6us
		   {
			    READER_CLK=1;      //1.2us       16bit asic version
			    Delay_10us();
			    READER_CLK=0;
		   }
		 /////////////begin the trk1, decide the direction of trk1////////////

		 for(j=0;j<2;j++)
		{
			 for(i=0;i<7;i++)
			{
			 READER_CLK=1;
			 Delay_25us();
			 READER_CLK=0;
			 temp_trk=~READER_DATA;
			 mag_trk1[j]+=temp_trk<<(6-i);    //b0--->b6
			}
		}
		READER_CLK=1;

		if(!mag_trk1[0])    //trk1 is blank
		{
			 for(ddd=0;ddd<594;ddd++)
			 {
			  READER_CLK=1;
			  READER_CLK=0;
			  trk1_send=0;
			 }
			 READER_CLK=1;
		}
		else
		{
		trk1_send=1;
		if(mag_trk1[0]!=0x51)   //  0x51==101,0001b  must be fanxiang
		{
			 Dir_trk1=0;
			 for(ddd=0;ddd<594;ddd++)
			  {
				  READER_CLK=1;
				  READER_CLK=0;
		         }
			   READER_CLK=1;
		}
		else
		{
		            
		             	  	if(mag_trk1[1]!=0x1f)            //  0x1f==001,1111b must be zhengxiang
								{
								       Dir_trk1=1;
					  				for(ddd=0;ddd<594;ddd++)
					  					{
					  						READER_CLK=1;
					  						READER_CLK=0;
					  					}
					  				READER_CLK=1;

⌨️ 快捷键说明

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