硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3584|回复: 5
收起左侧

[有问必答] USB 按键控制鼠标程序求解惑?

[复制链接]

32

主题

115

回帖

211

积分

高级会员

积分
211
发表于 2018-6-4 22:05:39 | 显示全部楼层 |阅读模式
程序的效果是  按4个按键,可以让鼠标向上 向下 移动,按键触发外部中断,进入中断服务函数,执行这条语句USBD_HID_SendReport(),请问这条语句是怎么控制鼠标的呢?我改了一下buf里的值,本来两个按键一个按,光标往左,另一个往右。改了之后光标都向左了,请问怎么回事呢?我用的是107芯片,USB模块是USBOTGFS,不胜感激最重要的是这条语句怎么控制的鼠标,这个不太清楚,

  1. void EXTI4_IRQHandler(void)
  2. {   
  3.     static  uint8_t buf[4]={0,0x0f,0,0};

  4.     if(EXTI_GetITStatus(EXTI_Line4)!= RESET)
  5.     {   
  6.       if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4)==0);      
  7.       {
  8.         USBD_HID_SendReport (&USB_OTG_dev,
  9.                              buf,
  10.                              4
  11.                              );
  12.        }
  13.     while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4)==0);

  14.     EXTI_ClearITPendingBit(EXTI_Line4);
  15.     }
  16. }
复制代码

这是手册里的内容,我的程序已经把static uint8_t *USBD_HID_GetPos (void)屏蔽掉了,我搞不清楚buf[]数组里的值,是怎么影响鼠标移动的。谢谢

  1. static uint8_t HID_Buffer [4];
  2. USBD_HID_SendReport (&USB_OTG_FS_dev,
  3. USBD_HID_GetPos(),
  4. 4);
  5. static uint8_t *USBD_HID_GetPos (void)
  6. {
  7. HID_Buffer[0] = 0;
  8. HID_Buffer[1] = GetXPos();;
  9. HID_Buffer[2] = GetXPos();
  10. HID_Buffer[3] = 0;
  11. return HID_Buffer;
  12. }
复制代码


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-6-5 01:35:47 | 显示全部楼层
我们早期V3板子有做过这种功能,你得正确设置对应的数据位才行,HID协议里面有说明
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: JoystickSend
  4. *        功能说明: 将摇杆键值发送到USB主机
  5. *        形    参:无
  6. *        返 回 值: 错误代码(无需处理)
  7. *********************************************************************************************************
  8. */
  9. static void JoystickSend(uint8_t Keys)
  10. {
  11.         /*
  12.                 USB鼠标协议,请参见 HID1_11.pdf (第68页)
  13.                
  14.                 每个数据包包括4个字节
  15.                 字节1:bit0 表示左键,bit1表示右键,bit2表示中键;1表示按下,0表示释放
  16.                 字节2: 表示水平偏移量
  17.                 字节3:表示垂直偏移量
  18.                 字节4:报告ID
  19.         */

  20.         uint8_t Mouse_Buffer[4] = {0, 0, 0, 0};
  21.         int8_t X = 0, Y = 0;
  22.        
  23.         switch (Keys)
  24.         {
  25.                 case KEY_DOWN_JOY_LEFT:
  26.                         X -= CURSOR_STEP;
  27.                         break;
  28.                        
  29.                 case KEY_DOWN_JOY_RIGHT:
  30.                         X += CURSOR_STEP;
  31.                         break;
  32.                   
  33.                 case KEY_DOWN_JOY_UP:
  34.                         Y -= CURSOR_STEP;
  35.                         break;
  36.                        
  37.                 case KEY_DOWN_JOY_DOWN:
  38.                         Y += CURSOR_STEP;
  39.                         break;

  40.                 case KEY_DOWN_JOY_OK:                /* 摇杆中键按下, 模拟鼠标左键 */
  41.                 case KEY_DOWN_TAMPER:
  42.                         Mouse_Buffer[0] |= 1;
  43.                         break;
  44.                
  45.                 case KEY_DOWN_USER:                        /* USER键按下,模拟鼠标右键 */
  46.                         Mouse_Buffer[0] |= 2;
  47.                         break;

  48.                 case KEY_DOWN_WAKEUP:                /* WAKEUP键按下,模拟鼠标中键 */
  49.                         Mouse_Buffer[0] |= 4;
  50.                         break;
  51.                
  52.                 case KEY_UP_JOY_OK:                          /* 摇杆中键释放,模拟鼠标右键弹起 */
  53.                 case KEY_UP_USER:                        /* USER键释放,模拟鼠标右键弹起 */
  54.                 case KEY_UP_TAMPER:
  55.                 case KEY_UP_WAKEUP:
  56.                         break;

  57.                 default:
  58.                         return;
  59.         }
  60.        
  61.         /* 填写缓冲区数据 */
  62.         if (bsp_KeyState(KID_TAMPER) == 1)
  63.         {
  64.                 Mouse_Buffer[0] |= 1;
  65.         }

  66.         if (bsp_KeyState(KID_WAKEUP) == 1)
  67.         {
  68.                 Mouse_Buffer[0] |= 4;
  69.         }

  70.         if (bsp_KeyState(KID_USER) == 1)
  71.         {
  72.                 Mouse_Buffer[0] |= 2;
  73.         }

  74.         Mouse_Buffer[1] = X;
  75.         Mouse_Buffer[2] = Y;
  76.        
  77.         /* 复制包含鼠标指针信息的数据到端点1(ENDP1)的发送缓冲区 */
  78.         USB_SIL_Write(EP1_IN, Mouse_Buffer, 4);
  79.        
  80.         /* 使能端点1开始传输 */
  81.         SetEPTxValid(ENDP1);
  82. }
复制代码


回复

使用道具 举报

32

主题

115

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2018-6-5 08:26:48 | 显示全部楼层
您好,HID1_11.pdf  这个是你们出版的手册吗?我这有 103系列的USB手册、107系列的USB手册、USB协议手册,我手里板子是107的,但是在107手册里没有说明,只有前面那个函数那句话。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-6-5 10:15:07 | 显示全部楼层
伊森亨特 发表于 2018-6-5 08:26
您好,HID1_11.pdf  这个是你们出版的手册吗?我这有 103系列的USB手册、107系列的USB手册、USB协议手册, ...

在usb.org上面找下,是HID V1.1协议
回复

使用道具 举报

32

主题

115

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2018-6-6 11:20:50 | 显示全部楼层
eric2013 发表于 2018-6-5 10:15
在usb.org上面找下,是HID V1.1协议

找到了,谢谢,V1.11。
请问LWIP有固件库手册吗?比如如下代码,tcp_new(),这种在官方的手册里并没有说明这个函数是干什么用的,怎么用,我想找个手册,类似stm32的固件库手册似的,对这些函数有一个说明。谢谢
  1. httpd_init(void)
  2. {
  3.   struct tcp_pcb *pcb;

  4.   pcb = tcp_new();
  5.   tcp_bind(pcb, IP_ADDR_ANY, 80);
  6.   pcb = tcp_listen(pcb);
  7.   tcp_accept(pcb, http_accept);
  8. }
复制代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-6-6 11:22:45 | 显示全部楼层
伊森亨特 发表于 2018-6-6 11:20
找到了,谢谢,V1.11。
请问LWIP有固件库手册吗?比如如下代码,tcp_new(),这种在官方的手册里并没有说 ...

lwip的官方手册非常简陋。google前面的就是,需要你自学。

强力向兄弟推荐RL-TCPnet,吊打LwIP
https://forum.anfulai.cn/forum.p ... &extra=page%3D1
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 21:57 , Processed in 0.040969 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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