按键板的原理和实现--基于GPIO的按键板

Posted yuanqiangfei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按键板的原理和实现--基于GPIO的按键板相关的知识,希望对你有一定的参考价值。

   上篇介绍简单的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了,稍后讨论。

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

技术图片

 

 

原文链接:https://blog.csdn.net/nutriyang/article/details/4368050

 

以上是关于按键板的原理和实现--基于GPIO的按键板的主要内容,如果未能解决你的问题,请参考以下文章

代换了液晶显示器驱动板后控制面板失灵无法关闭电源

基于鸿蒙OS的按键驱动

基于鸿蒙OS的按键驱动

pads layout“自动打地孔”

软件测试基础 : 集成测试

不写一行代码:实现安卓基于GPIO的LED设备驱动