当前位置: 首页 > news >正文

使用STM32F103标准库实现自定义键盘

使用STM32F103标准库实现自定义键盘

在嵌入式系统中,自定义键盘的实现是一个经典的项目,能够帮助我们深入理解GPIO配置、按键扫描和中断处理等知识。本文将详细介绍如何使用STM32F103标准库来实现一个简单的自定义键盘。

1. 准备工作

1.1 硬件准备
  • STM32F103开发板
  • 按键矩阵(4x4)
  • 跳线和面包板
1.2 软件准备
  • STM32标准外设库(Standard Peripheral Library)
  • Keil MDK或其他支持STM32的IDE

2. 硬件连接

在我们的项目中,4x4键盘矩阵包含16个按键。键盘矩阵有4行和4列,我们需要将这8条线连接到STM32的GPIO引脚上。

假设我们将行连接到GPIO的Pin0-Pin3,列连接到Pin4-Pin7:

行:GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3
列:GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6, GPIO_Pin_7

3. 软件实现

3.1 GPIO初始化

首先,我们需要初始化GPIO引脚,用于行和列的输入和输出。

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"void GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 启用GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置行引脚为输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置列引脚为输入上拉GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3.2 键盘扫描函数

接下来,我们需要实现一个函数来扫描键盘矩阵,检测按键状态。

uint8_t Keypad_Scan(void) {for (uint8_t row = 0; row < 4; row++) {// 将所有行设置为高电平GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);// 将当前行设置为低电平GPIO_ResetBits(GPIOA, (1 << row));for (uint8_t col = 0; col < 4; col++) {// 检查列引脚的状态if (!GPIO_ReadInputDataBit(GPIOA, (1 << (col + 4)))) {return (row * 4 + col) + 1; // 返回按键编号}}}return 0; // 没有按键被按下
}
3.3 主函数

在主函数中,我们将初始化GPIO并调用键盘扫描函数来检测按键状态。

int main(void) {// 配置系统时钟SystemInit();// 初始化GPIOGPIO_Config();while (1) {uint8_t key = Keypad_Scan();if (key) {// 处理按键事件// 这里可以添加按键处理代码}}
}

4. 总结

通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!

相关文章:

使用STM32F103标准库实现自定义键盘

使用STM32F103标准库实现自定义键盘 在嵌入式系统中&#xff0c;自定义键盘的实现是一个经典的项目&#xff0c;能够帮助我们深入理解GPIO配置、按键扫描和中断处理等知识。本文将详细介绍如何使用STM32F103标准库来实现一个简单的自定义键盘。 1. 准备工作 1.1 硬件准备 S…...

面试八股之JVM篇3.5——垃圾回收——G1垃圾回收器

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…...

解决LabVIEW通过OPC Server读取PLC地址时的错误180121602

在使用LabVIEW通过OPC Server读取PLC地址时&#xff0c;若遇到错误代码180121602&#xff0c;建议检查网络连接、OPC Server和PLC配置、用户权限及LabVIEW设置。确保网络畅通&#xff0c;正确配置OPC变量&#xff0c;取消缓冲设置以实时读取数据&#xff0c;并使用诊断工具验证…...

npm,yarn,cnpm,tyarn,pnpm 安使用装配置镜像

npm 安装 安装node后就可以使用了 官方默认地址 npm config set registry https://registry.npmjs.org 镜像 npm config set registry https://registry.npm.taobao.org npm config set registry http://registry.npmmirror.org全局安装依赖 npm install -g <包名&g…...

使用python将一段文本写入一个txt文件中且先格式化文件名

有一段文本内容&#xff0c;有“标题”和“内容”组成。 任务&#xff1a;要将这段文本&#xff0c;存放到一个txt文件中&#xff0c;文件名为当天的日期加上“标题”内容。因为“标题”内可能有/<>之类的&#xff0c;还需要格式化一下。 已经将上述功能都写成了函数&a…...

前端 CSS 经典:元素倒影

前言&#xff1a;好看的元素倒影&#xff0c;可以通过-webkit-box-reflect 实现。但有兼容问题&#xff0c;必须是 webkit 内核的浏览器&#xff0c;不然没效果。但是好看啊。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"&g…...

ROS学习记录:用C++实现IMU航向锁定

前言 获取IMU数据的C节点 在了解了如何获取到IMU的姿态信息&#xff08;链接在上面&#xff09;后&#xff0c;接下来尝试实现让一个节点在订阅IMU数据的时候&#xff0c;还能发布运动控制指令&#xff0c;使机器人能对姿态变化做出反应&#xff0c;达到一个航向锁定的效果。 …...

设计模式-策略模式-使用

设计模式-策略模式-CSDN博客 系统中有很多类&#xff0c;它们之间的区别仅在于它们的行为。策略模式可以定义一系列的算法&#xff0c;并将它们一个个封装起来&#xff0c;使它们可以相互替换。这样&#xff0c;算法就可以独立于使用它的客户而变化。需要使用算法的不同变体。…...

WebSocket——相关介绍以及后端配置

一、WebSocket介绍&#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;旨在改进客户端和服务器之间的实时通信。以下是关于WebSocket的详细介绍&#xff1a; 1、定义与标准 WebSocket是独立的、创建在TCP上的协议&#xff0c;通过HTTP/1.1协议的10…...

单片机设计注意事项

1.电源线可以30mil走线&#xff0c;信号线可以6mil走线 2.LDO推荐 SGM2019-3.3,RT9013,RT9193,1117-3.3V。 3.单片机VCC要充分滤波后再供电&#xff0c;可以接0.1uf的电容 4.晶振附件不要走其他元件&#xff0c;且放置完单片机后就放置晶振&#xff0c;晶振靠近X1,X2。...

Ubuntu 如何根据NVIDIA显卡型号确定对应的显卡驱动版本并安装

目录 一、查询推荐安装的驱动版本 二、安装推荐版本的驱动 1. 通过终端安装&#xff0c;只安装 nvidia 驱动&#xff08;亲测可用&#xff01;&#xff09; 2. 通过 software & Updates 安装&#xff0c;安装 nvidia 驱动。 三、查询能安装的最新的显卡驱动版本 1. 方…...

如何选择一款安全高效的数据自动同步工具?

随着科技的不断发展&#xff0c;企业处理的数据量愈发庞大。数字化浪潮的涌现使得数据在业务活动和决策中的角色变得日益重要&#xff0c;然而这些数据往往分布在不同的位置&#xff0c;需要进行同步和分类&#xff0c;以便更有效地利用。以下是一些常见的数据自动同步场景&…...

【linux】docker下nextcloud安装人脸识别插件

一、插件源码地址&#xff1a; GitCode - 开发者的代码家园 二、插件官网地址&#xff1a; Releases - Face Recognition - Apps - App Store - Nextcloud 三、插件安装教程&#xff1a; 1、查看本地nextcloud版本号 http://ipAddress:8080/settings/admin/overview 2、找…...

2. C++服务器编程-信号

什么是信号 其实信号就是一个中断。就是在执行程序的时候突然来了一个信号&#xff0c;然后我们去执行这个新来的程序了&#xff0c;这就是中断。 处理方法 信号的处理方式∶忽略、捕获、默认处理 linux中都有那些信号 man7 signal 比如说kill -9 安装man中文手册 自己百…...

C#_库的引用

类库的引用 还可以自己引用类库&#xff1a;解决方案-添加-新建项目 主程序 using System; using System.Windows.Forms; using Tools;namespace ConsoleApp2 {class Program{static void Main(string[] args){//Console.WriteLine("helloword");// Form form ne…...

C++:STL—算法

C:STL—算法 算法 算法 STL&#xff08;Standard Template Library&#xff09;中的算法是为了操作数据集合&#xff08;如容器&#xff09;而设计的函数模板集合&#xff0c;它们提供了丰富的功能和灵活的接口&#xff0c;可以用于对数据进行排序、查找、遍历等操作。STL中的…...

深入探索:移动云服务器的强大之处

文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用&#xff0c;无需在本地设备上进行存储和处…...

线性表(从数据结构的三要素出发)

文章目录 逻辑结构存储结构顺序存储链式存储单链表双链表循环单链表循环双链表静态链表 数据的操作顺序结构链式结构单链表双链表 逻辑结构 线性表是具有相同数据类型的 n ( n ≥ 0 ) n(n≥0) n(n≥0)个数据元素的有限序列&#xff0c;其中 n n n为表长&#xff0c;当 n 0 n0…...

[SCTF2019]babyre

打开看看还是有花指令 解除后首先pass1是解maze&#xff0c;好像又是三维的 x是25&#xff0c;也就是向下跳五层,注意是立体的 得到 passwd1&#xff1a; ddwwxxssxaxwwaasasyywwdd 接着往下看 有一个加密函数IDA逆向常用宏定义_lodword-CSDN博客 unsigned __int64 __fastca…...

uniapp实现下拉过滤查询列表

<picker bindchange"bindPickerChanges" value"{{selectedIndex}}"range"{{pickerArray}}"range-key"name"><view class"area-select">在线状态&#xff1a;<label for"">{{pickerArray[select…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...