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 + -
显示快捷键?