STM32数字小键盘

基于STM32的数字小键盘


自己的键盘小键盘数字键坏了几个,准备自己用STM32做一个数字键盘。

硬件

· 找了一些资料,感谢知乎老哥。

原理图

采用的是主控是STM32F103RBT6 ,上拉1.5K接高速USB。按键采用的是矩阵按键。轴位可以自己选择。还接了一块0.91寸的OLED屏幕,一个EC11编码器,晶振采用的是16M晶振。

PCB

按键布局是这样的。

注意:所有的二极管封装都反了。

3D图

实物图

软件

初始化函数

c 复制代码
void System_Init(void)
{
		u8 show_level;
		delay_init();	    	 //延时函数初始化	
		I2C_Configuration();
		OLED_Init();			//初始化OLED 
		NVIC_Config();
		SysInit_TIM(); 
		OLED_CLS();
		OLED_ShowStr1(0,++show_level,(char *)"OLED Ready",1);
		uart_init(9600);
		OLED_ShowStr1(0,++show_level,(char *)"UART1 Ready",1);
		KEY_Init();
		OLED_ShowStr1(0,++show_level,(char *)"KEY   Ready",1);
		delay_ms(1800);
		usb_port_set(0); 	//USB先断开
		delay_ms(300);
		usb_port_set(1);	//USB再次连接
		//USB键盘初始化
		USB_Interrupts_Config();   
		Set_USBClock();   
		USB_Init();	  
		OLED_ShowStr1(0,++show_level,(char *)"USB   Ready",1);
		delay_ms(500);
		delay_ms(500);
		OLED_CLS();
}

矩阵键盘

c 复制代码
u32 Key(void)
{
    u32 Keyinbuf;
    u32 ReadValue;
    GPIO_InitTypeDef GPIO_InitStructure;
	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTE时钟
	
//扫KEY0
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  	//推拉输出
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_SetBits(GPIOC,IO_Key_COL1);						//KEY0输出低
    ReadValue = (GPIO_ReadInputData(GPIOA)>>3)&0x0F; 	//bit2~4
    Keyinbuf = ReadValue;
	GPIO_ResetBits(GPIOC,IO_Key_COL1);
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  		//KEY0输入上拉
    GPIO_Init(GPIOC, &GPIO_InitStructure);

//扫KEY1
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  	//推拉输出
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_SetBits(GPIOC,IO_Key_COL2);						//KEY1输出低
    ReadValue = (GPIO_ReadInputData(GPIOA)>>3)&0x0F; 	//bit2~4
    Keyinbuf |= ReadValue<<4;
	GPIO_ResetBits(GPIOC,IO_Key_COL2);
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  		//KEY1输入上拉
    GPIO_Init(GPIOC, &GPIO_InitStructure);
		
//扫KEY2
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  	//推拉输出
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_SetBits(GPIOC,IO_Key_COL3);						//KEY1输出低
    ReadValue = (GPIO_ReadInputData(GPIOA)>>3)&0x0F; 	//bit2~4
    Keyinbuf |= ReadValue<<8;
	GPIO_ResetBits(GPIOC,IO_Key_COL3);
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  		//KEY1输入上拉
    GPIO_Init(GPIOC, &GPIO_InitStructure);
		
//扫KEY3
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  	//推拉输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,IO_Key_COL4);						//KEY1输出低
    ReadValue = (GPIO_ReadInputData(GPIOA)>>3)&0x0F; 	//bit2~4
    Keyinbuf |= ReadValue<<12;
	GPIO_ResetBits(GPIOB,IO_Key_COL4);
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  		//KEY1输入上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);

//扫KEY4
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  	//推拉输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA,IO_Key_COL5);						//KEY1输出低
    ReadValue = (GPIO_ReadInputData(GPIOA)>>3)&0x0F; 	//bit2~4
    Keyinbuf |= ReadValue<<16;
	GPIO_ResetBits(GPIOA,IO_Key_COL5);
    GPIO_InitStructure.GPIO_Pin = IO_Key_COL5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  		//KEY1输入上拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);

//初始化index
	keys_index[0]=30;
	keys_index[1]=31;
	keys_index[2]=32;
	keys_index[3]=33;
	keys_index[4]=34;
	keys_index[5]=35;
	keys_index[6]=36;
	keys_index[7]=37;
	keys_index[8]=38;
	keys_index[9]=39;
	keys_index[10]=40;
	keys_index[11]=42;
	keys_index[12]=55;
	keys_index[13]=84;
	keys_index[14]=85;
	keys_index[15]=86;
	keys_index[16]=87;
	keys_index[17]=83;
	keys_index[18]=Key_Test;
	keys_index[19]=KEY_BackSpace;
	keys_index[20]=KEY_Space;
    return Keyinbuf;
}

实物测试

实际测试也是可以用的。
完工。

v:shiboven

相关推荐
恒锐丰小瑞7 小时前
率能SS8841T 40V/2.5A/双通道H桥驱动芯片,PWM控制接口与低导通电阻(350mΩ),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·机器人
zcmodeltech7 小时前
钢铁冶金沙盘模型控制系统设计与实现:高炉-连铸-热轧多工序联动方案
分布式·stm32·单片机·嵌入式硬件·交互
徽京人9 小时前
VS Code 接入Esp 32步骤
vscode·单片机·嵌入式硬件
QH1392923188010 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
笨笨饿10 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim
捷瑞电子工坊11 小时前
FreeRTOS事件组:多任务同步的利器
stm32·嵌入式·freertos·实时操作系统·标准外设库·事件组·任务同步
笨笨饿12 小时前
#109_BK7258 蓝牙 A2DP 音频数据通路深度解析
python·stm32·单片机·mcu·物联网·编辑器·音视频
千秋岁rr12 小时前
5.0 TIM
单片机·嵌入式硬件
qq_4017004113 小时前
ADC基准电压与参考电压详细解读:以STM32和28335为例
stm32·单片机·嵌入式硬件
小僧景贤13 小时前
STM32 startup.s 启动文件与 .map 映射文件深度技术解析(md/hd 版本差异化对比)
stm32·内存映射·startup.s·map 文件·单片机启动流程