STM32DIY机械键盘


首先要感谢O正义阿庚O这位up主开源的资料
b站视频

键盘图片

请添加图片描述

硬件介绍

键盘采用STM32f103RCT6做主控,采用HT16K33作为LED驱动,TP4056作为锂电池充电管理芯片,蓝牙采用BT-05模块。

原理图

在这里插入图片描述

这张原理图是b站那位老哥做的,为了省事我就直接用这张图画的PCB。
USB上接在D+的那个1.5k上拉电阻是接到3V3的USB协议识别电阻,之前以为没用,PCB上就没接那颗电阻导致不识别。

PCB

请添加图片描述PCB那位老哥资料里面已经有,但我还是仿照他的自己画了一板

3D 效果图

效果还是不错的在这里插入图片描述

PCB打样

在这里插入图片描述
这是4块板的价格,原价是141,因为生产过程中损坏一块,所以只有四块。

程序

我在原来的基础上增加了灯的控制,

void Press_light(void)
{
	unsigned char i,j;
	Press_light_Flag = 1;
	LED_WakeUp();

	if(myKeyBoard_KeyStateChangedFlag_Ex)
	{
		myKeyBoard_KeyStateChangedFlag_Ex = 0;
		for(i = 0; i < 6; i++ )
		{
			for(j = 0; j < 16; j++)
			{
				if(myKeyBoard_KeyState[i][j] == KEYPRESSED)
				{
					LED_DrawPoint(i,j,1);

					key_led_time[key_time_chance][0] = i;	//X
					key_led_time[key_time_chance][1] = j;	//y
					key_led_time[key_time_chance][2] = 30;	//time

					key_time_chance++;
					if(key_time_chance==40)
					{
						key_time_chance= 0;	
					}
				}
			}
		}		
	}
	LED_FreashRam();
	LED_SetBrightness(16);
	LED_SetDisplay(1,LED_FLASH_OFF);
	LED_Status = 1;
}

中断代码

if(Press_light_Flag)					//每50毫秒更新灯
			Press_light();						//按谁谁亮

		for(int i = 0; i < 40; i++)
		{
			if(key_led_time[i][2] > 0)			//判断生命周期是否大于0
			{
				key_led_time[i][2]--;
			}
			else if(key_led_time[i][2] == 0)
			{	
				LED_DrawPoint(key_led_time[i][0],key_led_time[i][1],0);  //生命周期为0关闭灯
				key_led_time[i][0] = 0;										//用过的数组清零
				key_led_time[i][1] = 0;
				key_led_time[i][2] = 0;				
			}
		}	

代码的主要功能是按哪个哪个亮一段时间,当按键按下之后 用一个二维数组保存 一个键按下的x,y坐标和生命周期。每50ms进一次中断生命周期减一,当生命周期为0时,关闭灯。

芯片一定不能贪便宜!!!

这里说下一个坑,之前在淘宝上买了一片RCT6焊到PCB上,先写了一个点灯的程序可以正常运行,然后用STM32cubeMX软件写了一个hid程序,用数据线连接电脑后就一直弹出USB设备无法识别,起初是怀疑软件有问题,但是程序是用cubemx生成的不可能有问题,就用开发版试可以正常识别,然后又怀疑芯片没工作,就在hid程序上加了LED闪烁程序,LED正常闪烁然后又去查PCB是不是有问题 stm32一共就连着 D-D+和电源四根线不可能有问题啊,,一时之间摸不到头脑,最后才怀疑芯片有问题,找了一个RCT6的开发版把芯片换上去,完美解决。
一定不要贪便宜!!!

  • 2
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值