csd_keyprocess.c

来自「cypresscy74294ic键盘和鼠标原码」· C语言 代码 · 共 502 行 · 第 1/2 页

C
502
字号
	    delay_ms( XXms ); 
	    Beep_Switch(0);  
}

//扫描键盘,赋值:位特性(ScanArrayImage 40位),表示哪个键按下,函数返回同时有几个键被按下
BYTE ScanAllKey( void )
{
     BYTE KeyPressCnt,tmp,tmp2;
     //BYTE KeyPressCnt = 0; //,LoopKeyCounter,
     BYTE ncount,j;   //,key_val=0,key_pos;
  
     KeyPressCnt = 0;
     CSD_1_ScanAllSensors(); //scan all sensors in array ( buttons )  
     CSD_1_UpdateAllBaselines(); //Update all baseline levels;
     //detect if any sensor is pressed  
	   if(CSD_1_bIsAnySensorActive())//有键按下
	   {  
       
       ////BeepDelayXXms( 50 ); //测试用,先确认有键按下了
           
		   // Add user code here to proceed the sensor touching
		   for( ncount=0;ncount<KEY_NUM_DIV8;ncount++ )//将API返回的位图移动到App位图
		        ScanArrayImage[ncount] = CSD_1_baSnsOnMask[ncount];//CSD_baSnsOnMask[]为 API 返回的按键位图
		   for( ncount=0;ncount<KEY_NUM_DIV8;ncount++ )//计算位图中1的个数,即按下键的个数.
		      for( j=0;j<8;j++ )
		      {
		          tmp = 1 << j; tmp2 = ScanArrayImage[ncount]; tmp = tmp2 & tmp;
		          if( tmp != 0 )
		              KeyPressCnt ++;
		          //KeyPressCnt += (ScanArrayImage[ncount] & (1<<j))? 1:0;      
		      }    
	   }
	   //if( KeyPressCnt >= 1 )
	   //    BeepDelayXXms( 50 ); //测试用,看按下了多少个键
	   return KeyPressCnt;//返回 按下键的个数
}

//计算当前按键的顺序号(从 1 开始计数)
BYTE CalcRealKeyNum( void )
{
	  BYTE i,j,cnt=0;
	  BYTE tmp,tmp2;
	  for( i=0;i<5;i++ )
	  {
	     for( j=0;j<8;j++ )
	     {
          tmp = 1 << j; tmp2 = ScanArrayImage[i]; tmp = tmp2 & tmp;
          if( tmp != 0 )//if( ScanArrayImage[i] & (1<<j) )
	     	  	  break; 
	     	  else
	     	  	  cnt ++;	  
	     }
	     if( j!= 8 )
	     	  break;
	  }
	  if( j==8 ) return 0;
	  return cnt+1;
}

//是控制键,改变控制键状态值
void  ChangeKeyStatus( BYTE C_Code ) //BYTE SetOrReset )
{
	  char ch_str[2]={0,0},ChrIndex;
	  
	  switch( C_Code )
	  { 
	  	case 0xA1: //NumLock
	  		   KeyProStatus.NumLockFlg = (KeyProStatus.NumLockFlg)? FlgReset:FlgSet;
	  		   break;
	  	case 0xA2: //Ctrl
	  		   KeyProStatus.CtrlFlg = (KeyProStatus.CtrlFlg)? FlgReset:FlgSet;
	  		   break;
	  	case 0xA3: //Shift
	  		   KeyProStatus.ShiftLockFlg = (KeyProStatus.ShiftLockFlg)? FlgReset:FlgSet;
               //Beep_Switch(KeyProStatus.ShiftLockFlg);
	  		   break;
	    case 0xA4: //ArrowLock
	    	   KeyProStatus.ArrowLockFlg = (KeyProStatus.ArrowLockFlg)? FlgReset:FlgSet;
	    	   break;	   
	  	case 0xA5: //Shift and CAP
	  		   KeyProStatus.CapsLockFlg = (KeyProStatus.CapsLockFlg)? FlgReset:FlgSet;
	  		   LED_ShiftCAP_Switch(KeyProStatus.CapsLockFlg);
	  		   break;
    }
}

//控制键/字符键查表处理,取得HID设备定义的键值,送USB
//返回 主键值 与 修饰键值 AppendKeycode[0]
//当返回主键值 >0x80,用户按下的为 控制键
//控制键/字符键查表处理,取得HID设备定义的键值,送USB
//返回 主键值 与 修饰键值 AppendKeycode[0]
//当返回主键值 >0x80,用户按下的为 控制键
BYTE  SearchKeyTab( BYTE RealKeyNum,BYTE AppendKeycode[] )
{
    	BYTE TabIndex=0,ChrIndex;
    	//char chr_str[2]={0,0};
    	
    	AppendKeycode[0] = 0;

    	ChrIndex = KeyProStatus.NumLockFlg;
    	ChrIndex |= KeyProStatus.CtrlFlg << 1;
    	ChrIndex |= KeyProStatus.ShiftLockFlg << 2;
    	ChrIndex |= KeyProStatus.ArrowLockFlg << 3;
    	ChrIndex |= KeyProStatus.CapsLockFlg << 4;  //大写锁定键按下
    	if(ChrIndex==0)                     //无控制键锁定,立即返回 主键值
    	{	
         if(FirstKeyArray[RealKeyNum][0]==0x1F) //'@'
         {   //对于 主键值 亦为 上挡代码的特殊处理
         	  	AppendKeycode[0] = 2; //shift 修饰键
         	    return FirstKeyArray[RealKeyNum][0];
         }
         else	  
    		    return FirstKeyArray[RealKeyNum][0];
    	}
    		 
    	if( FirstKeyArray[RealKeyNum][0]>0xA0 ) //是 控制键,立即返回 主键值
    		 return FirstKeyArray[RealKeyNum][0];

    	if( KeyProStatus.CapsLockFlg == 1 && KeyProStatus.ShiftLockFlg == 0) //Shift and Cap 控制键锁定 处理 (未按下shift)
    	{   //是 a--z 字符
          if( (FirstKeyArray[RealKeyNum][0]>=0x04) && (FirstKeyArray[RealKeyNum][0]<=0x1D) )
          {    //返回 大写
               AppendKeycode[0] = 2;
               return FirstKeyArray[RealKeyNum][0];
          }
          else
          {
               if( FirstKeyArray[RealKeyNum][0]==0x1F ) //对 '@' 符号的特殊处理
                   AppendKeycode[0] = 2; //shift 修饰键               
               return FirstKeyArray[RealKeyNum][0];    
          }
      }
    	
    	if( KeyProStatus.CtrlFlg == 1 ) //Ctrl 控制键锁定 处理
    	{
    	  AppendKeycode[0] = 1;
    	  //KeyProStatus.CtrlFlg = 0;
    	  return FirstKeyArray[RealKeyNum][0];	
    	}	

    	if(KeyProStatus.ShiftLockFlg == 1) //shift 控制键锁定 处理
    	{
    		 
    		 //此处 增加了 对于 ( FirstKeyArray[RealKeyNum][1] & 0x04 ) 的处理:处理上挡变换数字键
    		 if( (FirstKeyArray[RealKeyNum][1] & 0x08) || (FirstKeyArray[RealKeyNum][1] & 0x04) ) //此键 有 Shift 定义,找附表
    		 {   
    		 	   //取得 修饰键值
    		 	   AppendKeycode[0] = FirstKeyArray[RealKeyNum][1]>>4;
    		 	   //准备 查 附表
    		 	   TabIndex = FirstKeyArray[RealKeyNum][1] & 0x0f;
    		 	   ChrIndex = FirstKeyArray[RealKeyNum][2];
    		 }
    		 else //此键无 shift 定义,所以返回 主键
    		 	   return FirstKeyArray[RealKeyNum][0];	   
    		 //KeyProStatus.ShiftLockFlg = 0; //将 shift 标志复位
    	}

    	if(KeyProStatus.NumLockFlg == 1) //NumLock 控制键锁定 处理
    	{
    		 if( FirstKeyArray[RealKeyNum][1] & 0x04 ) //此键 有NumLock 定义,找附表
    		 {   
    		 	   //取得 修饰键值
    		 	   AppendKeycode[0] = FirstKeyArray[RealKeyNum][1]>>4;
    		 	   //准备 查 附表
    		 	   TabIndex = FirstKeyArray[RealKeyNum][1] & 0x0f;
    		 	   ChrIndex = FirstKeyArray[RealKeyNum][2];
    		 }
    		 else //此键无 NumLock 定义,所以返回 主键
    		 	   return FirstKeyArray[RealKeyNum][0];	   
    		 //KeyProStatus.NumLockFlg = 0; //将 NumLock 标志复位
    	}
      
    	if(KeyProStatus.ArrowLockFlg == 1) //ArrowLock 控制键锁定 处理
    	{
    		 if( FirstKeyArray[RealKeyNum][1] & 0x01 ) //此键 有 Arrow 定义,找附表
    		 {   
    		 	   //取得 修饰键值
    		 	   AppendKeycode[0] = FirstKeyArray[RealKeyNum][1]>>4;
    		 	   //准备 查 附表
    		 	   TabIndex = FirstKeyArray[RealKeyNum][1] & 0x0f;
    		 	   ChrIndex = FirstKeyArray[RealKeyNum][2];
    		 }
    		 else //此键无 Arrow 定义,所以返回 主键
    		 	   return FirstKeyArray[RealKeyNum][0];	   
    		 //KeyProStatus.ArrowLockFlg = 0; //将 NumLock 标志复位
    	}
      
      //查 附表
      switch( TabIndex )
      {
        case 1://光标附表
        	ChrIndex = ArrowKeyArray[ChrIndex-1];
        	break;
        case 4://数字附表
        	ChrIndex = NumKeyArray[ChrIndex-1];
        	break;
        case 8://shift附表
        	ChrIndex = ShiftKeyArray[ChrIndex-1];
        	break;	
      }
      return ChrIndex;//返回键值
}

BYTE  USB_KeyAct[2];//存放返回USB的键盘数据  [0]修饰码,[1]主键值
BYTE  KeyErrCnt;    //错误键处理的次数

//返回 0 无需向USB返回,返回 1 需要向USB返回 USB_KeyAct[]。
BYTE  KeyPressMain( void )
{
	  BYTE  GetKeys;
	  BYTE  RealKeyNum;   //扫描键序号
 
	  //扫描键盘,赋值:位特性(40位),表示哪个键按下,返回同时有几个键被按下
	  ////if( (GetKeys = ScanAllKey()) > 1 )//按下 多于一个键,认为无效
	  ////	 return 0;//无需USB返回
    GetKeys = ScanAllKey();//这里放开条件了
    if( GetKeys > 2 )
        return 0;
    //向 USB 返回 按键的个数,测试电路板
    /*
    if( GetKeys > 0 ) //调试用,返回同时按下键的个数
    {   return 1; }
    else
    {   return 0;  }
    */
    
	    RealKeyNum = CalcRealKeyNum(); //计算当前按键的顺序号(从 1 开始计数)
        if( RealKeyNum == 0 )
            return 0;
        else 
            RealKeyNum--;    
	    
	    ////BeepDelayXXms( 50 ); //测试用,进入键处理
	    //USB_KeyAct[1] = NumKeyArray[RealKeyNum]; //返回 键序号
        //return 1;        
	    
        USB_KeyAct[1] = SearchKeyTab( RealKeyNum,USB_KeyAct );//查表得到返回USB的修饰值和键值
        
        if( USB_KeyAct[1] != 0 )
        {
            //BeepDelayXXms( 50 ); //响铃,表示按键有效
            //是控制键
            if( USB_KeyAct[1]>0xA0 )
            {
               ChangeKeyStatus( USB_KeyAct[1] );//改变控制键状态值
               BeepDelayXXms( 50 ); //响铃,表示按键有效
               delay_ms( 500 );//此处延时为防抖动  
               return 0;            	 
            }
            else
        	   return 1;//1->用籱行Ъ

⌨️ 快捷键说明

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