# [THKB] TouHou Keyboard,便宜、低延迟的客制化小键盘
![LOGO_black2.png](//image.lceda.cn/pullimage/TnnxL1aeDyKSGLdp5R7dya9zGrtwwFURvFaPwxle.png)
#### THKB是一款以便宜、低延迟为设计理念的客制化小键盘。支持全键无冲、全键自定义、组合按键、三层自由键层、超低可调延迟、掉电保存记忆等功能;支持上位机改键值、改延迟,包含测试工具以及使用指南。
机械轴体按键支持可调延时(延时最低20us,最高50ms),轻触开关软件延时20ms;上位机仅支持Windows系统。
##### 下载上位机请点击发行版,选择最新版本下载。
本Git项目仓库包含THKB的下位机固件、上位机软件、PCB Gerber文件、CAD设计文件、3D模型以及相关文档等。
更多资料请访问Git项目仓库,包含THKB的下位机固件、上位机软件、PCB Gerber文件、CAD设计文件、3D模型以及相关文档等,链接:[[THKB] TouHou Keyboard 便宜、低延迟的客制化小键盘](https://gitee.com/Kairingo/thkb)
~~~~
本项目使用MIT开源协议,您可以随意的下载、Clone、Fork本项目作为任何用途。如果用作商业用途量产,希望您赠送一份样品给我,我的联系邮箱是2401977049@qq.com
![front_render_reflective.jpg](//image.lceda.cn/pullimage/QQHWJaNHJzPRGJIFRrSXN1kOVkmZN3u93ufi0Ofb.jpeg)
![photo_front.jpg](//image.lceda.cn/pullimage/9l2e5NS6ENUGjQruSRcgwa4Ds3xt5jEhYhcE5hJE.jpeg)
## 一、更新说明
##### 2023.9.1更新:增加了一个Type-c接口,消除了电路设计上的冗余电阻,将PCB卫星轴改为钢板卫星轴,原2U区域支持用两个1U按键替换,代码增加若干注释
##### 2023.7.24更新:首次正式发布项目,修复了测试版的一些BUG
##### 2023.7.25更新:修复了上位机v0.1.0窗体无法显示的问题
## 二、项目文件说明
#### Firmware -v0.2.0
##### |-- THKB_fw 使用Keil5 C51配合 vs code Keil Assistant 插件配合编写
|--Obj 文件夹内的**THKB_fw.hex**为生成的hex文件,可以直接用于下载,将P3.6引脚通过20K电阻下拉即可进入ISP下载模式,下载方法请参考沁恒官方
#### Software -v0.2.0
##### |-- THKB_host_software 上位机程序,使用C#编写,dotnet Framwork 3.5框架,winform窗体。使用Visual Studio开发
##### |-- fonts 包含上位机所需的字体
##### |-- pic 上位机中使用的一些图片素材
#### Hardware -v0.2.2
##### |-- pcb 包含PCB Gerber文件,设计文件:[THKB_main_v0.1.3 - 嘉立创EDA开源硬件平台 (oshwhub.com)](https://oshwhub.com/kairingo/thkb_main_v0-1-3)
##### |-- bom 物料清单与购买链接
#### CADs -v0.2.0
##### 包含顶板,底板以及垫高板的CAD文件
#### 3D_Models -v0.2.0
##### 3D模型,包含零件与装配体。使用Soildworks 2022设计
#### Docs
##### LOGO、文档、渲染图以及一些相关文档等
#### Legacy
##### 旧版本的软件固件文档等,已停止维护
## 三、硬件架构说明
### 2.1设计理念
为贯彻低成本的设计方案,所有元器件和结构都在保证稳定可用的情况下做了Cost Down。键盘总共有两个轻触开关,支持安装十个轴体甚至九个。PCB同时支持热插拔和焊接方案,可以根据用途进行调整。键盘可以选装9个1U和1个1.5U,或者7个1U、1个1.5U或1个2U。
![multi_choice_key.png](//image.lceda.cn/pullimage/Z1aVu3nBiIXHzyyqjUVrDtEOEGLPmRcGLV8tpUYX.png)
### 2.2 结构设计
键盘倾斜角约为6°;为了节省成本,键盘的结构为三明治夹心结构,从上到下分别是2mm亚克力顶板、FR-4玻纤PCB板、3mm亚克力底板以及5mm亚克力垫高板,使用M3内六角螺丝进行紧固,为了提高稳固性,使用SMT贴片螺柱固定在PCB板上,无法拆卸。顶面使用4mm螺丝,底面8mm和12mm螺丝分别固定,底部使用2mm高的直通柱,防止底板接触到元器件。可以添加夹心垫、轴下垫等配件以提升手感。
![explosive_front.jpg](//image.lceda.cn/pullimage/C8Raos6SYFUbHrYGFoZ1sksdwajORXmWbB4lNrpZ.jpeg)
键盘使用标准的樱桃MX轴体和PCB 2u卫星轴,建议使用DSA、XDA、原厂或者OEM高度等较低高度的键帽。
### 2.3 芯片选型
选用来自南京沁恒的51单片机**CH551**,一块钱的售价,同支持USB FS 2.0、128B DataFlash以及24MHz的主频,非常适合用作本项目的主控MCU。极简的外围器件设计,仅需少量电阻电容,最小系统即可搭建完成。外加51内核的单片机一般都很皮实,可以抗住日常生活中的静电。更好的鲁棒性,可以放心在PCB上做一些美化设计,比如将镀锡的铜皮裸露,绘制图案等。
![pcb_back.png](//image.lceda.cn/pullimage/fWDHbHw88K0vPaO68jeBOkcPaFBqAkUtCAMXpLJE.png)
![Sch.png](//image.lceda.cn/pullimage/siCqMhA4m4KkUzIUXl7pPnSdCCy1xJtlsCHej7g5.png)
## 四、固件设计
按键的扫描方式是传统的矩阵扫描,扫描方式是从行到列。键盘由两行六列组成,总共12个按键。使用传统8051模式,使用内置上拉电阻,在扫描前先通过置位相应寄存器为1实现输入功能,通过1n4148防止串扰。所有有关上位机与USB中断的操作都放在USB的终端服务函数中处理。
```C
/*!
* @brief 初始化键盘
* @param 无
* @return 无
*/
void keyboard_init(void)
{
Port3Cfg(1,2);//R0推挽输出
Port1Cfg(1,4);//R1推挽输出
Port1Cfg(3,5);//C0准双向输入
Port1Cfg(3,6);//C1准双向输入
Port1Cfg(3,7);//C2准双向输入
Port3Cfg(3,1);//C3准双向输入
Port3Cfg(3,0);//C4准双向输入
Port1Cfg(3,1);//C5准双向输入
//8051准双向模式,IO作为输出使用时,必须先置1,否则输出低电平
IO_KEY_C0 = 1;
IO_KEY_C1 = 1;
IO_KEY_C2 = 1;
IO_KEY_C4 = 1;
IO_KEY_C5 = 1;
memset(Keyboard_ScanBuf,0,KEY_NUM);//初始化扫描结果
memset(Old_ScanBuf,0,KEY_NUM);//初始化上一次扫描结果
memset(Layer_Keymap[1],0,KEYMAP_LEN);//初始化键值
memset(Layer_Keymap[2],0,KEYMAP_LEN);//初始化键值
memset(Layer_Keymap[3],0,KEYMAP_LEN);//初始化键值
memcpy(Layer_Keymap[0],Layer0_Keymap,KEYMAP_LEN);
keyboard_load_keymap();//从flash读取键值
keyboard_get_delaytime();//从flash读取延时时间
Current_Layer = 0;
led_off();//关闭所有指示灯
mDelaymS(500);
}
```
按键扫描函数:
```C
/*!
* @brief 扫描键盘
* @note 12键,两行六列,从行到列扫描;
* @note 低电平代表按下,高电平代表弹起
* @param 无
* @return 无
*/
void keyboard_scan(void)
{
memset(Keyboard_ScanBuf,0,KEY_NUM);
IO_KEY_R0 = 0;
IO_KEY_R1 = 1;
mDelayuS(10);
Keyboard_ScanBuf[0] = !IO_KEY_C0;//默认键位Ctrl
Keyboard_ScanBuf[1] = !IO_KEY_C1;//默认键位Shift
Keyboard_ScanBuf[2] = !IO_KEY_C2;//默认键位Z
Keyboard_ScanBuf[3] = !IO_KEY_C3;//默认键位X
Keyboard_ScanBuf[4] = !IO_KEY_C4;//默认键位C
Keyboard_ScanBuf[5] = !IO_KEY_C5;//默认键位Up
//按键消抖
if(Keyboard_ScanBuf[0]||Keyboard_ScanBuf[1]||
Keyboard_ScanBuf[2]||Keyboard_ScanBuf[3]||
Keyboard_ScanBuf[4]||Keyboard_ScanBuf[5])
{
keyboard_delay();
Keyboard_ScanBuf[0] &= !IO_KEY_C0;
Keyboard_ScanBuf[1] &= !IO_KEY_C1;
Keyboard_ScanBuf[2] &= !IO_KEY_C2;
Keyboard_ScanBuf[3] &= !IO_KEY_C3;
Keyboard_ScanBuf[4] &= !IO_KEY_C4;
Keyboard_ScanBuf[5] &= !IO_KEY_C5;
}
IO_KEY_R0 = 1;
IO_KEY_R1 = 0;
mDelayuS(10);
Keyboard_ScanBuf[6] = !IO_KEY_C0;//默认键位Space
Keyboard_ScanBuf[7] = !IO_KEY_C1;//默认键位Esc
Keyboard_ScanBuf[8] = !IO_KEY_C2;//默认键位Fn
Keyboard_ScanBuf[9] = !IO_KEY_C3;//默认键位Left
Keyboard_ScanBuf[10] = !IO_KEY_C4;//默认键位Down
Keyboard_ScanBuf[11] = !IO_KEY_C5;//默认键位Right
//按键消抖
if(Keyboard_ScanBuf[6]||Keyboard_ScanBuf[9]||
Keyboard_ScanBuf[10]||Keyboard_ScanBuf[11])
{
keyboard_delay();
Keyboard_ScanBuf[6] &= !IO_KEY_C0;
Keyboard_ScanBuf[9] &= !IO_KEY_C3;
Keyboard_ScanBuf[10] &= !IO_KEY_C4;
Keyboard_ScanBuf[11] &= !IO_KEY_C5;
}
if(Keyboard_ScanBuf[7]||Keyboard_ScanBuf[8])
{
mDelaymS(20);//按键消抖,轻触开关
Keyboard_ScanBuf[7] &= !IO_KEY_C1;
Keyboard_ScanBuf[8] &= !IO_KEY_C2;
}
}
```
全键无冲的方案参考了稚辉君的重映射键值方案,使用枚举,用负数表示特殊按键(如Ctrl、Shift等),普通按键从0~128依次枚举,用有符号char存储值,FN键层切换键也包含其中,如果FN被按下,则切换键层,并等待一秒钟。
```C
/*!
* @brief 重映射键值
* @note 重映射键值,将扫描结果映射到键值
* @param keyvalue 扫描结果
* @return 无
*/
static void keyboard_remap(char keyvalue)
{
UINT8 index = 0 , bit_index = 0;
//特殊按键
if( keyvalue < 0)
{
Keyboard_RemapBuf[0] |= 12->3
```
## 五、上位机软件设计
上位机软件使用C#编写,Winform框架,调用了Hidlibrary库设计思路是主窗体中包含四个子窗体,通过点击主窗体的不同按钮切换子窗体,调用不同的功能,分辨是映射更改、延时更改、按键测试以及设置,左下角显示键盘当前的连接状态
![host_delay.png](//image.lceda.cn/pullimage/pOY9hPS73SYxOgZeSDuE63HROhLalOLW15ArNali.png)
按键延迟支持20us至50ms,可以输入特定值进行调整,上方的不同模式分别代码:stable稳定模式延时5ms、normal普通模式延时800us、game游戏模式延时50ms,在游戏模式下,若大力敲击会导致按键产生连击。延时大于50ms会导致案件无法触发,而低于20us则极容易发生连击。
![host_tester.png](//image.lceda.cn/pullimage/Zq9o3ufsoDWOiYyNNT1urB8ae5KnBo4gwClM5G8q.png)
设置界面现在还未开发,所以还是一片空白~
## 六、渲染图与实拍
![thkb_keyshot_v0.1.21.jpg](//image.lceda.cn/pullimage/56XGmZn3T1f8LygOMPXz1SnEhAOnBFkdCoBH9B8U.jpeg)
v0.1.0打样的原型机
![prototype_photo.jpg](//image.lceda.cn/pullimage/cvcOHVlkvRgdwq3PkwdJ66WDh2GOYwgHU8EFM0gV.jpeg)
v0.1.3特别版(紫金)和v0.2.2(黑银)
![photo_back.jpg](//image.lceda.cn/pullimage/4SEA7pVMlWfaXrsXreqoi4EJwihjFLD6j20ut0nR.jpeg)
v0.1.3特别版
![v0.1_front.jpg](//image.lceda.cn/pullimage/ntNBXKe890yoHJI64QRQVeSEJORmKx7svyq4Y7HV.jpeg)
![v0.1_back.jpg](//image.lceda.cn/pullimage/3UnY2k2Nr2Jh1jRETZhD0ALoIru5MYm4pL7ZNGfK.jpeg)
## 七、授权条款与写在最后
本项目采用MIT开源协议,这意味着您不仅可以用作商业用途,还可以闭源。由于国内的开源大环境不好,任何开源协议最后大概率都会被忽视,与其让别人违背协议,不如放开权限。
如果您想量产,或是基于这个项目进行商业用途的话,虽然不需要再征得我的同意,但还请发送邮件告知我一下,我很希望我的设计可以得到量产,或是被更多人看到,在这里仅抛砖引玉,给大家做键盘或是相关的东西提供更多的灵感。
我希望如果您参考了这个工程,我希望您能将代码开源;如果量产了这款键盘,希望您可以将项目的开源仓库印在产品上,使用自己设计的LOGO,或是用THKB提供的。
这个项目源于我六月底的一个灵感,如果您知道“东方Project”这个IP的话,相信您一定可以猜到了,这款键盘就是专门为了STG(弹幕射击游戏)准备的。可变延时可以适应不同的敲击力度,通过微调使延迟降到最低,以适配不同的使用者。当然,这款键盘的肯定还有更多的用途,这就等待您的开发了。
本项目中除了元器件的3D模型和封装由立创EDA提供外,所有LOGO、代码、图片、PCB板、CAD文件等,都由我编写或设计。本人为管理专业在校大学生,水平有限,项目中尚存在许多错误。实际开发总共就进行了两周半的时间,~~外加我要复习考研~~做的比较仓促,如有错误还请指出,恳请各位的批评指正。```
4
8
收藏到专辑