小磷光一

BF533读取鼠标数据的中断函数

0
阅读(2570)

 

****************************************************************************/ 
#include "cdefBF533.h"
#include "dm_bf5xx.h"

int_t   mkey;
static uint8_t   Time; //CLK 计数
static uint8_t   parity;// 奇偶校验位
extern int_t   WR;						// 中断程序中是发送子程序还是接收子程序 WR=1 发送
									// WR =0 接收
extern int_t   sendok ;
extern int_t   newflag ;
extern int_t   mcmd ;

/****************************************************************************
* 名称 : EX_INTERRUPT_HANDLER(FlagA_ISR_M)
* 功能 : 鼠标中断处理函数
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
EX_INTERRUPT_HANDLER(FlagA_ISR_M)
{
 	uint16_t   data;
 	uint8_t   i;
 	
	if(WR==0) 
		{
		    PS2_DAT_DIR_IN();
     		do{
     		    i = *pCtrIn_Int_B;
    			}while((Mouse_INT&i));         
    		if ((Time > 0) && (Time< 9))    
      			{
           			READ_PF_STAT(data);
           			if((data & SDA)==0)
            			{
                			mkey = mkey >> 1;
            			}
            		if((data&SDA)==0x0002)
            			{
                			mkey = mkey >> 1;
              				mkey = mkey | 0x80; 	
            			}
        		}
     		Time++;
     		do{
				i = *pCtrIn_Int_B;
	    		}while(!(i&Mouse_INT));         
     		if(Time>=10)	  
     			{
     			    newflag = 1;                // 标志新的数据接收到
       				*pFIO_FLAG_C = 0x0020;             //清中断       
       				Time=0;                       
     			}	
		}
	if(WR==1)  
		{
     		do{
     			i = *pCtrIn_Int_B ;
    			}while((Mouse_INT&i));    	
      			if((Time>=0) && (Time< 11))                 
       				{
       					if((Time>=0) && (Time< 8))
     	    				{
				 				if((mcmd&0x01)==0) 
                 					{
                  						CLR_PF(SDA);
	                   					 mcmd = mcmd>>1;
                 					}	
	            				else 
	            					{
	                    				SET_PF(SDA);
	                    				mcmd = mcmd>>1;
	                    				parity = parity+1;
	            					}
     	    				}
     	   				 if((Time >7) && (Time< 9))     
							{
     	       					parity=parity%2;
								if(parity == 0)
     	        					{ 
     	               					SET_PF(SDA);
     	        					}
     	       					if(parity == 1)
     	        					{
     	                				CLR_PF(SDA);
     	        					}	
     	    				}        
     	    			if((Time >8) && (Time< 10)) 
     	     				{      
     	        				SET_PF(SDA);                
     	        				PS2_DAT_DIR_IN();           
     	    				}  
						if((Time >9) && (Time< 11)) 
     	     				{
     	        				READ_PF_STAT(data);        
                				if((data&SDA)==0)
                				{
                				    sendok = 1;                     // 标志发送结束                
                				}  
     	    				 }
      				}         
      		Time++;
     		do{
				i = *pCtrIn_Int_B;
     			}while(!(i&Mouse_INT));                             
      		if (Time > 10)  
      			{ 
      			parity = 0;
       	 		Time = 0;
        		       *pFIO_FLAG_C = 0x0020;             //清中断
        		WR = 0;               
      			}
		}
}