0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于GPIO的按键板实现方案

454398 来源:csdn 作者:NutriYang 2020-10-18 11:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

介绍简单的ADC实现,需要IC提供一个额外的ADC。但出于IC成本的考虑,无法提供这个的ADC时,但提供了多个额外的GPIO(General Purpose Input Output:双向的:可以为输入/输出,只有两个状态High/Low),就可以使用本篇的实现方法了。

基于GPIO的按键板

基于GPIO的按键板实现,需要提供额外的GPIO口供使用。GPIO口足够多的话可以一个按键对应一个GPIO,不够多的时候可以使用矩阵扫描方式实现,若可供使用的GPIO连矩阵扫描方式都不满足,还可以增加二极管来进一步扩展成2个GPIO实现6个按键,本节将简单介绍这些方法。另外还可以通过扩展GPIO的方法来实现,将在下一篇幅中专门介绍。

嵌入式开发中,GPIO是最常用的控制接口,普通GPIO只具有High/Low两个状态,我们可以对其进行Read/Write操作。

1:足够多的GPIO供使用

则每个按键对应一个GPIO口,电路设计可以保证:无按键动作GPIO口为Low,有按键动作GPIO口为High,或者相反。软件设计只需要逐个扫描每个GPIO口的状态,就可以知道某个按键是否有动作。

2:有限的GPIO供使用:使用矩阵扫描按键方式是最常见的方案。

其原理如下:任意两个GPIO之间连接一个按键,比如GPIO_1 & GPIO_2,其默认状态为Low,按键按下的话,两者就连通了,这就意味着,我们可以先给GPIO_1一个High信号,接着去读取GOIO_2,如果得到High,则这个按键被按下了,否则就是没有按键动作。

数学告诉我们,基于这种方案的N个GPIO口,最多可以实现N*(N-1)/2个按键,也就是N的组合数。如下图:4个GPIO(A/B/C/D)实现6(KEY_1…KEY_6)个按键的原理图

变成也是比较简单了,给个C代码如下:

这里通过适当的流程设计,可以使得代码紧凑有序。在按键比较少的情况下,一个挨着一个的去读写的方法也不错,但在较多按键的时候,上面代码的流程设计就比较具有优势了。能够在1分钟内,看明白为什么使用 i*k+k-1 作为返回索引,我相信你的逻辑能力很OK。

3:进一步扩展---2个GPIO实现6个按键

如果在你的设计中,GPIO口的数量很有限,不能满足矩阵扫描方式的需要,那么你有两种选择:1 扩展GPIO口,下一篇幅中将专门讨论;2 增加一些二极管来进一步扩充矩阵扫描方式的能力。我们这里讨论一个2个GPIO实现6个按键的方法,原理图如下:

这种实现方法实际上就是利用了二极管的单向导通特性,使得我们可以区分更多的按键,分析如下:

1:Write GPIO_1=1 & GPIO_2=1,接着Read if GPIO_1==0 & GPIO_2==0,则为 KEY_3;

if GPIO_1==0 & GPIO_2==1,则为 KEY_1;

if GPIO_1==1 & GPIO_2==0,则为 KEY_2;

2:Write GPIO_1=0 & GPIO_2=1, 接着Read if GPIO_2==0,则为 KEY_4 or KEY_6;

需要进一步判断:Write GPIO_1=1 & GPIO_2=0 然后Read:if GPIO_1==0 则为 KEY_4;

if GPIO_1==1 则为 KEY_6;

3:反序执行步骤2,可以区分出 KEY4 & KEY5。

明白了原理,软件编程实现就比较简单了,给出一个实现如下:

在这个编程实现里,在写操作之后,可能需要适当的Delay以使得其状态稳定;若是基于总线的嵌入式系统,也需要在函数退出前释放总线。

3:总结与讨论

基于矩阵扫描方式的按键板实现,是很最常用的。在GPIO口比较紧缺的情况下,可以通过在电路中适当增加几个二极管来解决。如果这样还不能解决,就必须设法扩展GPIO了,稍后讨论。

下面给出了一个很不错的 矩阵扫描+二极管扩展 的电路图,你能为它写一个驱动吗?相当具有挑战性哦,试试看吧……

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 矩阵
    +关注

    关注

    1

    文章

    450

    浏览量

    36240
  • 软件编程
    +关注

    关注

    1

    文章

    42

    浏览量

    11754
  • GPIO
    +关注

    关注

    16

    文章

    1333

    浏览量

    56430
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析RK平台GPIO驱动:从原理到调试,开发者必看指南

    GPIO(通用输入输出)作为嵌入式系统中最基础也最常用的硬件接口,是连接芯片与外部设备的 “桥梁”。从简单的 LED 控制、按键检测,到复杂的传感器通信,都离不开 GPIO 的支持。在瑞芯微(RK
    的头像 发表于 02-03 15:53 1219次阅读
    深入解析RK平台<b class='flag-5'>GPIO</b>驱动:从原理到调试,开发者必看指南

    嵌入式新手必看!GPIO调试从0到1:计算、操作、排错全指南

    在嵌入式开发中,GPIO(通用输入输出口)是最基础也最常用的硬件接口 —— 小到控制一颗 LED 亮灭、读取一个按键状态,大到驱动传感器、控制外设,都离不开 GPIO。但对新手来说,“怎么确定
    的头像 发表于 02-01 16:55 3924次阅读
    嵌入式新手必看!<b class='flag-5'>GPIO</b>调试从0到1:计算、操作、排错全指南

    【瑞萨RA × Zephyr评测】LED、按键和UART

    实现在Zephyr操作系统下按键控制 LED 的开关状态,并通过 UART 输出按键事件日志,验证 GPIO 和串口通信功能。
    的头像 发表于 01-10 10:21 2588次阅读
    【瑞萨RA × Zephyr评测】LED、<b class='flag-5'>按键</b>和UART

    ElfBoard技术贴|如何在【RK3588】ELF 2开发板实现GPIO功能复用

    IOMUX(引脚功能复用)是芯片厂商为高效利用有限引脚资源而设计的关键技术,它允许单个物理引脚通过软件灵活配置为多种功能(如GPIO、UART、I2C等)。鉴于不同SoC的配置方式各异,本文将以
    的头像 发表于 12-29 10:37 1446次阅读
    ElfBoard技术贴|如何在【RK3588】ELF 2开发<b class='flag-5'>板实现</b><b class='flag-5'>GPIO</b>功能复用

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程
    的头像 发表于 11-28 11:32 1688次阅读
    基于迅为RK3588开发<b class='flag-5'>板实现</b>高性能机器狗主控解决<b class='flag-5'>方案</b>- AI能力实战:YOLOv5目标检测例程

    极简主义者的福音:GPIO关机功能,短按长按一代码搞定!

    追求代码简洁高效?这个GPIO关机方案正适合你。仅需少量代码,即可实现按键短按执行重启、长按触发关机,结构清晰,易于移植和维护。 本文将以Air8000核心板为例,分享如何使用
    的头像 发表于 10-26 16:58 1085次阅读
    极简主义者的福音:<b class='flag-5'>GPIO</b>关机功能,短按长按一代码搞定!

    在友晶DE1-SOC开发板实现Chirikov标准映射求解器

    该项目是在友晶DE1-SOC开发板实现Chirikov标准映射的求解器,并将其应用于图像加密和解密的概念验证。
    的头像 发表于 07-07 15:22 2000次阅读
    在友晶DE1-SOC开发<b class='flag-5'>板实现</b>Chirikov标准映射求解器

    AS32X601驱动系列教程 GPIO_按键检测详解

    在嵌入式系统开发中,GPIO(通用输入输出端口)是实现硬件与软件交互的关键组件。本节主要利用的时GPIO的输入采集功能,本节的主要功能为,读取板载按键,当
    的头像 发表于 05-23 16:44 962次阅读
    AS32X601驱动系列教程 <b class='flag-5'>GPIO</b>_<b class='flag-5'>按键</b>检测详解

    第六章 GPIO输入——按键检测

    本篇文章讲述了如何在W55MH32上实现按键输入检测,以及按键输入检测的注意事项、实现方式和代码讲解等。掌握了按键检测方式之后,我们就可以用
    的头像 发表于 05-22 16:41 1130次阅读
    第六章 <b class='flag-5'>GPIO</b>输入——<b class='flag-5'>按键</b>检测

    基于RV1126开发板实现人脸检测方案

    在RV1126开发板上实现人脸检测:在图像中找出人脸,以及每张人脸的landmarks位置。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像, 算法代码负责人脸检测功能。
    的头像 发表于 04-21 17:59 1205次阅读
    基于RV1126开发<b class='flag-5'>板实现</b>人脸检测<b class='flag-5'>方案</b>

    基于RV1126开发板实现人脸检测方案

    在RV1126开发板上实现人脸检测:在图像中找出人脸,以及每张人脸的landmarks位置。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像, 算法代码负责人脸检测功能。
    的头像 发表于 04-21 14:00 13次阅读
    基于RV1126开发<b class='flag-5'>板实现</b>人脸检测<b class='flag-5'>方案</b>

    基于RV1126开发板实现人脸识别方案

    在RV1126上实现人脸识别:在图像中找出人脸,并与数据库进行比对,得出该人脸对应的身份信息。 方案设计逻辑流程图,方案代码分为分为三个业务流程,主体代码负责抓取、合成图像,算法代码负责人脸识别功能,
    的头像 发表于 04-21 13:51 11次阅读
    基于RV1126开发<b class='flag-5'>板实现</b>人脸识别<b class='flag-5'>方案</b>

    基于RV1126开发板实现人员检测方案

    在RV1126上实现人员检测:在图像中找出人。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像,算法代码负责人员检测功能。
    的头像 发表于 04-21 10:42 1008次阅读
    基于RV1126开发<b class='flag-5'>板实现</b>人员检测<b class='flag-5'>方案</b>

    基于RV1126开发板实现人脸识别方案

    在RV1126开发板上实现人脸识别:在图像中找出人脸,并与数据库进行比对,得出该人脸对应的身份信息。 方案设计逻辑流程图,方案代码分为分为三个业务流程,主体代码负责抓取、合成图像,算法代码负责人脸识别功能,
    的头像 发表于 04-21 10:24 107次阅读
    基于RV1126开发<b class='flag-5'>板实现</b>人脸识别<b class='flag-5'>方案</b>

    基于RV1126开发板实现人脸检测方案

    在RV1126开发板上实现人脸检测:在图像中找出人脸,以及每张人脸的landmarks位置。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像, 算法代码负责人脸检测功能。
    的头像 发表于 04-21 10:21 99次阅读
    基于RV1126开发<b class='flag-5'>板实现</b>人脸检测<b class='flag-5'>方案</b>