打印
[圈圈教你玩USB]

求助USB键盘问题

[复制链接]
2509|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
8410430|  楼主 | 2011-4-4 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
买了圈圈的书,用到里面的键盘功能,
试验中USB键盘实现用的是一个单独的小板,用的是STC11F05E,和USBD12,移植后单独用按键测试的时候没有问题,后面改用串口接收命令,再发送相应的指令。
如发送的是左移键的命令,则用文本观察,光标一直左移动,查了一阵总没差出来,请帮忙看看是哪里出了问题!
这边是窜口的代码;
void InitUART(void)
{
EA=0; //暂时关闭中断
TMOD&=0x0F;  //定时器1模式控制在高4位
TMOD|=0x20;    //定时器1工作在模式2,自动重装模式
SCON=0x50;     //串口工作在模式1
TH1=256-Fclk/(BitRate*12*16);  //计算定时器重装值
TL1=256-Fclk/(BitRate*12*16);
PCON|=0x80;    //串口波特率加倍
ES=1;         //串行中断允许
TR1=1;        //启动定时器1
REN=1;        //允许接收
EA=1;         //允许中断
getchar = 0;
}
////////////////////////End of function//////////////////////////////

/********************************************************************
函数功能:串口中断处理。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void UartISR(void) interrupt 4
{
if(RI)    //收到数据
{
  RI=0;   //清中断请求
  getchar = SBUF;
}
else      //发送完一字节数据
{
  TI=0;
}
}

下面是主函数发送的相关代码:
  if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
  {
   if(!Ep1InIsBusy)  //如果端点1输入没有处于忙状态,则可以发送数据
   {
     if(getchar != 0){
        SendReport();
        getchar = 0;
     }
   }
  }

下面是USB发送函数的代码:
void SendReport(void)
{
uint8 Buf[8]={0,0,0,0,0,0,0,0};
//由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
uint8 i;

i = getchar;
if(i < 5){
     //根据不同的按键设置输入报告
     if(i == 0x01) //如果KEY1按住
     {
      Buf[3]|=0x50;  //KEY1为左Ctrl键。
     }
     else if(i == 0x02) //如果KEY1按住
     {
      Buf[3]|=0x4f;  //KEY1为左Ctrl键。
     }
     else if(i == 0x03) //如果KEY1按住
     {
      Buf[3]|=0x52;  //KEY1为左Ctrl键。
     }
     else if(i == 0x04) //如果KEY1按住
     {
      Buf[3]|=0x52;  //KEY1为左Ctrl键。
     }
     //报告准备好了,通过端点1返回,长度为8字节。
     D12WriteEndpointBuffer(3,8,Buf);
     Ep1InIsBusy=1;  //设置端点忙标志。
     i = 0;
}

getchar = 0;
}

1.最开始以为是一直其他串口在一直对他发送命令,直接拔掉窜口线,问题依然。
2.由于串口改为接收数据,原来的代码串口调试函数全部删掉了。删除后,有通过按键方式测试,正常。

请帮忙看看,这何种问题,或需要用什么方法进行调试。
谢谢了

相关帖子

沙发
8410430|  楼主 | 2011-4-6 09:52 | 只看该作者
怎么都没人回复,是人气问题吗?

使用特权

评论回复
板凳
computer00| | 2011-4-21 13:19 | 只看该作者
应该是因为发了按键按下报告,而没有发送按键弹起的报告(清0),导致系统认为键一直处于按住状态。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

45

帖子

0

粉丝