搜索
bottom↓
回复: 25

请教在设计USB键盘的时候怎么才能达到一直按下的效果

[复制链接]

出0入10汤圆

发表于 2014-5-22 16:21:01 | 显示全部楼层 |阅读模式
1.最近在看圈圈的键盘,可是好像没有办法做到一直按下某个键的效果,按下的频率很高也行,但是貌似换了晶振键盘按下的频率还是不够高,怎么做才能有上述效果?
2.同时发送两个按键会出问题,慢了许多的样子,不知道是否我在其中加了个MPU6050读数据造成的。
单片机是STC12C5A60S2,晶振是27M。
主程序是跟圈圈的书差不多的
  1. while(1)  //死循环
  2. {
  3.                 if(D12GetIntPin()==0) //如果有中断发生
  4.                 {
  5.                  D12WriteCommand(READ_INTERRUPT_REGISTER);  //写读中断寄存器的命令
  6.                  InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器
  7.                  if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
  8.                  if(InterruptSource&0x40)UsbBusReset();   //总线复位中断处理
  9.                  if(InterruptSource&0x01)UsbEp0Out();     //端点0输出中断处理
  10.                  if(InterruptSource&0x02)UsbEp0In();      //端点0输入中断处理
  11.                  if(InterruptSource&0x04)UsbEp1Out();     //端点1输出中断处理
  12.                  if(InterruptSource&0x08)UsbEp1In();      //端点1输入中断处理
  13.                  if(InterruptSource&0x10)UsbEp2Out();     //端点2输出中断处理
  14.                  if(InterruptSource&0x20)UsbEp2In();      //端点2输入中断处理
  15.                 }
  16.                  if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
  17.                 {
  18.                  if(!Ep1InIsBusy)  //如果端点1输入没有处于忙状态,则可以发送数据
  19.                  {
  20.                          SendReport();  //则返回报告
  21.                  }
  22.                 }
  23. }
复制代码
SendReport(); 发送按键的内容,按下一个按键的程序,思路是,先获取MPU6050陀螺仪的Y轴角速度,然后数据处理判断下,再发送按键,另一个读取X轴的角速度,类似这个。
  1.   Value_Of_Y_Gyro=GetData(GYRO_YOUT_H);
  2.                 temp=abs(Value_Of_Y_Gyro);
  3.                 if(temp>10)
  4.                 {
  5.                         if(Value_Of_Y_Gyro<0)
  6.                         {
  7.                                 Last_Y_Key=DOWN_KEY;
  8.                                 Buf[i]=DOWN_KEY;  
  9.                         }
  10.                         else
  11.                         {
  12.                                 Last_Y_Key=UP_KEY;
  13.                                 Buf[i]=UP_KEY;  //
  14.                         }
  15.                 }
  16.                 else
  17.                 {
  18.                         Buf[i]=Last_Y_Key;
  19.                 }
复制代码

出0入0汤圆

发表于 2014-5-22 16:45:28 来自手机 | 显示全部楼层
"一直按下"的效果是由系统实现的
下位机只需在"按下"和"弹起"时发送一次即刻

出0入10汤圆

 楼主| 发表于 2014-5-22 17:19:49 | 显示全部楼层
zgxcom123 发表于 2014-5-22 16:45
"一直按下"的效果是由系统实现的
下位机只需在"按下"和"弹起"时发送一次即刻 ...

那么怎么才能控制他的弹起呢?哪些是相关的?

出0入10汤圆

 楼主| 发表于 2014-5-23 12:48:12 | 显示全部楼层
谁来帮忙解决下这个问题呢?

出0入0汤圆

发表于 2014-5-23 13:18:46 | 显示全部楼层

如图,楼主看到了应该知道怎么做了把

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入10汤圆

 楼主| 发表于 2014-5-23 16:20:50 | 显示全部楼层
tianheiGE 发表于 2014-5-23 13:18
如图,楼主看到了应该知道怎么做了把

谢谢,数字1键按下是发送00 00 59 00 00 00 00 00,如果发送完这个我没有发送其他的话,就是一直在按下?这样子好像不对啊?还是我上面的程序有问题,上面的Buf=DOWN_KEY; 就是8个字节后面6个其中一个。我做了实验,现象不是这样子的。大神能否再解释清楚一点?我也在做你的那个游戏,有时想一直按着up键才能加速,频率很快按下但是经常松开的话有时候是加不了速的

出0入0汤圆

发表于 2014-5-23 18:05:38 | 显示全部楼层
10xjzheng 发表于 2014-5-23 16:20
谢谢,数字1键按下是发送00 00 59 00 00 00 00 00,如果发送完这个我没有发送其他的话,就是一直在按下? ...

我的是一直按下的,你试试看像我这样填充发送数据的缓存区行不行,即按键值分配在固定的位置放置

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-5-23 18:09:34 | 显示全部楼层
10xjzheng 发表于 2014-5-23 16:20
谢谢,数字1键按下是发送00 00 59 00 00 00 00 00,如果发送完这个我没有发送其他的话,就是一直在按下? ...

我的理解是这样的,数字1键按下是发送00 00 59 00 00 00 00 00,如果你下次发送00 00 XX 00 00 00 00 00(XX表示别的按键值)即别的按键按下,则可能系统认为你按键1释放了,你可以试试看。

出0入0汤圆

发表于 2014-5-23 19:12:12 | 显示全部楼层
按下时发送一个按下码,如果松开了就发送一个释放码! 如果按下和释放中间间隔时间很长,这个驱动层处理的,不用你费心。

出0入0汤圆

发表于 2014-5-23 19:15:26 | 显示全部楼层
tianheiGE 发表于 2014-5-23 18:09
我的理解是这样的,数字1键按下是发送00 00 59 00 00 00 00 00,如果你下次发送00 00 XX 00 00 00 00 00 ...

不对,你首先得释放一次吧?你这样理解虽然思路是对的,但是程序上实现貌似很不合理,释放的按键应该发送释放码,要不然你第二个发送的XX很快就会发一串XX字符在电脑上,因为驱动是从59开始就计算按下时间的。

出0入0汤圆

发表于 2014-5-23 20:30:50 | 显示全部楼层
cumtgao 发表于 2014-5-23 19:15
不对,你首先得释放一次吧?你这样理解虽然思路是对的,但是程序上实现貌似很不合理,释放的按键应该发送 ...

你看下这段话,记得这段话我记得是从圈圈那看到的。

貌似没有所谓的释放码,按下什么就返回什么,要是前面按下的按键没有再返回则释放了,应该是这样了把

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入10汤圆

 楼主| 发表于 2014-5-24 08:42:53 | 显示全部楼层
cumtgao 发表于 2014-5-23 19:15
不对,你首先得释放一次吧?你这样理解虽然思路是对的,但是程序上实现貌似很不合理,释放的按键应该发送 ...

释放码是什么样子的?能否告知我一下?

出0入10汤圆

 楼主| 发表于 2014-5-24 08:50:37 | 显示全部楼层
tianheiGE 发表于 2014-5-23 18:05
我的是一直按下的,你试试看像我这样填充发送数据的缓存区行不行,即按键值分配在固定的位置放置
...

那我猜send_buffer[]这个数组是一个全局变量或者是静态变量,可能我知道了,回去试下。

出0入0汤圆

发表于 2014-5-24 10:21:49 | 显示全部楼层
10xjzheng 发表于 2014-5-24 08:42
释放码是什么样子的?能否告知我一下?

我反正做USB键盘时,释放时就8个字节全发0就可以了

出0入10汤圆

 楼主| 发表于 2014-5-24 11:35:02 | 显示全部楼层
tianheiGE 发表于 2014-5-23 20:30
你看下这段话,记得这段话我记得是从圈圈那看到的。

貌似没有所谓的释放码,按下什么就返回什么,要是前 ...

试了下,是可以的,原来按下就是我们之前那样子发送,若要松开,就是发送0x00就好,但是发现按下多个键好像不行,求解?
  1. Buf[2]=LEFT_KEY;
  2. Buf[3]=UP_KEY;
复制代码

出0入10汤圆

 楼主| 发表于 2014-5-24 11:36:52 | 显示全部楼层
cumtgao 发表于 2014-5-24 10:21
我反正做USB键盘时,释放时就8个字节全发0就可以了

对的,试验过,果然是这样

出0入0汤圆

发表于 2014-5-24 11:52:44 | 显示全部楼层
10xjzheng 发表于 2014-5-24 11:35
试了下,是可以的,原来按下就是我们之前那样子发送,若要松开,就是发送0x00就好,但是发现按下多个键好 ...

你一个按键行了,其它应该是可以的才是,

出0入10汤圆

 楼主| 发表于 2014-5-24 12:00:45 | 显示全部楼层
tianheiGE 发表于 2014-5-24 11:52
你一个按键行了,其它应该是可以的才是,

谢啦,我先把姿态融合那部分搞好再试下,不然用原始数据来玩飞车真的是很坑爹,不像pitch,row

出0入0汤圆

发表于 2014-5-24 12:06:09 | 显示全部楼层
楼主查看下USB键盘发送的数据码就知道了!!

出0入10汤圆

 楼主| 发表于 2014-5-24 12:36:27 | 显示全部楼层
passage110 发表于 2014-5-24 12:06
楼主查看下USB键盘发送的数据码就知道了!!

知道了,射射

出0入0汤圆

发表于 2014-5-25 11:01:23 | 显示全部楼层
10xjzheng 发表于 2014-5-24 11:35
试了下,是可以的,原来按下就是我们之前那样子发送,若要松开,就是发送0x00就好,但是发现按下多个键好 ...

如果你用的矩阵扫描方式,有没有考虑过电平冲突问题?

出0入10汤圆

 楼主| 发表于 2014-5-25 12:49:13 | 显示全部楼层
cumtgao 发表于 2014-5-25 11:01
如果你用的矩阵扫描方式,有没有考虑过电平冲突问题?

我是通过程序判断之后来给发送按键的,还是感觉有点问题。

出0入0汤圆

发表于 2014-5-25 14:28:01 来自手机 | 显示全部楼层
之前做鼠标键盘也是看圈圈的,他的貌似不能同时发,对于飞车,之前本想开定时器去发数据,发现效果不怎么好,不知道别人的游戏手柄怎么发送数据的

出0入10汤圆

 楼主| 发表于 2014-5-25 15:37:58 | 显示全部楼层
wanyyxum 发表于 2014-5-25 14:28
之前做鼠标键盘也是看圈圈的,他的貌似不能同时发,对于飞车,之前本想开定时器去发数据,发现效果不怎么好 ...

呵,不知道要不要发个帖子问下其他大神圈圈的USB键盘是不是不能同时发送两个还有怎么解决

出0入0汤圆

发表于 2014-5-25 22:23:21 | 显示全部楼层
10xjzheng 发表于 2014-5-25 15:37
呵,不知道要不要发个帖子问下其他大神圈圈的USB键盘是不是不能同时发送两个还有怎么解决 ...

他的那个主要是在按键检测的时候只检测一个按键就退出了,然后就传给主机,所以不能发多个建。现在我是在用电位器模拟左右,所以就不知道怎么把它和其他的按键整合在一起弄出很好的效果。现在我用它来玩QQ飞车,就是不能漂移,倒是可以左(右)和前一起发送,不过车就是跑不快了!我想可能就是在硬件检测上和数据发送上还要改进,不知道有没有这个做的很好的,希望大神共享了!

出0入10汤圆

 楼主| 发表于 2014-6-2 14:56:44 | 显示全部楼层
结贴总结下:如果你发送相应的键值比如0x59之类的过去之后,键盘是处于一直按下的状态,除非你发送多个00过去他就松开了,至于为什么圈圈的那个不能两个按键同时按下,这个还需要探讨。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 00:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表