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

相关推荐
Electron-er1 小时前
汽车LIN总线通讯:从物理层到协议栈的深度解析
单片机·汽车电子·lin总线·lin总线通讯
Do vis8241 小时前
STM32第十六天蓝牙模块
stm32·单片机·嵌入式硬件
学不动CV了1 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
猫猫的小茶馆3 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
jingshaoqi_ccc4 小时前
stm32的USART使用DMA配置成循环模式时发送和接收有着本质区别
stm32·单片机·嵌入式硬件
MingYue_SSS7 小时前
开关电源抄板学习
经验分享·笔记·嵌入式硬件·学习
玉树临风江流儿7 小时前
炸鸡派-定时器基础例程
单片机·嵌入式硬件
小宋同学在不断学习8 小时前
stm32-掌握SPI原理(一)
stm32·单片机·spi
is08158 小时前
STM32的 syscalls.c 和 sysmem.c
c语言·stm32·嵌入式硬件
学不动CV了9 小时前
数据结构---链表结构体、指针深入理解(三)
c语言·arm开发·数据结构·stm32·单片机·链表