物协寒假培训Day12—键盘

一、认识开发板上的键盘

开发板上的键盘主要分为独立键盘和矩阵键盘两种,通过J5跳线帽切换这两种键盘。开发板上面分别标有KBDBTN,其中KBD就是key board,键盘的意思(矩阵键盘),BTN表示button,独立按键,知道了这个我们就能很好的记忆。下面为开发板的实物图:

1.独立键盘

J5跳线帽2,3的时候为独立键盘,接1,2的时候为矩阵键盘。下图为独立键盘的示意图:

此处的S4,S5,S6,S7四个按键组成了独立键盘,当我们按下S4时,P33与GND接通,此时单片机的P33口读取到的电压为0,那么其它三个端口的电压为多少呢?我们看下面的图片:

我们现在使用的STC15F2K60S2系列的P3口默认都为准双向口,通过上面的图片可以看到,如果端口引脚没有输入的时候,其输入数据会被上拉电阻强行置为高电平。再看最后一句,准双向口读取外部状态前,要先锁存为"1"才可读到外部正确的状态,我们使用的15系列单片机在上电的时候就会把引脚置为高电平,已经默认锁存为1,可以直接读取外部状态。

2.矩阵键盘

J5跳线帽1,2的时候,此部分就会由独立键盘变为矩阵键盘

对于按键状态的识别,我们常用的方法有两种:线翻转法和行扫描法

下面是官方书籍中的介绍(采用行扫描法)
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的 I/O 口作为输出端,而列线所接的 I/O 口则作为输入端。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。 矩阵键盘中按键的识别有行扫描和线翻转两种方法,其中 行扫描法是一种最常用的按键识别方法,过程如下:
(1)逐行输出 0,检查列线是否非全高;
(2)如果某行输出 0 时,查到列线非全高,则该行有按键按下;
(3)根据输出 0 的行线和读入 0 的列线,即可判断按下按键的位置。
行扫描法的工作原理

P30,P31,P32,P33作为单片机输入引脚,P34,P35,P42,P44作为单片机的输出引脚。当开始工作时,我们把单片机四个输出引脚分别置0,然后在输入引脚处读取数值从而判断到底是哪个按键被按下。

举个栗子:我们假设S9按键被按下。首先,我们将单片机的P44引脚置0,由于S4~S7未有按键按下,因此单片机由于上拉电阻的作用,在输入端读取的数值都为1。然后我们把P44重新置为1,把P42置为0,由于S9被按下,此线路导通,因此P32引脚被置为0,其它为1,由此我们可以得知S9按键被按下了,往后以此类推。

代码原理分析

以上为代码的工作原理,按照4位一组,最终的结果为0x0400,对应S9按键被按下。

二、代码编写

1.独立键盘

2. 矩阵键盘

😋此处代码的switch()里面非常有规律。

三、按键消抖

(纯手画,比例不是很对,按下和松手的抖动时间<10ms,稳定期>数百ms)

1.按键抖动原理

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖

2.按键消抖的方法

1)普通软件延时

软件延时和松手检测都会占用CPU资源(delay)

2)标志位软件延时

通过引入按下标志位,省去了while(!KEY)的松手检测,将按下时稳定期的数百ms释放出来,只占用了按下和松手时的共20ms的消抖时间。

3)标志位定时器延时

使用定时器进行延时消抖,使用标志位代替松手检测(不会对主函数进行明显干扰)

4)状态机

算法成熟但代码量大(设置三种状态)

5)三行代码(位运算)

假设S4被按下了:

Key_Old

Key_Value

对应的按键过程

Key_Old ^ Key_Value

Key_Down

0

0

未按下

0

0

0

4

按下过程中

4

4

4

4

按下稳定期间

0

0

4

0

抬起过程中

4

0

拓展:Key_Up = ~Key_Value & (Key_Old ^ Key_Value);

Key_Old

Key_Value

对应的按键过程

Key_Old ^ Key_Value

Key_Up

0

4

未按下

0

0

0

0

按下过程中

4

0

4

0

按下稳定期间

0

0

4

4

抬起过程中

4

4

长按:if(Key_Old == 4 {(......)}
双击:设置一个标志位,每次加一
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸海恒音635

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值