CH554键盘主 CapsLock 大小写切换灯

请问键盘大小写按键功能都能时间,怎样让键盘灯点亮或熄灭

当主机检测到numlock按键按下后,会通过控制端点下发set report命令获取当前点灯信息,具体协议可在电脑端装一个bushound查看传输包信息。


1620284456152979.png

1620284456493086.png

从键盘与主机的交互来看:

  1.   CapsLock 按键0x39,所以改程序红线判断。

  2.   主机控制传输,数据和程序中一致。

  3.   主机一个字节OUT传输,这部分不明白,是不是控制传输成功后,在发送一字节的OUT传输(0x03),这部分程序具体怎么写呀。


您好,这个OUT其实是上面一行的CTL控制传输的数据阶段,CTL数据包中首字节最高比特指示的是当前控制传输的数据阶段数据传输方向,0代表主机到设备。BUSHOUND无法完全显示USB链路上的数据包。会和单片机代码行为有一点不同。

对应到我们代码应该是由HostCtrlTransfer()函数完成,函数内部会判断上面说的那个比特位。


等于啥都没说


可以描述一下遇到了什么问题。

运行CH554EVT 键鼠设备代码,在键盘发送caps lock之后,电脑下发相应控制传输时示例代码会执行相应部分,有打印输出指示,此时可以通过控制IO口输出高低电平来实现LED的亮和灭。

image.png


如果需要作主机,EVT包中直接有现成函数,如3#所发的。直接调用即可,本质就是数据阶段为OUT的一次控制传输。



UINT8 tmp[]={0x21,0x09,0x00,0x02,0x00,0x00,0x01,0x00};

UINT8 send_out[3],len,s,m;

if((buf[2]==0x53)&(buf[0]|buf[1]|buf[3]|buf[4]|buf[5]|buf[6]|buf[7]==0))

{

for ( s = 0; s != sizeof( tmp ); s ++ ) {

((PUINT8X)pSetupReq)[ s ] = tmp[s];

}

printf("I am here1! \n");

//printf("%02x ?\n",&len);

s = HostCtrlTransfer( TxBuffer, &len ); ?// 执行控制传输

if(ScrollLock_Sym)

{

Combine_LED =Combine_LED&0xfe;

ScrollLock_Sym=0;

}

else

{

Combine_LED =Combine_LED|0x01;

ScrollLock_Sym=1;

}

send_out[0]=Combine_LED;

printf( "Combine_LED=%d\n",Combine_LED);

if(s==ERR_SUCCESS )

s = HostCtrlTransfer( send_out, 1 ); // 执行控制传输

}

调用原先官方例子不能实现灯控,将官方例程,按照如上更改,能够实现灯控。但是新的问题来了:假如一个键盘在上一次断电时,如CapsLock打开了,我如何判别他?需要初始上电时能够读取键盘CapsLock键值状态。。。


不好意思,我理解错了,是计算机记录上次状态,不是键盘,那么这个问题就不存在了



只有登录才能回复,可以选择微信账号登录