GPIO应用-键盘

键盘模型及接口

键盘:由单个或多个按键组成,最简单的MCU数字量输入设备。

通过键盘可输入数据或命令,实现人机通信。

键盘与MCU的连接方式分为:独立方式矩阵方式

独立方式:将每个独立按键一对一方式直接接到MCU的GPIO输入引脚,直接读取引脚状态,便可以确定哪个按键被按下。实现简单,但占用GPIO引脚资源较多,一般只用于按键数量少于六个的情况。

矩阵键盘:由m条行线与n条列线组成,在行列线的每一个交点上设置一个按键。

如何识别按键?

若键盘上闭合键的识别由专用硬件实现,称为编码键盘;靠软件实现的称为未编码键盘。

未编码键盘的接口技术:

键盘输入程序的设计:

如何识别是否按下还是抖动?

抖动:当按键被按下/释放时,会出现所按的键在闭合位置和断开位置之间跳几下,才稳定到闭合状态的情况。

在软件上解决抖动的方法:延时等待抖动的消失;多处识别判定

解决方法:查询法;定时扫描法;中断法

识别哪个键被按下?

行扫描法;行反转法

如何处理重键?

即两个及两个以上按键同时处于闭合状态的处理问题

解决方法:连锁法;巡回法

对键盘编程

4x4键盘为例说明行扫描法识别按键的基本变成原理:

列线通过电阻接+5V,当键盘上没有键闭合时,所有的行线和列线断开,列线n1到n4都呈高电平。

当键盘上某一个键闭合时,则该键所对应的行线与列线短路。

当标记为“6”的键被按下时,行线m3和列线n2短路,此时n2线上的电平由m3的电位所决定。

 

行扫描法识别按键基本原理

把列线n1到n4接到MCU的输入引脚,行线m1到m4接到MCU的输出引脚,则在MCU的控制下,使行线m1为低电平,其余三根行线m2、m3、m4都是高电平,并读列线n1到n4的状态。

如果n1到n4都是高电平,则m1这一行上没有键闭合。

如果读出列线n1~n4的状态不全为高电平,那么为低电平的列线和m1相交的键处于闭合状态。

如果m1这一行上没有键闭合,接着使行线m2为低电平,其余行线为高电平,用同样的方法检查m2这一行上有无键闭合。

以此类推,最后行线m4为低电平,其余的行线为高电平,检查m4这一行上是否有键闭合。

这种逐行逐列地检查键盘状态的过程称为对键盘的一次扫描。

MCU对键盘扫描可以采取程序控制的随机方式,空闲时扫描键盘。

也可以采取定时控制,每隔一定时间,对键盘扫描一次。

若接在键盘列线的MCU引脚具有下降沿或低电平中断功能,也可以采用中断方式,当键盘上有键闭合时,列线产生请求中断,CPU响应键盘输入中断,在中断服务例程中对键盘进行扫描,以识别哪一个键处于闭合状态。

仅知道第几行第几列被按下还不够,需要给每一个按键编号(键值),从而唯一确定一个按键。

键值是MCU获取硬件连接方式下每个按键的具有唯一性的数字表达。

例如:当“7”被按下时,m1和n1为低电平,取0其余位为1。

使用8位排序表达键值,放入一个字节(m₄m₃m₂m₁ n₄n₃n₂n₁)内。 “7”对应二进制位1110 1110,即十六进制为0xEE;“8”对应二进制1101 1110,即十六进制为0xED。

 

键盘驱动构件方法

键盘与MCU的连接,键盘需要通过物理连接与MCU连接,为了移植方便,我们在kb.h头文件中使用宏定义来描述硬件接线,并且每个接线单独宏定义,更有普适性。这样,若键盘接在MCU的不同引脚,只需修改键盘的硬件接线宏定义即可。

 关于抖动,可以采用多次扫描的方式消除键盘按下或弹开时产生的抖动。

再次关于键值与定义值的对应,在kb.c文件的头部给出,方便查阅使用会根据实际按键进行修改。

键盘的初始化函数KBInit用以初始化MCU相关引脚为GPIO功能,并且初始化输入引脚内部上拉;

为了获取键盘键值定义了键盘扫描程序KNScanN,该函数会根据传入的参数scan_cnt决定扫描次数,从而可以多次扫描以消除键盘按下或弹起时的抖动。

 

 

嵌入式技术基础与实践(第4版)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中,使用GPIO中断可以实现应用层对外部事件的实时响应。为了使用GPIO中断,首先需要创建一个驱动模块目录。可以通过以下命令在指定目录下创建驱动模块目录: ``` $ cd ~/tmp/linux-4.15/drivers $ mkdir my_driver_interrupt_signal $ touch my_driver_interrupt_signal.c ``` 接下来,可以使用适当的代码来编写驱动程序,以实现GPIO中断的功能。在驱动程序中,需要定义中断处理函数和发送信号的函数。中断处理函数在中断发生时被调用,并可以在其中调用发送信号的函数,从而通知应用程序。具体的实现可以参考上述引用中的代码片段。 编译和测试驱动程序可以使用以下命令: ``` $ gcc my_interrupt_singal.c -o my_interrupt_singal $ sudo ./my_interrupt_singal ``` 这些命令将编译并执行应用程序,并在应用程序中调用相应的IOCTL函数。在应用程序中,可以通过按下键盘上的ESC键来触发中断,从而发送信号给应用层。在中断处理函数中,可以进一步处理接收到的信号,以完成特定的任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Linux驱动实践:中断处理函数如何【发送信号】给应用层?](https://blog.csdn.net/u012296253/article/details/122418815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值