STM32数字小键盘

news2025/1/22 12:55:32

基于STM32的数字小键盘


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

硬件

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

原理图

![在这里插入图片描述](https://img-blog.csdnimg.cn/91709f90eeb34dbab945395789c5cccf.png
采用的是主控是STM32F103RBT6,上拉1.5K接高速USB。按键采用的是矩阵按键。轴位可以自己选择。还接了一块0.91寸的OLED屏幕,一个EC11编码器,晶振采用的是16M晶振。

PCB

在这里插入图片描述
按键布局是这样的。

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

3D图

在这里插入图片描述

实物图

软件

初始化函数

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();
}

矩阵键盘

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCv之图像轮廓

目录 一、图像轮廓定义 二、绘制轮廓 三、计算轮廓面积与周长 一、图像轮廓定义 图像轮廓是具有相同颜色或灰度的连续带你的曲线.轮廓在形状分析和物体的检测和识别中很有用 轮廓的作用: 用于图形分析物体的识别与检测 注意点: 为了检测的准确性&#xff0c;需要先对图像…

AI 救不了好莱坞,16 万演员联合编剧上演史诗级「罢工大戏」

内容一览&#xff1a; 近日&#xff0c;美国演员工会正式加入编剧工会行列&#xff0c;开始举行罢工&#xff0c;由此&#xff0c;被多家媒体称为好莱坞「末日」时刻来临。值得关注的是&#xff0c;本次罢工的原因&#xff0c;除了老生常谈的薪资问题&#xff0c;还有一个重要的…

多用户商城系统Dokan评测优点与缺点(2023)

目录 多用户商城系统Dokan优点 多用户商城系统Dokan缺点 您应该开始使用多供应商市场吗&#xff1f; 多用户商城系统Dokan评论 为什么选择Dokan&#xff1f; 用户界面 用户友好的前端 仪表板和后端 管理员后台 供应商仪表板 第三方兼容性 Dokan 可以卖什么&…

c#调用cpp库,debug时不进入cpp函数

选中c#的项目&#xff0c;右击属性&#xff0c;进入属性页&#xff0c;点击调试&#xff0c;点击打开调试启动配置文件UI&#xff0c;打开启用本机代码调试。

Scrapy和Selenium整合(一文搞定)

文章目录 前言一、开始准备1. 包管理和安装chrome驱动2. 爬虫项目的创建&#xff08;举个栗子&#xff09;3. setting.py的配置 二、代码演示1. 主爬虫程序2. 中间件的配置3. 定义item对象4. 定义管道 总结 前言 scrapy和selenium的整合使用 先定个小目标实现万物皆可爬&#…

Loadrunner结合Fiddler实现脚本的录制

Loadrunner一直被业内认为是最好用的性能测试工具&#xff0c;行业大哥大, 但是用过Loadrunner的朋友都知道&#xff0c;工具功能的确牛&#xff0c;但实际使用过程中总会有一些困扰新手的问题&#xff0c;无法录制脚本&#xff0c; 如遇到Loadrunner不支持的IE版本、对Chrome、…

【C语言】Sleep()函数----详解

&#x1f341; 博客主页:江池俊的博客 &#x1f341;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f341; 如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏&#x1f31f; 三连支持一下博主&#x1f49e; 目录 前言 &#x1f4cc;C语言sleep函…

一本通1919:【02NOIP普及组】选数

这道题感觉很好玩。 正文&#xff1a; 先放题目&#xff1a; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1919 描述 已知 n 个整数 x1,x2,…,xn&#xff0c;以及一个整数 k&#xff08;k&#…

Docker 容器生命周期:创建、启动、暂停与停止----从创建到停止多角度分析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Vuex基本使用

目录 一、什么是vuex二、什么时候使用 Vuex三、Vuex 工作原理图四、vuex 核心概念和 API4.1 state4.2 actions4.3 mutations4.4 getters 五、代码生成器5.1 mapGetters5.2 mapState5.3 mapActions5.4 mapMutations 六、vuex模块化编码七、求和案例 一、什么是vuex 专门在 Vue …

文本生成人工评价指标及一致性校验方法总结(附代码实现)

前言&#xff1a;人工评估&#xff08; Manual Evaluation / Human Evaluation&#xff09;是文本生成工作评估中非常重要的一环。在对模型的文本生成质量进行评估时&#xff0c;除客观的自动评价指标&#xff0c;还需有人工评价指标的主观判断&#xff0c;综合二者的结果完成评…

zabbix监控自己

目录 一、实验环境准备 二、server端 1、配置阿里云yum源 2、部署lamp环境 3、启动lamp对应服务 4、准备java环境 5、源码安装zabbix 6、mariadb数据库授权 7、创建zabbix程序用户并授权防止权限报错 8、修改zabbix配置文件 9、配置php与apache 10、web安装zabbix …

[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)

在编程方面&#xff0c;从来都是实践出真知&#xff0c;书读百遍其义自见&#xff0c;所以实战是最好的提升自己编程能力的方式。 前一段时间&#xff0c;写了一些实战系列文章&#xff0c;如&#xff1a; ASP.NET MVC开发学生信息管理系统VueAntdvAsp.net WebApi开发学生信息…

地摊盛行,VR全景如何帮助实体餐饮商家人气翻倍?

“民以食为天”&#xff0c;餐饮行业始终在市场经济中扮演着重要角色&#xff0c;前有“淄博烧烤火爆出圈”&#xff0c;后有“地摊经济夜市亮相”&#xff0c;可以看到餐饮行业呈现出市场广阔、高频刚需、标准化程度低的特点。但是地摊经济的盛行&#xff0c;让很多实体餐饮商…

【漏洞修复】node-exporter被检测/debug/vars泄漏信息漏洞

node-exporter被检测/debug/vars泄漏信息漏洞 漏洞说明修复方法 漏洞说明 和之前的pprof类似&#xff0c;都是国产的安全工具扫出来的莫名其妙的东西&#xff0c;这次也是报的node-exporter存在这个漏洞&#xff0c;又归我处理。当访问node-exporter的/debug/vars路由时能获取…

Ubuntu22.04下安装Ros2-Humble

ROS2的Humble版本为TLS版本&#xff0c;维护日期截止到2027年&#xff08;可以参考这里确查看Humble和Ubuntu系统的关系&#xff09; 可以看到&#xff0c;其支持Linux/MacOS/Windows等多个系统&#xff0c;针对于Linux系统&#xff0c;对应的系统版本是(Ubuntu 22.04&#xff…

el-checkbox获取选中的id

获取选中checkbox的label和value <el-checkbox-group v-model="checkedAlarmObj"><el-checkbox @change="changeObj" v-for="item in alarmObj" :label="item.roleName" :key="item.roleId":value="…

断路器绝缘电阻试验

断路器 绝缘电阻试验 试验目的 检验断路器合闸后灭弧室、 主绝缘和提升杆是否发生受潮&#xff0c; 劣化变质等缺陷。 试验设备 绝缘电阻测试仪 厂家&#xff1a; 湖北众拓高试 试验接线 相对地 端口间 试验步骤 真空断路器本体与断口的绝缘电阻 试验前对兆欧表本身进行检…

2023年了,为何 Selenium 依然这么火?

今天给大家带来的主题是自动化测试框架Selenium&#xff0c;话不多说&#xff0c;直接开始&#xff01; 1.什么是 Selenium 自动化测试 Jason Huggins 于 2004 年创建了一个 JavaScript 框架&#xff0c;旨在将其从重复的手动测试中解放出来。 最初命名为 JavaScriptTestRunn…

grafana备份脚本

备份思路 1、逐个dashboard备份配置 2、每个dashboard保存成一个文件 3、文件名定义为 目录名-dashboard名.json 4、使用python2 5、其中http_header中生成的Authorization API KEY已过期&#xff0c;请自己重新生成后替换使用。 6、保存文件部分适配的是windows&#xf…