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

相关推荐
2501_922639589 小时前
率能半导体 SS6285L直流双向马达驱动芯片:18V/5A,覆盖电子锁、按摩仪、电动玩具、机器人四大应用场景
单片机·嵌入式硬件·硬件工程
专一的咸鱼哥9 小时前
预训练 ONNX 模型转换为 .eim
嵌入式硬件·机器人
SuperByteMaster9 小时前
三极管 做开关电路 要尽快跳过放大区
嵌入式硬件
铅笔小新z10 小时前
【stm32】输入捕获-超声波测距
stm32·单片机·嵌入式硬件
Zw-awa10 小时前
PID 的花样:先看懂模糊 PID 和单神经元自适应 PID
stm32
菩提树下的凡夫10 小时前
机器视觉LED光源控制器
单片机·嵌入式硬件
铅笔小新z10 小时前
【stm32】全彩led灯(PWM)
stm32·单片机·嵌入式硬件
小鸡脚来咯10 小时前
【无标题】
单片机·嵌入式硬件
澄纸气10 小时前
STM32 外部中断实战:对射式计数器和编码器计数器,两个实验跑通 EXTI
stm32·单片机·嵌入式硬件
2501_9226395811 小时前
率能半导体 SS6286L直流双向马达驱动芯片:18V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
stm32·单片机·嵌入式硬件·硬件工程