014-STM32单片机实现矩阵薄膜键盘设计

news2025/2/4 9:52:32

1.功能说明

        本设计主要是利用STM32驱动矩阵薄膜键盘,当按下按键后OLED显示屏上会对应显示当前的按键键值,可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。

2.硬件接线

模块管脚STM32单片机管脚
矩阵键盘行1PA0
矩阵键盘行2PA1
矩阵键盘行3PA2
矩阵键盘行4PA3
矩阵键盘列1PA4
矩阵键盘列2PA5
矩阵键盘列3PA6
矩阵键盘列4PA7
0.96寸OLED显示屏SCLPB6
0.96寸OLED显示屏SSDAPB7

3.软件代码

 

// 定义字符型的4x4矩阵薄膜键盘映射表
char key_map[4][4] = {
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};

// IO端口结构体定义,用于描述GPIO端口和针脚
struct IO_PORT
{                                            
        GPIO_TypeDef *GPIO_x; // GPIO端口地址                 
        unsigned short GPIO_pin; // GPIO端口的针脚
};

// 定义行输出的GPIO端口和针脚数组
static struct IO_PORT KEY_OUT[4] = {
        {BUTTON_ROW1_GPIO_PORT, BUTTON_ROW1_GPIO_PIN},
        {BUTTON_ROW2_GPIO_PORT, BUTTON_ROW2_GPIO_PIN},
        {BUTTON_ROW3_GPIO_PORT, BUTTON_ROW3_GPIO_PIN}, 
        {BUTTON_ROW4_GPIO_PORT, BUTTON_ROW4_GPIO_PIN}
};

// 定义列输入的GPIO端口和针脚数组
static struct IO_PORT KEY_IN[4] = {
        {BUTTON_COL1_GPIO_PORT, BUTTON_COL1_GPIO_PIN}, 
        {BUTTON_COL2_GPIO_PORT, BUTTON_COL2_GPIO_PIN},
        {BUTTON_COL3_GPIO_PORT, BUTTON_COL3_GPIO_PIN}, 
        {BUTTON_COL4_GPIO_PORT, BUTTON_COL4_GPIO_PIN}
};

// 定义键盘扫描状态数组
unsigned char key[4][4];

// 初始化4x4键盘的函数
void Button4_4_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    unsigned char i;
    RCC_APB2PeriphClockCmd(BUTTON_GPIO_CLK, ENABLE); // 使能GPIO时钟

    // 初始化行输出端口
    for(i=0;i<4;i++)
    {
        GPIO_InitStructure.GPIO_Pin = KEY_OUT[i].GPIO_pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置为推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(KEY_OUT[i].GPIO_x, &GPIO_InitStructure);
    }
    
    // 初始化列输入端口
    for(i=0;i<4;i++)
    {
        GPIO_InitStructure.GPIO_Pin = KEY_IN[i].GPIO_pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置为输入上拉
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(KEY_IN[i].GPIO_x, &GPIO_InitStructure);
    }
    
    // 设置行输出高电平,准备扫描
    for(i = 0; i < 4; i++)
    {
        GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin);
    }
}

// 扫描4x4键盘的函数
char Button4_4_Scan(void)
{
    unsigned char i, j;
    for(i = 0; i < 4; i++)
    {
        delay_ms(5); // 延时以稳定信号
        GPIO_ResetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); // 将当前行置低,检测按键
        for(j = 0; j < 4; j++)
        {
            delay_ms(5); // 再次延时
            if(GPIO_ReadInputDataBit(KEY_IN[j].GPIO_x, KEY_IN[j].GPIO_pin) == 0) // 读取列状态,如果为低,则按键被按下
            {
                key[i][j] = 1; // 记录按键状态
                GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); // 恢复当前行高电平
                return key_map[i][j]; // 返回按键对应的字符
            }
            else
            {
                key[i][j] = 0;
            }
        }
        GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); // 恢复当前行高电平
    }
    return 0; // 如果没有按键被按下,返回0或可以选择返回一个特定的字符表示无输入
}

4.获取源码方式

https://download.csdn.net/download/weixin_41011452/90338338

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

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

相关文章

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤&#xff1a; 第一步&#xff1a;发起请求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器请求HandlerMapping查找 Handler &#xff08;可以根据xml配置、注解进行查找&#xff09; 匹配条件包括…

unity学习25:用 transform 进行旋转和移动,简单的太阳地球月亮模型,以及父子级关系

目录 备注内容 1游戏物体的父子级关系 1.1 父子物体 1.2 坐标关系 1.3 父子物体实际是用 每个gameobject的tranform来关联的 2 获取gameObject的静态数据 2.1 具体命令 2.2 具体代码 2.3 输出结果 3 获取gameObject 的方向 3.1 游戏里默认的3个方向 3.2 获取方向代…

CH340G上传程序到ESP8266-01(S)模块

文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL&#xff08;CH340G&#xff09;将Arduino将程序上传…

DeepSeekMoE:迈向混合专家语言模型的终极专业化

一、结论写在前面 论文提出了MoE语言模型的DeepSeekMoE架构&#xff0c;目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离&#xff0c;DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。从较小的2B参数规模开始&#x…

扩散模型(二)

相关阅读&#xff1a;扩散模型&#xff08;一&#xff09; Parameterization of L t L_t Lt​ for Training Loss 回想一下&#xff0c;我们需要训练一个神经网络来近似反向扩散过程中的条件概率分布&#xff0c;即, p θ ( x t − 1 ∣ x t ) N ( x t − 1 ; μ θ ( x t…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.18 对象数组:在NumPy中存储Python对象

2.18 对象数组&#xff1a;在NumPy中存储Python对象 目录 #mermaid-svg-shERrGOBuM2rBzeB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shERrGOBuM2rBzeB .error-icon{fill:#552222;}#mermaid-svg-shERrGOBuM2rB…

LabVIEW双光子成像系统:自主创新,精准成像,赋能科研

双光子成像系统&#xff1a;自主创新&#xff0c;精准成像&#xff0c;赋能科研 第一部分&#xff1a;概述 双光子成像利用两个低能量光子同时激发荧光分子&#xff0c;具有深层穿透、高分辨率、低光损伤等优势。它能实现活体深层组织的成像&#xff0c;支持实时动态观察&…

bagging框架

bagging 1 bagging介绍 Bagging的全称是Bootstrap Aggregating&#xff0c;其思想是通过将许多相互独立的学习器的结果进行结合&#xff0c;从而提高整体学习器的泛化能力 bagging框架流程&#xff1a;首先&#xff0c;它从原始数据集中使用有放回的随机采样方式抽取多个子集…

《机器学习数学基础》补充资料:仿射变换

本文是对《机器学习数学基础》 第 2 章 2.2.4 节齐次坐标系的内容拓展。 1. 名称的来源 仿射&#xff0c;是英文单词 affine 的中文翻译。 单词 affine&#xff0c;读音&#xff1a;[ə’faɪn]。来自于英语 affinity。英语词根 fin 来自于拉丁语 finis&#xff0c;表示“边…

冲刺一区!挑战7天完成一篇趋势性分析GBD DAY1-7

Day1. 公开数据库的挖掘太火热了,其中GBD数据库的挖掘又十分的火爆.那我就来挑战一篇GBD、一篇关于趋势性分析的GBD&#xff01; GBD数据库挖掘是目前的四大刊常客&#xff0c;经常出现在顶级期刊上面。这个数据库亮点就是&#xff1a;可视化&#xff0c;统计学简单、而数据可…

掌握API和控制点(从Java到JNI接口)_36 JNI开发与NDK 04

4、 *.so的入口函数&#xff1a;JNI_OnLoad() VM (virtual machine)的角色 Java代码在VM上执行。在执行Java代码的过程中&#xff0c;如果Java需要与本地代码(*.so)沟通时&#xff0c; VM就会把*.so視为插件<Tn>而加载到VM里。然后让Java函数呼叫到这插件<Tn>里的…

Spring Bean 容器

技术成长&#xff0c;是对场景设计细节不断的雕刻&#xff01; 你觉得自己的技术什么时候得到了快速的提高&#xff0c;是CRUD写的多了以后吗&#xff1f;想都不要想&#xff0c;绝对不可能&#xff01;CRUD写的再多也只是能满足你作为一个搬砖工具人&#xff0c;敲击少逻辑流…

Maven全解析:从基础到精通的实战指南

概念&#xff1a; Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建&#xff0c;依赖管理和项目信息管理项目构建&#xff1a;高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准化的流程 依赖管理&#xff1a; 对第三方依赖包的管理&#xf…

【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)

本文项目编号 T 153 &#xff0c;文末自助获取源码 \color{red}{T153&#xff0c;文末自助获取源码} T153&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

高效接口限流:基于自定义注解与RateLimiter的实践

在高并发场景下&#xff0c;接口的流量控制是保证系统稳定性和提升性能的关键之一。通过实现接口限流&#xff0c;我们可以有效避免系统在访问高峰时发生崩溃。本文将详细介绍如何通过自定义注解和切面编程结合RateLimiter来实现接口的限流功能&#xff0c;以应对高并发请求。 …

nodejs:express + js-mdict 网页查询英汉词典,能播放声音

向 DeepSeek R1 提问&#xff1a; 我想写一个Web 前端网页&#xff0c;后台用 nodejs js-mdict, 实现在线查询英语单词 1. 项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1a; mydict-app/ ├── public/ │ ├── index.html │ ├── st…

无人机PX4飞控 | PX4源码添加自定义uORB消息并保存到日志

PX4源码添加自定义uORB消息并保存到日志 0 前言 PX4的内部通信机制主要依赖于uORB&#xff08;Micro Object Request Broker&#xff09;&#xff0c;这是一种跨进程的通信机制&#xff0c;一种轻量级的中间件&#xff0c;用于在PX4飞控系统的各个模块之间进行高效的数据交换…

【IocDI】_存储Bean的五大类注解及getBean的使用

目录 1. Bean的存储 1.1 类注解 1.1.1 Controller&#xff1a;控制器存储 1.1.2 Service&#xff1a;服务存储 1.1.3 Repository&#xff1a;仓库存储 1.1.4 Component&#xff1a;组件存储 1.1.5 Configuration&#xff1a;配置存储 1.2 五大类注解之间的关系 2. get…

VLAN 基础 | 不同 VLAN 间通信实验

注&#xff1a;本文为 “ Vlan 间通信” 相关文章合辑。 英文引文&#xff0c;机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信&#xff1f; Posted on November 20, 2015 by RouterSwi…

GRE阅读双线阅读 --青山学堂GRE全程班 包括 阅读、数学、写作、填空、背单词

新版GRE考试整体结构 section题量时间写作1篇issue30min语文S112道题(7道填空5道阅读)18min数学S112道题21min语文S215道题(7道填空8道阅读)23min数学S215道题26min Tips: 写作结束后&#xff0c;语文和数学的顺序不固定&#xff0c;2中可能&#xff1a; issue -> V ->…