首先感谢大佬们的开源工程:
CV键盘三键键盘四键键盘九键键盘有线小键盘
【三键侧透光小键盘】CH552G
大佬们做得很厉害,流程写得也很详细,我就是根据流程做出来的,然后做了稍微的修改。
我发这个开源工程的原因,一个是想分享一种多样的键轴触发反馈效果,二是想锻炼一下自己用Markdown写说明文档的能力,所以这篇我先写一下我改善的那一部分,剩下部分有时间再完善,具体的环境配置过程可以看大佬们写的,大佬们写得很好。
我是看到朋友圈有人在PDD买了个两键的CV小键盘,功能单一而且二十多块钱有点小贵。我就想做一个,于是到立创开源硬件平台逛一逛,最终决定复刻 CV键盘三键键盘四键键盘九键键盘有线小键盘 这里的四键项目。
附件里的3D外壳也是00.01%大佬画的,因为我只会CV,不会3D建模画外壳。
大佬做的很牛,本来打算复刻这个工程,直接打板、焊接、烧程序。
但是这个大佬的专注力好像都在九键键盘。
四键不知道是被搁置了还是我没找到程序。
可以去烧9键的固件,最新版的九键虽然支持软件改键,但是各按键是独立的。而且我用改键软件的串口就只识别成功一次,作为i人不敢去问,所以放弃烧9键固件的想法,打算自己根据源程序改。
那个开源工程附件里的_基于鼠标例程的三键程序源文件.zip_应该是作者刚开始改别人的时候写的程序,很简陋,但是有 判断两个按键同时按下的交互逻辑。
综上,我就根据源文件完善了一下,支持单击,双击,长按,多按键组合。
20240504 写了几种光效:渐变流水灯,对称流水、全局流水,和长灭、常亮。还有按键熄灭。 20240502 尝试增加新功能的时候,发现我写的史山程序太大了,无法装入到开发板的内存中。发生ASlink-Error-Insufficient ROM/EPROM/FLASH memory报错。 于是改了一下按键扫描部分,改用结构体,省了不少的空间。
bool button1Press = !digitalRead(BUTTON1_PIN);
bool button2Press = !digitalRead(BUTTON2_PIN);
bool button3Press = !digitalRead(BUTTON3_PIN);
bool button4Press = !digitalRead(BUTTON4_PIN);
KeyAction key1Result = analyzeKeyPress(button1Press, &key1State);
KeyAction key2Result = analyzeKeyPress(button2Press, &key2State);
KeyAction key3Result = analyzeKeyPress(button3Press, &key3State);
KeyAction key4Result = analyzeKeyPress(button4Press, &key4State);
20240425 根据我的个人习惯,我的按键设置如下:
key1
单击:复制 ctrl+c
双击:复制 ctrl+insert
长按:撤销 ctrl+z
key2
单击:粘贴 ctrl+v
双击:粘贴 shift+insert
长按:恢复 ctrl+y
key3
单击:删除 DELETE
双击:剪贴板 win+v
长按:保存 ctrl+s
key4
单击:回车 Enter
双击:截屏 win+shift+s
长按:注释 /**/
组合键:
key1+key2 左箭头
key2+key3 上箭头
key3+key4 右箭头
key1+key4 下箭头
(组合键 单击发一次,长按连续发)
**
/***********可改/调用的参数****************/
#define Naive_Debouncing_TIME 50 //WHILE
#define SCAN_PERIOD 1 //扫描周期
#define KEY_COUNT_DESHAKING ( 1/SCAN_PERIOD) //按键消抖时间
#define KEY_COUNT_LONGTIME (15/SCAN_PERIOD) //长按按键判断时间
#define KEY_COUNT_DUALCLICKTIME (15/SCAN_PERIOD) //双击按键判断时间
#define KEY_LONG_REPEAT_TIME (20/SCAN_PERIOD) //长按按键的回报率的倒数,即一直长按按键时响应的时间间隔
#define NO_Click 0 //没有按下
#define Click_Shot 1 //短按一下
#define Click_Double 2 //双击
#define Click_Long 3 //结束长按
#define Hold_Long 4 //一直长按
bool Press_multiple_buttons = false; //多按键/组合键使用标志
char ResultKEY1 = 0;
char ResultKEY2 = 0;
char ResultKEY3 = 0;
char ResultKEY4 = 0;
/***************************/
从Line200到Line667这个按键状态分析程序也是我好久之前CV别人的,这个按键检测本来是放到定时器中断里检测的,但是我没找到怎么给CH552G配置定时器中断,所以整份按键检测就放在while循环里。因为这个CV键盘的作用是生产力辅助,不是游戏键盘,所以牺牲了反馈的快速性,用稍微的延迟换取更丰富的功能
ResultKEY就是按键的状态,包括没按下、单击、双击、长按过程中、长按结束。
接下来就是根据ResultKEY来写功能。
单键单击、单键双击、单键长按处理程序之间的代码是没有顺序限制的,
但是两个键同时按的处理要放在单键处理程序之前,而且两键同时长按结束(去除Press_multiple_buttons标志位)要放在单键长按处理程序之后。
//-------短按两个--------//
if ((ResultKEY1==Click_Shot )&&(ResultKEY2==Click_Shot ))
{
ResultKEY1=NO_Click;
ResultKEY2=NO_Click;
Keyboard_press(KEY_LEFT_ARROW);
delay(20);
Keyboard_releaseAll();
}
//-------长按两个--------//
if ((ResultKEY1==Hold_Long )&&(ResultKEY2==Hold_Long ))
{
Press_multiple_buttons=true;
Keyboard_press(KEY_LEFT_ARROW);
delay(20);
Keyboard_releaseAll();
}
//-------短按一个--------//
if(Press_multiple_buttons==false)
{
/**按键1**/
if (ResultKEY1==Click_Shot ) {
ResultKEY1=NO_Click;
Keyboard_press(KEY_LEFT_CTRL);
Keyboard_press('c');
delay(20);
Keyboard_releaseAll();
}else if (ResultKEY1==Click_Double) {
ResultKEY1=NO_Click;
Keyboard_press(KEY_LEFT_CTRL);
Keyboard_press(KEY_INSERT);
delay(20);
Keyboard_releaseAll();
}else if (ResultKEY1==Click_Long) {
ResultKEY1=NO_Click;
Keyboard_press(KEY_LEFT_CTRL);
Keyboard_press('z');
delay(20);
Keyboard_releaseAll();
}else if (ResultKEY1==Hold_Long) {
}
//-------长按两个状态结束--------//
if ((ResultKEY1==Click_Long )&&(ResultKEY2==Click_Long )&&(Press_multiple_buttons==true )){ResultKEY1=NO_Click;ResultKEY2=NO_Click;Press_multiple_buttons=false;}
!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。

欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。
EEWorld Datasheet 技术支持