請(qǐng)問鍵盤大小寫按鍵功能都能時(shí)間,怎樣讓鍵盤燈點(diǎn)亮或熄滅
當(dāng)主機(jī)檢測(cè)到numlock按鍵按下后,會(huì)通過控制端點(diǎn)下發(fā)set report命令獲取當(dāng)前點(diǎn)燈信息,具體協(xié)議可在電腦端裝一個(gè)bushound查看傳輸包信息。
從鍵盤與主機(jī)的交互來看:
? CapsLock 按鍵0x39,所以改程序紅線判斷。
? 主機(jī)控制傳輸,數(shù)據(jù)和程序中一致。
? 主機(jī)一個(gè)字節(jié)OUT傳輸,這部分不明白,是不是控制傳輸成功后,在發(fā)送一字節(jié)的OUT傳輸(0x03),這部分程序具體怎么寫呀。
您好,這個(gè)OUT其實(shí)是上面一行的CTL控制傳輸?shù)臄?shù)據(jù)階段,CTL數(shù)據(jù)包中首字節(jié)最高比特指示的是當(dāng)前控制傳輸?shù)臄?shù)據(jù)階段數(shù)據(jù)傳輸方向,0代表主機(jī)到設(shè)備。BUSHOUND無法完全顯示USB鏈路上的數(shù)據(jù)包。會(huì)和單片機(jī)代碼行為有一點(diǎn)不同。
對(duì)應(yīng)到我們代碼應(yīng)該是由HostCtrlTransfer()函數(shù)完成,函數(shù)內(nèi)部會(huì)判斷上面說的那個(gè)比特位。
等于啥都沒說
可以描述一下遇到了什么問題。
運(yùn)行CH554EVT 鍵鼠設(shè)備代碼,在鍵盤發(fā)送caps lock之后,電腦下發(fā)相應(yīng)控制傳輸時(shí)示例代碼會(huì)執(zhí)行相應(yīng)部分,有打印輸出指示,此時(shí)可以通過控制IO口輸出高低電平來實(shí)現(xiàn)LED的亮和滅。
如果需要作主機(jī),EVT包中直接有現(xiàn)成函數(shù),如3#所發(fā)的。直接調(diào)用即可,本質(zhì)就是數(shù)據(jù)階段為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 ); ?// 執(zhí)行控制傳輸
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 ); // 執(zhí)行控制傳輸
}
調(diào)用原先官方例子不能實(shí)現(xiàn)燈控,將官方例程,按照如上更改,能夠?qū)崿F(xiàn)燈控。但是新的問題來了:假如一個(gè)鍵盤在上一次斷電時(shí),如CapsLock打開了,我如何判別他?需要初始上電時(shí)能夠讀取鍵盤CapsLock鍵值狀態(tài)。。。
不好意思,我理解錯(cuò)了,是計(jì)算機(jī)記錄上次狀態(tài),不是鍵盤,那么這個(gè)問題就不存在了