我的一个基于stm32的独立按键扫描方式

2023-10-26

这两天完成了一个stm32的工程,在解决按键时写出了一个独立按键的扫描函数,应该有前辈已经出来了,的其实质就是普通的扫描方式修改的,优点是将按键相关参数封装为一个结构体,每加一个按键都不需要在函数中增加语句,废话少说,先看扫描函数


//*******************************************************************
// Function:  扫描按键
// Returns:   u8 :按键id值
//*******************************************************************
u8 KeyScan()
{  
static u8 keyUp=1;//按键按松开标志
u8 i,count,upCount=0;
count=sizeof(buttons)/sizeof(Button);
for (i=0;i<count;i++)
{
if (keyUp && (GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==0))
{
keyUp = 0;
delay_ms(10);
if (GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==0)
{
return buttons[i].ButtonId;
}
}
else if ((GPIO_ReadInputDataBit(buttons[i].ButtonPort,buttons[i].ButtonPin)==1))
{
upCount++;  //记录有多少个按键松开了
}
}
if (upCount == count) //按键松开数等于总按键数
{
keyUp = 1;
}
return ButtonNone;// 无按键按下
}


通俗易懂吧。接下来看结构体原型

typedef struct  
{
GPIO_TypeDef*       ButtonPort; //按键端口
    uint16_t             ButtonPin; //按键引脚
u8 ButtonId; //按键ID
}Button;

使用方法

Button buttons[]={ {GPIOB,GPIO_Pin_5,ButtonFunction},
{GPIOB,GPIO_Pin_6,ButtonUp},
{GPIOB,GPIO_Pin_1,ButtonDown},
{GPIOB,GPIO_Pin_0,4}};

一般的结构体初始化方法,前两个参数大家都懂,最后一个可以定义一个枚举,当然也可以自己赋值,注意别重复和定义为0了,因为0一般用来当作没有按键的返回值。如今要加减按键就只需在上面的数组中处理。当然别忘了端口的初始化,这个就不说了。


分析一下优缺点,

优点:便于扩展,每加减一个按键都不用修改主要的按键扫描函数,如果端口初始化函数写得好的话连端口初始化函数都可以不用管。

缺点:如果按键过多,会损失不少时间,主要原因是循环结构



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的一个基于stm32的独立按键扫描方式 的相关文章

  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • vue——组件传值(高级)、属性传值、反向传值、跨级传值

    一 属性传值 父传子 父组件通过属性传值给子组件 父组件修改数据后会刷新页面并重新传值给子组件 子组件可以修改父组件传的值并刷新自己的页面 但是并不会修改父组件中的值 父组件App
  • PP-YOLO实现二维码检测与识别:一种完整的工作流程与优化策略

    目录 一 简介 二 算法介绍 三 训练和评估 3 1 环境配置 3 1 1 下载并安装PaddleDetection
  • 本科生毕业论文(设计) 免费赠送项目完整源码,可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案等

    本科生毕业论文 设计 摘要 1 绪论 1 1 研究背景 1 2国内外研究现状 1 3论文结构与章节安排 2 二手校园交易平台系统分析 2 1 可行性分析 2 2 系统流程分析 2 2 1 数据流程 3 3 2 业务流程 2 3 系统功能分析
  • 佛学八正道

    八正道包括正见 正思惟 正语 正业 正命 正精进 正念 正定 大毘婆娑论 说 由正见故 起正思惟 由正思惟故 得正语 由正语故 复得正业 由正业故 复得正命 由正命故 发起正勤 由正勤故 便起正念 由正念故 能起正定 1 正见 正见 即非颠
  • java自学笔记5:java中的接口

    一 1 接口概念 接口可以理解为一种特殊的类 由全局常量和公共的抽象方法所组成 类是一种具体实现体 而接口定义了某一批类所需要遵守的规范 接口不关心这些类的内部数据 也不关心这些类里方法的实现细节 它只规定这些类里必须提供某些方法 2 接口
  • myeclipse关闭项目的作用

    我myeclipse用的是10 7 1 刚开始用的时候 经过配置优化 开启软件 在使用过程中还是挺快的 但是随着项目的增多 感觉机子越来越卡 后来经过了解才知道可以通过close project 的方式 让myeclipse的运行速度获得重
  • python接口自动化(十八)--重定向(Location)(详解)

    python接口自动化 十八 重定向 Location 详解 简介 在实际工作中 有些接口请求完以后会重定向到别的url 而你却需要重定向前的url URL主要是针对虚拟空间而言 因为不是自己独立管理的服务器 所以无法正常进行常规的操作 但
  • 详解引用「&」与指针「*」

    引入 C 语言中函数有两种传参的方式 传值和传址 以传值方式 在函数调用过程中会生成一份临时变量用形参代替 最终把实参的值传递给新分配的临时变量即形参 它的优点是避免了函数调用的一些副作用 但是它无法改变实参的值 函数调用完成之后实参的值不
  • oracle的引号和竖线连接符

    在ORACLE中 单引号有两个作用 一是字符串是由单引号引用 二是转义 单引号的使用是就近配对 即就近原则 而在单引号充当转义角色时相对不好理解 1 从第二个单引号开始被视为转义符 如果第二个单引号后面还有单引号 哪怕只有一个 select
  • python大一知识点_python知识点复习

    放假归来 这几天复习了一下好久不用的python 总结了一下知识点 语法基础tuple与list的异同都由多个元素组成 tuple由 组成 list由 组成 tuple不可变 list可变 tuple表示的是一种结构 而list表示的是多个
  • java编程项目之----图书管理系统(GUI+多线程+JDBC+集合)

    编写一个 Java GUI 应用程序 实现图书信息维护子系统 支持图书信息在数据库中的 存储 Java 应用程序使用 JDBC 连接数据库 并实现图书信息的查询 新增 修改和删除等操作 图书信息维护子系统 JDBC 系统体系结构如图 2 所
  • 【HTML基础】HTML文字效果标签+超齐全颜色表(可直接复制使用)

    CSDN话题挑战赛第2期 参赛话题 学习笔记 文字段落样式效果 文字效果 1 添加文字 2 标题文字效果 效果展示 标题字标签的属性 3 空格 4 特殊字符 5 注释 6 设置文字样式属性 7 上 下标 颜色表 英语单词 十六进制数值 汇总
  • js函数写法

    目录 1 函数声明 1 1 命名函数表达式 1 2 匿名函数表达式 常用 简化为 函数表达式 2 函数用法 3 arguments实参列表和形参属性 3 1 arguments 3 2 形参属性 3 3 举例任意数求和 3 4 易错点 1
  • Redis 学习笔记(十一)基数统计(HyperLogLog)

    Redis 学习笔记 十一 基数统计 HyperLogLog 1 介绍 HyperLogLog命令是redis在2 8版本中加入的 Redis中HyperLogLog是用来做基数统计的 HyperLogLog 的优点是 在输入元素的数量或者
  • Win10 编译运行Fortran77程序,开发环境搭建

    有个朋友说我讲的blas中的fortran语法有个地方不正确 非说他自己的理解是对的 怎么肯能 f77都看了十几年了 拿出证据来才行 朋友却说自己不知道怎么编译f77程序 好吧 那还这么自信呀 首先 可以使用intel的 parallel
  • 虚拟机部署前后端操作

    虚拟机部署前后端讲解 1 虚拟机部署后端 1 1后端打包 1 2启动dsgc tomcat 1 3部署war包 1 4打开swagger测试 1 4错误原因整理 2 虚拟机部署前端 2 1配置后端代理地址 2 2启动nginx 2 3测试前
  • 机器学习聚类——实验报告

    机器学习实验报告 实验报告pdf可在该网址下载 一 实验目的与要求 二 实验内容与方法 2 1 聚类算法学习与回顾 2 1 1 聚类任务 1 聚类任务的概念 2 符号定义 3 性能度量 2 1 2 K means的算法模型 1 优化问题 2
  • CSMA/CD算法过程模拟——数组模拟信道(C/C++)

    代码完成于2021 11 12 整体思路 用两个数组分别模拟 A gt B 和B gt A间通讯的信道 A B两主机各自拥有独立线程 线程move用来模拟信道中信号的移动 线程show用于打印信道 其中线程move和show detach
  • CTFSHOW-sql注入

    web171 最简单的sql注入 先演示基本操作 payload 1 union select 1 2 database 得到数据库名为ctfshow web 1 union select 1 2 group concat table na
  • 我的一个基于stm32的独立按键扫描方式

    这两天完成了一个stm32的工程 在解决按键时写出了一个独立按键的扫描函数 应该有前辈已经出来了 的其实质就是普通的扫描方式修改的 优点是将按键相关参数封装为一个结构体 每加一个按键都不需要在函数中增加语句 废话少说 先看扫描函数 Func