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

相关推荐
疏星浅月5 小时前
虚拟内存三大核心作用详解
linux·c语言·arm开发·嵌入式硬件
Aaron15888 小时前
RFSOC+VU13P+RK3588的核心优势与应用场景分析
嵌入式硬件·算法·matlab·fpga开发·信息与通信·信号处理·基带工程
blevoice8 小时前
JL杰理AC696N开发板常见问题FAQ-问题6:为什么提示“key 不匹配”?杰理的蓝牙芯片的key是什么?以及该如何添加key? 杰理key文件原理?
单片机·嵌入式硬件·物联网·jl杰理蓝牙音频芯片·ac696n·蓝牙音箱方案开发
编程之升级打怪9 小时前
常见电路的引脚代号
嵌入式硬件
三佛科技-1873661339710 小时前
辉芒微FT62FC1x低成本小体积定时器触摸MCU芯片选型深度解析
单片机·嵌入式硬件
独小乐11 小时前
018.使用I2C总线EEPROM|千篇笔记实现嵌入式全栈/裸机篇
linux·笔记·单片机·嵌入式硬件·arm·信息与通信
C^h11 小时前
rtthread控制达妙4310电机
数据库·单片机·嵌入式硬件
三佛科技-1873661339711 小时前
LP3717BSL 12V1A隔离型极简化自供电充电器适配器电源方案测试报告
单片机·嵌入式硬件
一路往蓝-Anbo12 小时前
第二章:STM32 bxCAN 控制器详解:从内存到总线的“中转站”
stm32·单片机·嵌入式硬件·软件工程
jucat13 小时前
定时排气扇
嵌入式硬件