基于RISC-V CH32V103的鼠标键盘摇杆手柄Joystick学习开发板–实例Eg3_KeyBoard

3.3 实例Eg3_KeyBoard

本节我们目标是实现模拟键盘的功能,枚举一个具有Shift键+1~8键的模拟键盘功能;

3.3.1硬件设计

同第一章节

3.3.2 软件设计

在上一章节的基础上,我们在USB_DevTransProcess中找到报告描述符的获取,并修改为如下内容

case USB_DESCR_TYP_REPORT:
if(((pSetupReqPak->wIndex)&0xff) == 0)     //接口0报表描述符
{pDescr = KeyboardRepDesc;                      //数据准备上传len = sizeof(KeyboardRepDesc);Ready = 1;             //如果有更多接口,该标准位应该在最后一个接口配置完成后有效
}
else len = 0xff;                                //本程序只有2个接口,这句话正常不可能执行
break;

另外Keyboard的报告描述符KeyboardRepDesc如下

const UINT8  MouseRepDesc[]=
{0x05, 0x01, // USAGE_PAGE (Generic Desktop)0x09, 0x06, // USAGE (Keyboard)0xa1, 0x01, // COLLECTION (Application)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x08, // REPORT_COUNT (8)0x81, 0x02, // INPUT (Data,Var,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,Var,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,Var,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,Var,Abs)0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)0x81, 0x00, // INPUT (Data,Ary,Abs)0xC0        // END_COLLECTION
};

然后是报文数据的处理如下:

uint8_t Keyboad_Buf[8]={0};
uint8_t lastshift=0,currentshift=0;
uint8_t lastkeycode[8]={0},currentkeycode[8]={0};
static uint8_t KdataFL=0;
//处理并上报数据
void Keyboard_Handle(void)
{   memset(Keyboad_Buf,0,8);uint8_t i=0;uint8_t idx=2;if(SW1==1){currentshift|=0x02;Keyboad_Buf[0]=currentshift;}else{currentshift&=(~0x02);Keyboad_Buf[0]=currentshift;}if(UPKEY==0){currentkeycode[0]=CODE1;}else{currentkeycode[0]=0x00;}if(DNKEY==0){currentkeycode[1]=CODE2;}else{currentkeycode[1]=0x00;}if(LFKEY==0){currentkeycode[2]=CODE3;}else{currentkeycode[2]=0x00;}if(RGKEY==0){currentkeycode[3]=CODE4;}else{currentkeycode[3]=0x00;}if(BKKEY==0){currentkeycode[4]=CODE5;}else{currentkeycode[4]=0x00;}if(MDKEY==0){currentkeycode[5]=CODE6;}else{currentkeycode[5]=0x00;}if(STKEY==0){currentkeycode[6]=CODE7;}else{currentkeycode[6]=0x00;}if(TBKEY==0){currentkeycode[7]=CODE8;}else{currentkeycode[7]=0x00;}for(i=0;i<8;i++){if(currentkeycode[i]!=lastkeycode[i]){Keyboad_Buf[idx]=currentkeycode[i];if(++idx>=8){idx=2;}KdataFL=1;}else{Keyboad_Buf[idx]=0x00;}}if(currentshift!=lastshift){KdataFL=1;}if(KdataFL!=0){KdataFL=0;while( Endp1Busy ){;                                               //如果忙(上一包数据没有传上去),则等待。}Endp1Busy = 1;                                      //设置为忙状态memcpy(pEP1_IN_DataBuf, Keyboad_Buf, 8);DevEP1_IN_Deal(8);}Delay_Ms(5);memcpy(lastkeycode,currentkeycode,8);lastshift=currentshift;
}

最后是main函数,只改了while中的Keyboard_Handle();

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);Delay_Init();USART_Printf_Init(115200);printf("SystemClk:%d\r\n",SystemCoreClock);printf("USBHD Device Test\r\n");pEP0_RAM_Addr = EP0_Databuf;pEP1_RAM_Addr = EP1_Databuf;pEP2_RAM_Addr = EP2_Databuf;USBHD_ClockCmd(RCC_USBCLKSource_PLLCLK_1Div5,ENABLE);USB_DeviceInit();NVIC_EnableIRQ( USBHD_IRQn );ADC_DMA_CONF();KEY_INIT();while(1){printf("X=%d,Y=%d\r\n",ADC_ConvertedValue[0],ADC_ConvertedValue[1]);if(Ready){Keyboard_Handle();}}
}

3.3.3 下载验证

我们把固件程序下载进去可以,打开“设备与打印机”可以看到USB设备枚举成了一个“LD Keyboard”,如下图。

我们打开一个键盘测试网页,地址如下:
https://keyboard.bmcx.com/
按摇杆按键SW1即为shift键按下,其他键分别对应主键盘的1~8;shift+1-8键也可以组合;

视频教程:https://www.bilibili.com/video/BV17r4y1z758/

基于RISC-V CH32V103的鼠标键盘摇杆手柄Joystick学习开发板--实例Eg3_KeyBoard相关推荐

  1. [STM32F1]基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备

    序: 其实这样一个设备我们在ch32v103上实现过,但移植到STM32 HAL库上面,还是发现很多问题的,现在就移植过程给大家分享一下在基于STM32 HAL库实现鼠标键盘摇杆的USB复合设备的实现 ...

  2. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~3鼠标键盘和手柄引擎

    魔塔之拯救白娘子 完整工程下载地址: xInput.cls 这个模块处理鼠标键盘和手柄的输入. 'impactX Game Engine '本类模块用于处理鼠标键盘和手柄的输入 '使用本类模块必须遵守 ...

  3. 基于Qt的智能车载系统嵌入式项目(正点原子IMX6ULL开发板)

    基于正点原子的IMX6ULL开发板的智能车载系统(Qt) 提示:该项目借鉴了不少大佬的代码,我没有自己造轮子(代码在文章末尾,同时附上参考链接 ) 本人其他项目链接基于linux的智能仓储项目 基于Q ...

  4. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】

    基于单片机stm32f407的单机小游戏----贪吃蛇小游戏 1.介绍 这是我花一个星期完成的一个简单地单机贪吃蛇小游戏项目,芯片是stm32f407,项目是基于正点原子-探索者开发板完成的,有需要的 ...

  5. 2.23 haas506 2.0开发教程 - KeyPad - 矩阵键盘(仅支持M320开发板)

    haas506 2.0开发教程 - KeyPad - 矩阵键盘 矩阵键盘 320矩阵键盘连线 案例说明 测试代码 功能测试 class - KeyPad keypad.init() - 初始化keyp ...

  6. 基于TI C55x架构的定点TMS320VC5509A音频专用DSP处理器开发板规格书

    TL5509-EVM是一款基于广州创龙TI C55x架构的定点TMS320VC5509A低功耗核心板SOM-TL5509设计的高端DSP开发板,底板采用沉金无铅工艺的2层板设计,它为用户提供了SOM- ...

  7. Python 技术篇-基于PyHook3+threading多线程实现鼠标单击事件和双击事件的识别实例演示

    这里我设定了一个变量 time_k 和 1 秒的多线程延迟变量来控制. # -*- coding: UTF8 -*-import PyHook3 import pythoncom import thr ...

  8. python控制51单片机的红绿灯_基于51单片机的红绿灯实现(使用普中科技开发板)...

    C语言基础比较薄弱,红绿灯的倒计时和切换上,用了三个if()嵌套,总感觉应该有更好的方案,如果你恰巧知道,请教教我,在此谢过.以下是程序部分: //红绿灯设计:利用定时器实现LED灯亮灭,数码管倒计时 ...

  9. 基于stm32通过HC_05(ZS-040)蓝牙模块用手机控制stm32开发板上led灯的亮灭

    文章目录 前言 一.HC-05蓝牙是什么? 二.应用实例步骤 1.使用AT指令对蓝牙的初始化 2.打开手机蓝牙助手查看是否搜索到该蓝牙 3.用蓝牙模块代替TTL连接stm开发板 4.创建项目开始配置相 ...

最新文章

  1. java代码(dex)注入
  2. get post乱码解决
  3. 大话文本分类之Fnet
  4. python语言是谁发明的咋读-Python的发明,竟然是因为他不喜欢花括号。
  5. 配置文件占位符||Profile——1、多Profile文件 2、yml支持多文档块方式 3、激活指定profile
  6. 揭秘富人的22种习惯与风格
  7. 敏捷项目向组合级看齐
  8. texlive写论文源代码_Texlive 2020 编译胡伟《latex2e完全学习手册》后记字体右倾90度...
  9. sqlserver无法连接到服务器的常见原因和解决办法
  10. Jfinal weixin源码分析---碎碎念(看最后,有福利)
  11. java判断1到1000素数_JAVA作业.找出1~1000以内的质数
  12. python小区管理系统设计_小区物业管理系统设计与实现
  13. 【专栏必读】软件工程导论第六版(张海藩)专栏学习笔记目录导航
  14. CENTOS安装XXNET
  15. 电脑主板报警声音的故障现象对照表
  16. cad插入块_如何实现CAD图纸块的插入及合并操作
  17. vue3+ts 实现防抖功能
  18. Grafana监控安装和监控看板创建
  19. x64 可变参数原理完全解析
  20. my ReadTravel_Singapore / singapore / xinjiapo / lvyou / travel

热门文章

  1. Android LibJpeg图片压缩
  2. 企业应该深思团队来自不易
  3. Linux Shell接收键盘输入
  4. 66岁比尔盖茨离婚!27年前与下属恋爱修成正果,现在“无法共同成长”,分割8000亿财产
  5. curl查询出口IP
  6. 2020年4月30日 星期四 晴 爱情
  7. main函数带命令行参数的使用
  8. mysql如何进入数据库查看所有表
  9. 【Windows】这台电脑无法运行 Windows 11 问题解决
  10. 李敏镐赌场照曝光 经纪公司:是合法的娱乐(图)