打印

求助USB键盘问题

[复制链接]
2874|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
8410430|  楼主 | 2011-4-6 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
买了圈圈的书,用到里面的键盘功能,
试验中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.由于串口改为接收数据,原来的代码串口调试函数全部删掉了。删除后,有通过按键方式测试,正常。

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

相关帖子

沙发
nevsayno| | 2011-4-6 10:43 | 只看该作者
拔了线也有可能收到串口数据的 例如干扰信号
还是先检查下串口电路和驱动代码吧

使用特权

评论回复
板凳
8410430|  楼主 | 2011-4-6 11:05 | 只看该作者
应该是不至于向楼上说的,拔了线还可以收到串口数据,

使用特权

评论回复
地板
8410430|  楼主 | 2011-4-6 11:12 | 只看该作者
相关驱动代码,已经列出在上面,就是检查很多次,总是不得头绪
关键代码是:
向USB口发送数据的是:
if(getchar != 0){
        SendReport();
        getchar = 0;
}
其中getchar是在串口中断中赋值的
if(RI)    //收到数据
{
  RI=0;   //清中断请求
  getchar = SBUF;
}

使用特权

评论回复
5
8410430|  楼主 | 2011-4-6 15:05 | 只看该作者
为了不沉,自己顶

使用特权

评论回复
6
wfbisheng| | 2011-4-6 23:01 | 只看该作者
没看懂,帮顶!

使用特权

评论回复
7
8410430|  楼主 | 2011-4-7 08:22 | 只看该作者
第二天了,还没有结果!!!!!!!!!

使用特权

评论回复
8
8410430|  楼主 | 2011-4-8 09:45 | 只看该作者
大侠救命啊

使用特权

评论回复
9
8410430|  楼主 | 2011-4-9 15:50 | 只看该作者
总算是弄清楚了,是对HID设备协议理解上有问题,发送完按键有效符后,还要发送按键终止符号。

使用特权

评论回复
10
Step1toStep5| | 2011-4-9 16:09 | 只看该作者
我刚买了圈圈的 在等呢 嘎嘎

使用特权

评论回复
11
iccai| | 2011-4-9 17:16 | 只看该作者
去年年末我弄了本圈圈的书,在做键盘时,得到的经验是,要把ctrl,shift,alt,gui按键放到一个列扫上,也就是一次就扫描完成这几个键,以在比如
if(i==1)不必加判断就可以读出这几个功能键,不需要在判断,加快了扫描速度

使用特权

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

本版积分规则

8

主题

45

帖子

0

粉丝