CH32X035 多功能RGB键盘

CH32X035实现多功能RGB自定义小键盘;
在这里插入图片描述

功能介绍

  • 矩阵键扫:采用电压式矩阵扫描实现按键检测;
  • 全键无冲:键盘的上传报告采用全键无冲协议,支持所有按键同时按下并上传;
  • 全键热插拔:支持键轴体热拔插,可自由更换轴体;
  • LCD屏幕显示:LCD智能显示如当前工作状态等信息;
  • 动态RGB灯效:RGB炫彩灯效,动态变换;
  • 音量控制:旋转编码器通过HID协议实现音控,精准丝滑;

应用框图

在这里插入图片描述

资源匹配

  • 按键扫描:CH32X035具有多种封装,最大可有64pin,支持不同维度按键矩阵所需的IO资源;键扫在定时器中断中完成,可满足全速USB下不同上报率的键扫要求;
  • USBFS接口:CH32X035具有USBFS全速主机/设备控制器,支持全速键盘的最高1K上报率;
  • 存储容量:62K Flash和20K SRAM,可内置灯效和屏幕数据;
  • 可编程协议I/O控制器PIOC实现灯控:采用全彩灯珠WS2812,可由PIOC单线驱动;
  • 定时器支持编码器模式:使用旋转编码器配合定时器编码器模式,能够精准检测旋钮变化,并通过USB上传变化报告,实现对主机的音量控制;

在这里插入图片描述

以HC32L13X为例,实现基于CH455H的4x5矩阵键盘的示例代码如下: ```c #include "HC32L13x.h" #include "hc32l13x_gpio.h" #include "hc32l13x_clk.h" #define KEY_PORT GpioPortA #define KEY_PIN1 GpioPin0 #define KEY_PIN2 GpioPin1 #define KEY_PIN3 GpioPin2 #define KEY_PIN4 GpioPin3 #define KEY_PIN5 GpioPin4 #define KEY_PIN6 GpioPin5 #define KEY_PIN7 GpioPin6 #define KEY_PIN8 GpioPin7 #define KEY_PIN9 GpioPin8 #define KEY_PIN10 GpioPin9 void GPIO_Config(void) { stc_gpio_cfg_t stcGpioCfg; DDL_ZERO_STRUCT(stcGpioCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); Gpio_StructInit(&stcGpioCfg); stcGpioCfg.enDir = GpioDirIn; stcGpioCfg.enDrv = GpioDrvH; stcGpioCfg.enPu = GpioPuEnable; Gpio_Init(KEY_PORT, KEY_PIN1, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN2, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN3, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN4, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN5, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN6, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN7, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN8, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN9, &stcGpioCfg); Gpio_Init(KEY_PORT, KEY_PIN10, &stcGpioCfg); } uint32_t KEY_Scan(void) { uint32_t u32Ret = 0; uint8_t i; /* 配置为输出模式,拉高 */ for (i = 0; i < 5; i++) { Gpio_SetIO(KEY_PORT, (KEY_PIN6 << i)); } /* 配置为输入模式,检测按键状态 */ for (i = 0; i < 4; i++) { Gpio_SetIO(KEY_PORT, (KEY_PIN1 << i)); if (!Gpio_GetIO(KEY_PORT, KEY_PIN5)) { u32Ret = (1 << (i * 3)); break; } if (!Gpio_GetIO(KEY_PORT, KEY_PIN6)) { u32Ret = (2 << (i * 3)); break; } if (!Gpio_GetIO(KEY_PORT, KEY_PIN7)) { u32Ret = (3 << (i * 3)); break; } Gpio_ClrIO(KEY_PORT, (KEY_PIN1 << i)); } /* 配置为输出模式,拉高 */ for (i = 0; i < 5; i++) { Gpio_SetIO(KEY_PORT, (KEY_PIN6 << i)); } /* 配置为输入模式,检测按键状态 */ for (i = 0; i < 4; i++) { Gpio_SetIO(KEY_PORT, (KEY_PIN1 << i)); if (!Gpio_GetIO(KEY_PORT, KEY_PIN8)) { u32Ret |= (1 << (i * 3 + 1)); break; } if (!Gpio_GetIO(KEY_PORT, KEY_PIN9)) { u32Ret |= (2 << (i * 3 + 1)); break; } if (!Gpio_GetIO(KEY_PORT, KEY_PIN10)) { u32Ret |= (3 << (i * 3 + 1)); break; } Gpio_ClrIO(KEY_PORT, (KEY_PIN1 << i)); } return u32Ret; } int main(void) { GPIO_Config(); while (1) { uint32_t u32Key = KEY_Scan(); if (u32Key != 0) { /* 按键处理 */ } } } ``` 以上代码中,GPIO_Config函数用于配置GPIO,包括设置输入/输出模式、上拉等;KEY_Scan函数用于检测按键状态,通过对不同的GPIO进行配置和检测,实现4x5矩阵键盘的按键扫描。在主函数中,通过循环调用KEY_Scan函数,实现实时检测按键状态并进行相应处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值