找回密码
 立即注册
查看: 2095|回复: 17

51开源 USB 三键摸鱼 键盘@STC32G, 或者自己改成STC8H8K64U

[复制链接]
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2023-10-11 09:45:41 | 显示全部楼层 |阅读模式
    51开源 USB 三键摸鱼 键盘@STC32G, 或者自己改成STC8H8K64U
    截图202310110938143822.jpg
    成品如上图所示!话不多说开始介绍功能!开源程序源代码见附件
    一、功能介绍:
    单机版键盘的按键功能如下图所示,一共有3+6个按键,正面的三个按键就是机械键盘的可插拔键轴,侧面六个按键(上三个,下三个)是侧贴的沉板按键.
    1.    ┌────键4-───键5-───键6-───┐
    2.    │   ┌───┐  ┌───┐  ┌───┐   │
    3.    │   │键1│  │键2│  │键3│   C         <=== 连接数据线的TYPEC口
    4.    │   └───┘  └───┘  └───┘   │
    5.    └────键7-───键8-───键9-───┘
    6.    默认按键参数:
    7.            键4 = 数字1
    8.            键5 = 数字2
    9.            键6 = 数字3
    10.            键7 = 数字4
    11.            键8 = 数字5
    12.            键9 = 数字6
    13.            键1 = CTRL+C
    14.            键2 = CTRL+V
    15.            键3 = ALT+TAB
    复制代码
    另外板子上还有三个全彩WS2812的LED,驱动代码已经写好(基于DMA-SPI驱动,有效减少cpu占用),和一个PWM驱动的无缘蜂鸣器!


    二、代码讲解:

    开始代码前自行预习前面的知识:
    2.USB复合设备(CDC+HID)分析:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4080


    基于前面的两个章节,已经可以实现设备插入电脑识别出USB CDC和HID设备了,那么后面就很简单了!
    (1)CDC数据处理:
    1. void usb_out_ep3()
    2. {
    3.     BYTE csr;
    4.         BYTE cnt;
    5.         u8 dat[64];
    6.         
    7.     usb_write_reg(INDEX, 3);
    8.     csr = usb_read_reg(OUTCSR1);
    9.     if (csr & OUTSTSTL)
    10.     {
    11.         usb_write_reg(OUTCSR1, OUTCLRDT);
    12.     }
    13.     if (csr & OUTOPRDY)
    14.     {
    15.         cnt = usb_read_reg(OUTCOUNT1);
    16.         while (cnt)
    17.         {
    18.                         CDC_RxBuffer[CDC_RxBuffer_cnt++] =  usb_read_reg(FIFO3);
    19.                         cnt--;
    20.         }
    21.                 CDC_RxBuffer[CDC_RxBuffer_cnt]  = '\0';
    22.                
    23.                 if(strcmp(CMD_ReadParm,CDC_RxBuffer)==0)
    24.                 {
    25.                         USBCON = 0x00;      //清除USB设置11111111
    26.                         USBCLK = 0x00;
    27.                         IRC48MCR = 0x00;
    28.                         
    29.                         Delay20ms();
    30.                         IAP_CONTR = 0x60;   //触发软件复位,从ISP开始执行                        
    31.                 }               
    32.                
    33.         if (RxWptr - RxRptr >= 256 - EP1OUT_SIZE)
    34.         {
    35.             UsbOutBusy = 1;
    36.         }
    37.         else
    38.         {
    39.             usb_write_reg(OUTCSR1, 0);
    40.         }                        
    41.     }
    42. }
    复制代码

    因为CDC占用的端点3,所以只需要在端点3的接收函数里处理下数据,这里将接收到的数据保存在CDC_RxBuffer里,数据个数保存在CDC_RxBuffer_cnt里,当然这里其实还有一个小技巧,为了配合上位机实现不停电下载,这里还加了一段字符串比较函数,如果接受到的字符串是"@STCISP#"就会进入下载模式!!只需要配合ISP软件的这个即可实现不停电下载!!
    截图202310110953063656.jpg

    当然这个CDC最主要的功能当然不是只用一个不停电下载,是为了后面的上位机修改按键键码和自定义灯光特效!(既然都讲到了,那就提前放个上位机的半成品图片预告一下咯,还没做完,界面有点丑)

    截图202310110955556604.jpg

    上面是接收处理,这里由于数据不处理,仅供测试,那么这里直接把接收到的数据直接回传到上位机,这里就可以在主函数里添加如下内容“
    1. if((CDC_RxBuffer_cnt>0)&&( !UsbInBusy  ))                                                //如果CDC有接受到数据
    2.         {
    3.                 CDC_SendData(CDC_RxBuffer,CDC_RxBuffer_cnt);                                //CDC串口发回数据
    4.                 CDC_RxBuffer_cnt = 0;                                                                                //清空数据
    5.                
    6.         }
    复制代码


    这里判断哪个按键按下之后通过KEYNUM_Read函数读取内部的按键键码数据(因为后面会通过上位机将键码数据保存到内部EEPROM,所以这里提前编写好了一个接口便于后期直接替换),这里的键码数据如下如所示
    1. u8 KEYNUM0[8] = { 0X00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };                //空白
    2. u8 KEYNUM1[8] = { 0X01,0x00,0x06,0x00,0x00,0x00,0x00,0x00 };                //复制
    3. u8 KEYNUM2[8] = { 0X01,0x00,0x19,0x00,0x00,0x00,0x00,0x00 };                //粘贴
    4. u8 KEYNUM3[8] = { 0X04,0x00,0x2b,0x00,0x00,0x00,0x00,0x00 };                //界面切换
    5. u8 KEYNUM4[8] = { 0X00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00 };                //数字1
    6. u8 KEYNUM5[8] = { 0X00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00 };                //数字2
    7. u8 KEYNUM6[8] = { 0X00,0x00,0x20,0x00,0x00,0x00,0x00,0x00 };                //数字3
    8. u8 KEYNUM7[8] = { 0X00,0x00,0x21,0x00,0x00,0x00,0x00,0x00 };                //数字4
    9. u8 KEYNUM8[8] = { 0X00,0x00,0x22,0x00,0x00,0x00,0x00,0x00 };                //数字5
    10. u8 KEYNUM9[8] = { 0X00,0x00,0x23,0x00,0x00,0x00,0x00,0x00 };                //数字6
    复制代码


    装填好了八个数据的键码,这里就可以开始准备发送数据了,发送之前

    1.判断端口是否空闲
    2.如果空闲先给他置忙碌
    3.选择对应的USB端点(这里是端点1)
    4.8个字节的数据写入该端点的缓存
    5.开启发送
    具体的代码见上面!

    当然这里为什么键码是八个字节的呢!
    USB键盘数据包含8个字节,他们所代表的数据分别如下:
    截图202310111006251956.jpg


    所以,这里列举两个例子
    1.发送数值1的键码(BYTE2写入0X1E,这个数据的由来见代码包里的HID码表):0X00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00
    2.发送CTRL+c的键码(BYTE0写入0x01,BYTE2写入0X1E,这个数据的由来见代码包里的HID码表):0X01,0x00,0x06,0x00,0x00,0x00,0x00,0x00
    3.发送1+2+3的键码:0X00,0x00,0x1e,0x1f,0x20,0x00,0x00,0x00
    以此类推@


    (3)WS2812数据处理:
    相信很多小伙伴都有做WS2812的时候,但是很多人还是用的延时,但是延时的时候一旦某个中断响应一下就必死无疑了,这里用一种SPI+DMA的方式实现基本0占用时间的方式
    1.配置SPI
    1. void SPI_init(void)
    2. {
    3.     P_SW1 = (P_SW1 & ~(3<<2)) | (3<<2);                                                            //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P5.4 P4.0 P4.1 P4.3, 3: P3.5 P3.4 P3.3 P3.2
    4.     SSIG = 1;                                                                                                                 //忽略 SS 引脚功能,使用 MSTR 确定器件是主机还是从机
    5.     SPEN = 1;                                                                                                                 //使能 SPI 功能
    6.     DORD = 0;                                                                                                                 //先发送/接收数据的高位( MSB)
    7.     MSTR = 1;                                                                                                                 //设置主机模式
    8.     CPOL = 0;                                                                                                                 //SCLK 空闲时为低电平,SCLK 的前时钟沿为上升沿,后时钟沿为下降沿
    9.     CPHA = 0;                                                                                                                 //数据 SS 管脚为低电平驱动第一位数据并在 SCLK 的后时钟沿改变数据
    10.     SPCTL = (SPCTL & ~3) | 3;                                                                           //SPI 时钟频率选择, 0: 4T, 1: 8T,  2: 16T,  3: 2T
    11.         P32=P33=P34=0;                                                                                                        //端口电平设置为低电平
    12.     HSCLKDIV = 0x01;                                                                                        //高速时钟8分频,默认2分频。开漏模式通过10K电阻上拉到3.3V,电平上升速度慢,需要降低SPI速率才能正常通信。
    13. }
    复制代码

    2.配置DMA
    1. void DMA_Config(void)
    2. {
    3.         DMA_SPI_STA = 0x00;                                
    4.         DMA_SPI_CFG = 0xE0;                                                                                                //bit7 1:Enable Interrupt
    5.         DMA_SPI_AMT = 0xff;                                                                                                //设置传输总字节数:n+1
    6.         DMA_SPI_TXAH = (u8)((u16)&DmaTxBuffer >> 8);                                        //SPI发送数据存储地址
    7.         DMA_SPI_TXAL = (u8)((u16)&DmaTxBuffer);
    8.         DMA_SPI_RXAH = (u8)((u16)&DmaRxBuffer >> 8);                                        //SPI接收数据存储地址
    9.         DMA_SPI_RXAL = (u8)((u16)&DmaRxBuffer);
    10.         DMA_SPI_CFG2 = 0x01;                                                                                        //01:P2.2
    11.         DMA_SPI_CR = 0x81;                                                                                                //bit7 1:使能 SPI_DMA, bit6 1:开始 SPI_DMA 主机模式, bit0 1:清除 SPI_DMA FIFO
    12. }
    复制代码
    这里其实只需要发送数据,所以接收的不配置也可以。

    实际测试在24MHZ的情况下,这个SPI发出的数据为F0就是0码的电平,FF就是1码的电平!关于这个电平和WS2812驱动原理的描述可以看帖子:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=292

    有了上面的基础,剩下的是需要把颜色数据写入缓存,让DMA自己去刷新就好了!这样24个字节就是一个灯的颜色数据,DMA控制spi发出24个数据就能点亮一个灯,且24色数据就是 绿,红,蓝的数据,这里先调用一个函数将颜色数据写入缓存:
    1. void WS_Write(u8 num,u8 g,u8 r,u8 b)
    2. {
    3.         u16 i;
    4.         num = num -1;
    5.         color[num] = ((((u32)g)<<16)+(((u32)r)<<8)+(((u32)b)<<0));                //当前的颜色数值写入数组
    6.         
    7.         for(i=0;i<8;i++)                                                                                                //循环八次,先将绿色的数值写入缓存数组
    8.         {
    9.                 if( (1<<(7-i))& g )                                                                                        //如果是1
    10.                         DmaTxBuffer[24*num+i] = 0xff;                                                        //写入1码电平对应的数据
    11.                 else                                                                                                                //如果是0
    12.                         DmaTxBuffer[24*num+i] = 0xf0;                                                        //写入0码电平对应的数据
    13.         }
    14.         for(i=0;i<8;i++)                                                                                                //循环八次,先将红色色的数值写入缓存数组
    15.         {
    16.                 if( (1<<(7-i))& r )                                                                                        //如果是1
    17.                         DmaTxBuffer[24*num+i+8] = 0xff;                                                        //写入1码电平对应的数据
    18.                 else                                                                                                                //如果是0
    19.                         DmaTxBuffer[24*num+i+8] = 0xf0;                                                        //写入0码电平对应的数据
    20.         }        
    21.         for(i=0;i<8;i++)                                                                                                //循环八次,先将蓝色的数值写入缓存数组
    22.         {
    23.                 if( (1<<(7-i))& b )                                                                                        //如果是1
    24.                         DmaTxBuffer[24*num+i+16] = 0xff;                                                //写入1码电平对应的数据
    25.                 else                                                                                                                //如果是0
    26.                         DmaTxBuffer[24*num+i+16] = 0xf0;                                                //写入0码电平对应的数据
    27.         }               
    28. }
    复制代码

    然后控制颜色自动切换并刷新就好了
    1. void WS_task(void)
    2. {
    3.         u8 i;
    4.         static u16 tim=0;                                                                                                //计时变量
    5.         
    6.         if( tim<2048 )                                                                                                        //如果时间小于2048ms
    7.         {
    8.                 for(i=0;i<12;i++)                                                                                        //循环12次
    9.                 {
    10.                         WS_Write(i+1,(u8)0,0,tim/8);                                                        //给12个灯都写入蓝色,蓝色的数值= 时间/8,数值逐渐变大
    11.                 }
    12.         }
    13.         else if( tim<4096 )                                                                                                //如果时间小于2048ms
    14.         {
    15.                 for(i=0;i<12;i++)                                                                                        //循环12次
    16.                 {
    17.                         WS_Write(i+1,(u8)0,0,(4095-tim)/8);                                                //给12个灯都写入蓝色,数值变小
    18.                 }
    19.         }
    20.         
    21.         tim++;                                                                                                                        //计时变量自加
    22.         if( tim>4096 )                                                                                                        //大于4096,自动清0
    23.                 tim=0;
    24.         
    25.         SPI_Write_Nbytes(24*12);                                                                                //刷新颜色
    26. }
    复制代码
    当然这里实现的就是一个最简单的蓝色呼吸效果(个人喜欢蓝色,所以就写了这个,当然也可以自己通过调用WS_Write函数写入自己喜欢的颜色,最后通过SPI_Write_Nbytes输出控制灯显示响应的颜色即可)

    (4)蜂鸣器处理:
    这里的蜂鸣器由于是无源的,所以要用PWM给他提供方波信号!
    1. void PWM_Init(void)
    2. {
    3.     PWMB_CCER1 = 0x00;                                                                                                 //写 CCMRx 前必须先清零 CCxE 关闭通道
    4.     PWMB_CCMR2 = 0x68;                                                                                                //配置PWM模式
    5.     PWMB_CCER1 = 0x30;                                                                                                 //配置通道输出使能和极性
    6.     PWMB_ARRH = (u8)(PWM_PERIOD >> 8);                                                                 //设置周期时间
    7.     PWMB_ARRL = (u8)PWM_PERIOD;
    8.         
    9.     PWMB_ENO = 0x00;
    10.     PWMB_ENO |= ENO6P;                                                                                                 //使能输出
    11.     PWMB_PS = 0x00;                                                                                                    //高级 PWM 通道输出脚选择位
    12.     PWMB_PS |= PWM6_1;                                                                                                 //选择 PWM7_1 通道
    13.     PWMB_BKR = 0x80;                                                                                                   //使能主输出
    14.     PWMB_CR1 |= 0x81;                                                                                                  //使能ARR预装载,开始计时        
    15. }
    复制代码
    代码比较简单,就不介绍了,看不懂的可以去看视频教程!
    1. void PWM_Set(u16 fre)
    2. {
    3.         if( fre>0 )                                                                                                                //如果频率大于0
    4.         {
    5.                 PWMB_ARRH = (u8)(fre >> 8);                                                                 //设置周期时间
    6.                 PWMB_ARRL = (u8)fre;        
    7.                 PWMB_CCR6H = (u8)((fre/2) >> 8);                                                         //设置占空比时间
    8.                 PWMB_CCR6L = (u8)((fre/2));
    9.                 PWMB_ENO |= ENO6P;                                                                                         //使能输出
    10.         }        
    11.         else
    12.                 PWMB_ENO = 0;                                                                                                 //关闭输出
    13. }
    复制代码
    这里直接控制蜂鸣器开始和关闭


    最终主函数的代码如下图所示!!
    1. void main()
    2. {
    3.     WTST = 0;                                                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    4.     EAXFR = 1;                                                                                                                 //扩展寄存器(XFR)访问使能
    5.     CKCON = 0;                                                                                                                 //提高访问XRAM速度
    6.         
    7.         P5M0 = 0X10;P5M1 = 0X00;                                                                                  //设置为准双向口
    8.         P3M0 = 0X00;P3M1 = 0X00;                                                                                  //设置为准双向口
    9.         P2M0 = 0X00;P2M1 = 0X00;                                                                                  //设置为准双向口
    10.         P1M0 = 0X00;P1M1 = 0X00;                                                                                  //设置为准双向口
    11.         
    12.     uart_init();                                                                                                        //串口初始化(这里备用)
    13.     usb_init();                                                                                                                //usb初始化,作为CDC+HID复合设备
    14.         Timer0_Init();                                                                                                        //定时器0初始化,提供ms时基                        
    15.         SPI_init();                                                                                                                //SPI初始化,这里驱动WS的灯
    16.         DMA_Config();                                                                                                        //DMA初始化
    17.         WS_Init();                                                                                                                //ws灯的驱动参数初始化
    18.         PWM_Init();                                                                                                                //驱动蜂鸣器的PWM初始化
    19.         PWM_Set(6000);                                                                                                        //打开蜂鸣器
    20.     EA = 1;                                                                                                                        //使能总中断               
    21.         Delay50ms();                                                                                                        //延时50ms,测试蜂鸣器
    22.         PWM_Set(0);                                                                                                                //关闭蜂鸣器
    23.         
    24.     while (1)
    25.     {
    26.                 if (DeviceState != DEVSTATE_CONFIGURED)                                                //等待USB连接完成
    27.                         continue;
    28.                
    29.                 if( tim_1ms )                                                                                                //1MS定时到达
    30.                 {
    31.                         tim_1ms=0;
    32.                         CDC_task();                                                                                                //串口修改数据任务
    33.                         HID_task();                                                                                                //HID发送键码任务
    34.                         WS_task();                                                                                                //灯光控制任务
    35.                 }         
    36.     }
    37. }
    复制代码

    源代码放在附件了,有需要的自行下载!
    有需要成品的也可以直接在这链接购买:https://item.taobao.com/item.htm ... ECf&id=742811211185
    最后插一嘴:注意:代码里的VID和PID不能随意使用,仅供参考,商用的话请向STC官方申请或自行购买,不然出现任何问题本作者概不负责!

    键盘MCU_单机版.rar

    325.8 KB, 下载次数: 72

    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

    积分
    14067
    发表于 2023-10-11 11:15:23 | 显示全部楼层
    要看懂这个【USB摸鱼】的程序,可能还得来上课
    =============================================
    USB 原理实战16课时】,视频教学已完美完成 ,大学标准课程
    【10月/9号,10月/11号】USB基本原理教学视频, 已上传
    10月/16号USB-HID 通信 实战】教学视频超级完美, 已上传
                 是对着协议代码一行一行的讲解,认真听的都说会了
    10月/18号下午USB-CDC虚拟串口 实战】教学视频, 已上传
                 USB-CDC虚拟串口 / 就是最简单最强大的串口
                 是对着协议代码一行一行的讲解,认真听的都说会了

    请帮忙转发给可能需要:从0开始了解 USB 同学/同事/老师/研发人员
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4526&extra=&page=1
    =========================================
    CAN 原理实战8课时】,教学视频,制作中,后续直接看视频回放

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 142 天

    [LV.7]常住居民III

    29

    主题

    559

    回帖

    2118

    积分

    荣誉版主

    积分
    2118
    发表于 2023-10-11 11:25:56 | 显示全部楼层
    回复 送花

    使用道具 举报

    该用户从未签到

    9

    主题

    293

    回帖

    1706

    积分

    版主

    积分
    1706
    QQ
    发表于 2023-10-11 11:53:54 | 显示全部楼层
    本帖最后由 32位8051-STCAI 于 2023-10-11 11:58 编辑

    原理图:
    截图202310111158152817.jpg

    电子DIY小家-V1.pdf (16.91 KB, 下载次数: 37)

    QQ:1463035472,微信:19952583954
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
     楼主| 发表于 2023-10-17 15:56:25 | 显示全部楼层
    本帖最后由 电子DIY小家 于 2023-10-17 15:58 编辑

    有小伙伴再问这个要怎么下载代码:
    一、USB-CDC不停电下载(上一次下载的程序里需要包含一段不停电下载的代码才可以使用):
    USB线连接之后,进行如下设置
    截图202310171554597749.jpg 截图202310171555107537.jpg

    上述设置完成之后,打开代码,点击下载等待完成即可

    二、LINK1D下载:
    LINK1D连接电脑和小键盘之后,按照如下设计即可:

    截图202310171557103017.jpg

    如果下载窗口出现等待USB-HID,把这两个勾勾去掉就可以了,
    截图202310171558068709.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:46
  • 签到天数: 148 天

    [LV.7]常住居民III

    13

    主题

    280

    回帖

    3278

    积分

    论坛元老

    积分
    3278
    发表于 2023-10-17 18:36:33 | 显示全部楼层
    冲哥开源作品继续玩,想怎么定义怎么定义。


    众辕汽修,专业汽车维修
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

    积分
    14067
    发表于 2023-10-23 13:31:17 | 显示全部楼层
    网友问:这个 USB-HID键盘 扩展成支持 :
    控制电脑:音量+ /
    音量- 及【播放|暂停】功能
    截图202310231333258947.jpg
    摸鱼键盘 自定义快捷键 HID免驱 STC主控 MCU代码开源 DIY键盘-淘宝网 (taobao.com)
    51开源 USB 三键摸鱼 键盘@STC32G, 或者自己改成STC8H8K64U



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
     楼主| 发表于 2023-11-1 16:01:12 | 显示全部楼层
    截图202311011558485729.jpg

    单机V1.1版本预告:
    把小键盘的单个HID通道的Consumer Control和Keyboard功能结合起来了,可以同时控制音量加减和标准键盘用了,驱动代码已调通,区别于隔壁某恒还是用的两个端点做的,这个单点方案的网上开源资料太少,这个版本的整理完直接在这里开源。

    点评

    内测版群文件自取哈  详情 回复 发表于 2023-11-2 13:51
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9307

    回帖

    1万

    积分

    管理员

    积分
    14067
    发表于 2023-11-1 16:13:03 | 显示全部楼层
    冲哥威武

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
     楼主| 发表于 2023-11-2 13:51:47 | 显示全部楼层
    电子DIY小家 发表于 2023-11-1 16:01
    单机V1.1版本预告:
    把小键盘的单个HID通道的Consumer Control和Keyboard功能结合起来了,可以同时控制音 ...

    内测版程序群文件自取哈
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-4 02:23 , Processed in 0.095027 second(s), 75 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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