OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 32129|回复: 44

关于 KEIL提供的JoystickMouse例程 转化为 USB虚拟键盘

[复制链接]

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-12-9 15:03:29 | 显示全部楼层 |阅读模式

我只是USB新手,我只是想叙述一下我如何 将JoystickMouse例程 改为 USB虚拟键盘的过程,以及一些仍未解决的疑惑。
我昨天补了1天的USB知识,对USB的枚举,描述符间的关系,控制传输有个大致清晰了解,但是并不深刻。(为此,我决定随后开始从PDIUSB12芯片开始学习起走)

首先,我们先打开JoystickMouse的例程,先下载进单片机看看,以确保单片机和USB之间的通信是正常(即硬件无问题),如果是正常的,驱动程序安装后,鼠标会跑
先看主函数.
int main(void)
{

#ifdef DEBUG
  debug();
#endif

  Set_System();

  USB_Interrupts_Config();

  Set_USBClock();

  USB_Init();

  while (1)
  {
    Delay(10000);
    if ((JoyState() != 0) & (bDeviceState == CONFIGURED))
    {
      Joystick_Send(JoyState());         //这里便是发送信息至PC机的函数,这个信息可以代表很多设备,主要是看描述符的内容。  
    }
  }
}
要想让Joystick_Send发送控制键盘的信息,我们需要更改描述符.
打开usb_desc.c  usb_desc.h此处是用于编写USB描述符的.c 以及 .h文件
Joystick_DeviceDescriptor 是设备描述符,需要修改一下VID(厂商ID) PID(产品ID)
即更改
0x83,  0x04,  /*idVendor (0x0483)*/
0x10,  0x57,  /*idProduct = 0x5710*/
随意更改下数字即可,我是更改为
0x34, 0x12,/*idVendor (0x1234)*/
0x21, 0x43,/*idProduct = 0x4321*/
其实该处影响并不大,如果ID号不变的话,就会加载之前JoystickMouse的驱动程序(如果成功运行JoystickMouse例程),但是该驱动程序并不满足我们的需求,也就是说和虚拟键盘的描述符之间存在矛盾 .(加载的驱动程序不是我们想要的嘛,肯定就会有问题,换一个ID的话,会重新检测并加载新的驱动程序)


接着改Joystick_ConfigDescriptor,这是配置描述符(注意---配置描述符,接口描述符,HID描述符,端点描述符均包含在其中)
该处参考电脑圈圈的程序,更改为
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
  {
{
 //以下为配置描述符
 0x09, /* bLength: Configuation Descriptor size */
 USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
 JOYSTICK_SIZ_CONFIG_DESC,
 /* wTotalLength: Bytes returned */
 0x00,
 0x01,         /*bNumInterfaces: 1 interface*/
 0x01,         /*bConfigurationValue: Configuration value*/
 0x00,         /*iConfiguration: Index of string descriptor describing
               the configuration*/
 0xC0,         /*bmAttributes: self powered */
 0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/

 //以下为接口描述符
 /************** Descriptor of Joystick Mouse interface ****************/
 /* 09 */
 0x09,         /*bLength: Interface Descriptor size*/
 USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
 0x00,         /*bInterfaceNumber: Number of Interface*/
 0x00,         /*bAlternateSetting: Alternate setting*/
 0x02,         /*bNumEndpoints*/
 0x03,         /*bInterfaceClass: HID*/
 0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
 0x01,         /*bInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
 0,            /*iInterface: Index of string descriptor*/

 //以下为HID描述符
 /******************** Descriptor of Joystick Mouse HID ********************/
 /* 18 */
 0x09,         /*bLength: HID Descriptor size*/
 HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
 0x00,         /*bcdHID: HID Class Spec release number*/
 0x01,
 0x00,         /*bCountryCode: Hardware target country*/
 0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
 0x22,         /*bDescriptorType*/
 JOYSTICK_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/
 0x00,
 
 //以下为输入端点1描述符
 /******************** Descriptor of Joystick Mouse endpoint ********************/
 /* 27 */
 0x07,          /*bLength: Endpoint Descriptor size*/
 USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
 0x81,          /*bEndpointAddress: Endpoint Address (IN)*/
 0x03,          /*bmAttributes: Interrupt endpoint*/
 0x08,          /*wMaxPacketSize: 8 Byte max */
 0x00,
 0x20,          /*bInterval: Polling Interval (32 ms)*/

 //以下为输出端但1描述符
 /* 34 */
 0x07,          /*bLength: Endpoint Descriptor size*/
 USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
 0x01,          /*bEndpointAddress: Endpoint Address (OUT)*/
 0x03,          /*bmAttributes: Interrupt endpoint*/
 0x08,          /*wMaxPacketSize: 8 Byte max */
 0x00,
 0x20,          /*bInterval: Polling Interval (32 ms)*/
/* 41 */
};
这时候编译试试,会发现
error:   #146too many initializer values的问题,很显然给配置描述符数组设定的大小太小了
打开usb_desc.h
将数组大小改为
#define JOYSTICK_SIZ_CONFIG_DESC                41   //是41个字节嘛~


然后改usb_desc.c里面的Joystick_ReportDescriptor(报告描述符)
我们仍然参考电脑圈圈的程序
const u8 Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
{
 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
 0x09, 0x06, // USAGE (Keyboard)
 0xa1, 0x01, // COLLECTION (Application)
 0x05, 0x07, //     USAGE_PAGE (Keyboard/Keypad)
 0x19, 0xe0, //     USAGE_MINIMUM (Keyboard LeftControl)
 0x29, 0xe7, //     USAGE_MAXIMUM (Keyboard Right GUI)
 0x15, 0x00, //     LOGICAL_MINIMUM (0)
 0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 0x95, 0x08, //     REPORT_COUNT (8)
 0x75, 0x01, //     REPORT_SIZE (1)
 0x81, 0x02, //     INPUT (Data,Var,Abs)
 0x95, 0x01, //     REPORT_COUNT (1)
 0x75, 0x08, //     REPORT_SIZE (8)
 0x81, 0x03, //     INPUT (Cnst,Var,Abs)
 0x95, 0x06, //   REPORT_COUNT (6)
 0x75, 0x08, //   REPORT_SIZE (8)
 0x25, 0xFF, //   LOGICAL_MAXIMUM (255)
 0x19, 0x00, //   USAGE_MINIMUM (Reserved (no event indicated))
 0x29, 0x65, //   USAGE_MAXIMUM (Keyboard Application)
 0x81, 0x00, //     INPUT (Data,Ary,Abs)
 0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 0x95, 0x02, //   REPORT_COUNT (2)
 0x75, 0x01, //   REPORT_SIZE (1)
 0x05, 0x08, //   USAGE_PAGE (LEDs)
 0x19, 0x01, //   USAGE_MINIMUM (Num Lock)
 0x29, 0x02, //   USAGE_MAXIMUM (Caps Lock)
 0x91, 0x02, //   OUTPUT (Data,Var,Abs)
 0x95, 0x01, //   REPORT_COUNT (1)
 0x75, 0x06, //   REPORT_SIZE (6)
 0x91, 0x03, //   OUTPUT (Cnst,Var,Abs)
 0xc0        // END_COLLECTION
}; /* Joystick_ReportDescriptor */

好,尝试编译编译。
OK,编译成功,
但是千万不要认为就这样结束了!!!!!!!!!!
Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC]的数组大小还没改呢!
这个必须得改,不改的话,PC机识别不了人体输入设备。
我曾在这里花了很久的时间。。。。。。。这个大小必须改为实际大小
数数行数 1行2个,最后1行1个。
1共61个字节。
返回usb_desc.h中,
#define JOYSTICK_SIZ_REPORT_DESC                61
OK。

描述符就改完了。
现在描述符是用于处理键盘的了。

我们试试编译下载程序,打开设备管理器看看,发现是这样的


 



不用着急,还有些东西也需要改。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-12-9 15:15:56 | 显示全部楼层

我们先打开usb_conf.h

由于我们程序里面会用到EndPoint1的收和发,所以我们需要定义一下EP1的tx buffer地址 和 rx_buffer地址
/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x18)
#define ENDP0_TXADDR        (0x58)

/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0x100)
#define ENDP1_RXADDR  (0xD8)

该处的地址估计可以为任意值,但是不能重复,而且需要一定间隔,具体间隔多少我也不是很清楚,希望有大侠给我说下间隔如何确定(不知道是不是Joystick_Reset.c中的SetEPTxCount(ENDP1, 8);  设置端点长度来确定)

就先不管这个吧~  反正我们把地址给设置好了~

编译~ 没有问题~~


好,我们打开usb_prop.c
该文件适用于Joystick的初始化和复位等。
既然是初始化和复位 Init和Reset肯定比较重要~
首先我们找到Joystick_init

我们注释掉//  Get_SerialNum();

void Joystick_init(void)
{

  /* Update the serial number string descriptor with the data from the unique
  ID*/
//  Get_SerialNum();

  pInformation->Current_Configuration = 0;
  /* Connect the device */
  PowerOn();
  /* USB interrupts initialization */
  _SetISTR(0);               /* clear pending interrupts */
  wInterrupt_Mask = IMR_MSK;
  _SetCNTR(wInterrupt_Mask); /* set interrupts mask */

  bDeviceState = UNCONNECTED;
}
编译下载看看,下载成功后,关机再打开,我们会发现设备管理器里面


 

PC机可以将其视为键盘了。
说实话,我也不知道为什么,为啥把Get_SerialNum();注释掉,就可以成功找到键盘,取消注释的话,会发现仍然识别不了为键盘。知道的大侠能解释下吗?
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-12-9 15:32:44 | 显示全部楼层

就不管那个问题了,
我们接着改。
现在还没完了。
找到Joystick_Reset(void)
更改两个东西
SetEPTxCount(ENDP1, 8);    //该处将端点1的长度设为8  
// SetEPRxStatus(ENDP1, EP_RX_DIS);    此处注释掉  

做到这里,我们离成功已经很近了。

此处重新找到Joystick_Send, 该函数在hw_config.c中
最开始我们就知道,这个函数是用于发送数据给USB的。
现在该数据已是键盘数据了。

我们需要更改下Joystick_Send内部的一些结构。
由于我们报告描述符是移植的电脑圈圈的程序,所以我们需要根据报告描述符来编写Joystick_Send
我们知道端点1的长度为8字节,
所以我们一次给USB发送的字节可以达到8字节。
根据报告描述符中定义的,第一个字节8个位,分别代表功能键的点击情况(功能键即为ctrl alt)等,第二个字节不适用,保留
第3到第8个字节  每个字节代表一个按键。

于是我们知道发送一次数据,最多可以按键6个(5个普通键,1个功能键)

#define KEY_SEL    0x01
#define KEY_RIGHT  0x02
#define KEY_LEFT   0x04
#define KEY_DOWN   0x10
#define KEY_UP     0x08
#define KEY_2      0x20
#define KEY_3      0x40


/*******************************************************************************
* Function Name : Joystick_Send.
* Description   : prepares buffer to be sent containing Joystick event infos.
* Input         : Keys: keys received from terminal.
* Output        : None.
* Return value  : None.
*******************************************************************************/
void Joystick_Send(u8 Keys)
{
  u8 Buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  u8 i;
  i=2;
 
  //对各个按键进行处理。注意,由于这里的摇杆5个按键
  //不可能同时按下,所以返回的普通键数量不会超过6个。
  //如果你的键盘同时按下的普通键能够超过6个的话,就需要做
  //点特殊处理了,将后面6字节全部设置为0xFF,表示按键无法识别。
  if(Keys&KEY_UP)
  {
   Buffer=0x52; //Keyboard UpArrow
   i++;
  }
  if(Keys&KEY_DOWN)
  {
   Buffer=0x51; //Keyboard DownArrow
   i++;
  }
  if(Keys&KEY_LEFT)
  {
   Buffer=0x50; //Keyboard LeftArrow
   i++;
  }
  if(Keys&KEY_RIGHT)
  {
   Buffer=0x4F; //Keyboard RightArrow
   i++;
  }
  if(Keys&KEY_2)
  {
   Buffer=0x39; //Keyboard Caps Lock
   i++;
  }
  if(Keys&KEY_3)
  {
   Buffer=0x53; //Keypad Num Lock and Clear
   i++;
  }
  if(Keys&KEY_SEL)
  {
   Buffer=0x28; //Keyboard Return (ENTER)
  }
  /*copy mouse position info in ENDP1 Tx Packet Memory Area*/
  UserToPMABufferCopy(Buffer, GetEPTxAddr(ENDP1), 8);   //发8个字节
  /* enable endpoint for transmission */
  SetEPTxValid(ENDP1);
}

将该内容整体替代Joystick_Send函数

里面有些#define定义,记得将这些定义也搬到main文件里面,这样可读性更强。

好了,到这里,我们的程序也就差不多了,
回到主函数
我们将while里面的东西全去掉
int main(void)
{

#ifdef DEBUG
  debug();
#endif

  Set_System();

  USB_Interrupts_Config();

  Set_USBClock();

  USB_Init();

  while (1)
  {
       ;
  }
}

我们测试下按键,
把while里面的写成
while(1)
{
    Delay(10000);
  Joystick_Send(KEY_RIGHT);
}
会发现光标一直忘右跑。

如果有这一现象,就代表之前都做对了。

也就实现了虚拟按键

值得注意的是,

Joystick_Send(KEY_RIGHT);
仅代表按键按下,并不代表松开
Joystick_Send(0)才代表松开,
Joystick_Send(0)发送出去为8个字节均是0,这样按键才松开。



大家或许发现我没有写接收端点,恩啊,我只需要发送功能,接收功能就没有写了~  O(∩_∩)O~~

大家可以根据电脑圈圈的来修改。

我来发一个我更改的例子吧~

以及电脑圈圈的例子,我也是仿写的

JoyStickKeyboard(卢晓铭).zip

425.12 KB, 下载次数: 3404

UsbKeyboard.zip

202.38 KB, 下载次数: 3114

回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-12-9 15:43:07 | 显示全部楼层
希望高人帮忙看看我对VID ID需要修改的原因的理解是否正确

我也不知道我有没有理解正确~

另外还有为啥注释掉Get_SerialNum();才能成功枚举到主机,也就是上述红色的字段。我是百思不得其解。

最后还有个问题
USB初始化成功后,我如此写

Delay(10000);
Joystick_Send(KEY_RIGHT);
while(1)

光标并没有任何动作,这是为什么呀?
只有改为在循环内部,才会有作用。。。

我最开始怀疑是延时不够,但是我设了很大的延时,仍然没能起作用。(一定运行到了Joystick_Send了的)。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-12-10 18:31:52 | 显示全部楼层
花了两天时间 终于把JoystickMouse改为虚拟键盘,竟然没人顶。。。。。。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-12-10 22:14:28 | 显示全部楼层
帮顶。
回复 支持 反对

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2012-10-26
在线时间
0 小时
发表于 2012-12-12 17:38:05 | 显示全部楼层
顶。
还没到看懂这些的地步。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
 楼主| 发表于 2012-12-12 19:11:07 | 显示全部楼层
回复【7楼】皮皮鲁:
---------------------------------
USB我也有很多不懂,我打算从PDIUSBD12学习起走。模块都买了,不过还没到,呵呵,最近考试月了,也事情多了。
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-10-27
在线时间
0 小时
发表于 2013-5-30 16:59:41 | 显示全部楼层
辛苦楼主了,小弟也在搞这个,学习了!!!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-6-20
在线时间
0 小时
发表于 2013-8-20 18:18:38 | 显示全部楼层
太厉害了。
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-9-1
在线时间
1 小时
发表于 2013-9-2 00:03:33 | 显示全部楼层
回复【楼主位】lsj9383:
---------------------------------
Lz,关于那个Get_SerialNum()函数,我感觉应该这样的。
首先,这个函数是通过读取STM32内部的96bit Unique ID,然后转成Unicode 码写到Joystick_StringSerial[]这个序列号字符串数组的,而这个数组会被作为字符串描述符返回给Pc作为设备序列号。而主机将联合VID,PID和这个设备序列号用来识别不同设备。由于lz已经插过STM32的USBJoystick了,所以这个设备序列号也就应该被PC登记了,所以可能造成冲突无法识别了。所以不注释该函数的话,改改Joystick_StringSerial[]的内容应该也可以成功识别吧,求验证。
void Get_SerialNum(void)
{
  uint32_t Device_Serial0, Device_Serial1, Device_Serial2;

  Device_Serial0 = *(uint32_t*)ID1;
  Device_Serial1 = *(uint32_t*)ID2;
  Device_Serial2 = *(uint32_t*)ID3;
  
  Device_Serial0 += Device_Serial2;

  if (Device_Serial0 != 0) // ??????0,?±????????????
  {
    IntToUnicode (Device_Serial0, &Joystick_StringSerial[2] , 8); // 18-2=16byte=2*8 8*4=32bit
    IntToUnicode (Device_Serial1, &Joystick_StringSerial[18], 4); // 4*2=8byte 4*4=16bit
  }
}
我要重回研发!!!
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2011-11-14
在线时间
130 小时
发表于 2014-2-11 22:41:16 | 显示全部楼层
最近在看USB,写得很好
回复 支持 反对

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2014-6-8 13:52:02 | 显示全部楼层
不错。我顶!!!!!!
开源的世界,你可以做主!!
回复 支持 反对

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2012-10-18
在线时间
7 小时
发表于 2014-10-26 10:22:49 | 显示全部楼层
这个必须顶啊!
回复 支持 反对

使用道具 举报

28

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2014-10-9
在线时间
6 小时
发表于 2014-11-24 09:08:52 | 显示全部楼层
楼主,可以把joystickmouse的例程共享下么?
拿什么让你自己信服 自己
回复 支持 反对

使用道具 举报

28

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2014-10-9
在线时间
6 小时
发表于 2014-11-24 09:47:17 | 显示全部楼层
在例程文件夹下找到了,见笑了,嘿嘿
拿什么让你自己信服 自己
回复 支持 反对

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2014-8-22
在线时间
0 小时
发表于 2014-12-23 16:47:46 | 显示全部楼层
回复【11楼】colordrv:
---------------------------------
这个好,必须顶!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-1-17
在线时间
1 小时
发表于 2015-1-17 19:48:38 | 显示全部楼层
这个好,必须顶!
回复 支持 反对

使用道具 举报

16

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-6-7
在线时间
6 小时
发表于 2015-2-24 23:00:03 | 显示全部楼层
回复【16楼】真的好多巧合:
---------------------------------
没找到额,例程是STM32F10x_StdPeriph_Lib里边的例程?
不是的话是哪个文档?
回复 支持 反对

使用道具 举报

16

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-6-7
在线时间
6 小时
发表于 2015-2-25 11:23:15 | 显示全部楼层
回复【19楼】insect50:
---------------------------------
找到了STM32_USB-FS-Device_Lib
但是打开JoystickMouse例程提示文件或库函数未安装怎么解决
回复 支持 反对

使用道具 举报

28

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2014-10-9
在线时间
6 小时
发表于 2015-2-26 14:43:40 | 显示全部楼层
回复【20楼】insect50:
---------------------------------
这个就不知道了。我的可以直接打开的。。
拿什么让你自己信服 自己
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-5-6
在线时间
0 小时
发表于 2015-5-8 17:47:21 | 显示全部楼层
楼主,现在有没有高版本库的工程,求分享,谢谢!
回复 支持 反对

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2015-7-25 10:52:15 | 显示全部楼层
mark<>
自在随心
回复 支持 反对

使用道具 举报

12

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2014-9-18
在线时间
47 小时
发表于 2015-7-27 10:27:45 | 显示全部楼层
顶啊,我正想做一个USB游戏手柄,正愁无从下手呢,谢谢分享
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2015-9-5 22:31:49 | 显示全部楼层
回复【3楼】lsj9383:
---------------------------------
我问下,这个#define KEY_3      0x40 按键定义是哪个地方有说明的,我最近在做键盘,麻烦告知一下,谢谢。
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2015-10-14 16:58:28 | 显示全部楼层
回复【25楼】ST-FAE-SALE:
---------------------------------
找到了吗
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复 支持 反对

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2015-10-14 16:59:08 | 显示全部楼层
我想发送一个字母  但是不成功  按键键码怎么组合的?
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2015-10-14 19:00:15 | 显示全部楼层
我找到了,回头补发一份键盘编码的说明书。
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-11-5
在线时间
0 小时
发表于 2015-12-7 10:30:26 | 显示全部楼层
回复【28楼】ST-FAE-SALE:
---------------------------------
可以补发一份吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-1-23
在线时间
5 小时
发表于 2016-1-23 12:04:35 | 显示全部楼层
其实我想说楼主的工程编译不通过
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-4-1
在线时间
2 小时
发表于 2016-4-1 11:41:18 | 显示全部楼层
昨天照您的教程做出来了,可是在while(1)中循环发码时发现只有延时不小于30ms才能保证不漏键,请问有没有什么办法能让程序发码再快一些,我需要至少50HZ甚至100HZ的发码速率
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2012-4-19
在线时间
7 小时
发表于 2016-6-21 16:23:56 | 显示全部楼层
我给你磕头了,你帮了我的大忙
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2015-7-27
在线时间
19 小时
发表于 2016-8-22 20:10:13 | 显示全部楼层
虽然能识别,但是还有一些错误
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-8-16
在线时间
9 小时
发表于 2016-8-23 11:41:09 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-6-16
在线时间
5 小时
发表于 2016-9-3 11:51:44 | 显示全部楼层
你们都是做joystick的  DEVICE,没有人做HOST的么????
回复 支持 反对

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
发表于 2016-9-4 22:06:14 | 显示全部楼层
大神!
回复 支持 反对

使用道具 举报

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
发表于 2016-11-10 19:16:19 | 显示全部楼层
请问楼主,或者论坛有哪位用STM32库函数写了这个D12的驱动了么?可以指导下么?急用,谢谢
回复 支持 反对

使用道具 举报

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
发表于 2016-11-11 09:29:30 | 显示全部楼层
我参考你的代码,用库函数写了D12的驱动,请问下D12数据口输入/输出模式I/O设置成什么模式呢?我现在是设置为 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;                  //开漏输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  //浮空输入
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-12-12
在线时间
12 小时
发表于 2016-12-14 23:35:35 | 显示全部楼层
好东西,谢谢楼主分享?准备通过单片机模拟电脑键盘,看以借鉴
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-7-29
在线时间
10 小时
发表于 2016-12-15 08:54:08 | 显示全部楼层
我也正在做USB键盘,而且基本完成了,但有一个问题,就是接上USB的时候右下角没有弹出我们写好的字符串,但是使用是正常的,不知道什么原因?
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-3-25
在线时间
6 小时
发表于 2017-3-25 16:53:16 | 显示全部楼层
楼主辛苦
回复 支持 反对

使用道具 举报

12

主题

336

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1576
金钱
1576
注册时间
2015-8-9
在线时间
625 小时
发表于 2017-8-10 15:44:56 | 显示全部楼层
移植成功,谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-4-26
在线时间
2 小时
发表于 2018-11-30 00:46:05 | 显示全部楼层
JoystickMouse例程 ,哪里可以下载得到,请发个到我邮箱 85420154@qq.com
回复 支持 反对

使用道具 举报

13

主题

276

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2014-6-20
在线时间
146 小时
发表于 2021-1-27 13:32:01 | 显示全部楼层
这么好的东西,必须顶一个,我也正好需要用到
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-12
在线时间
2 小时
发表于 2021-5-4 17:26:08 | 显示全部楼层
谢谢楼主分享,最近正在分析这个代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 13:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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