vvvvcat

导航

 


如何判断是哪一个按键被按下?

列4(P2.4) 列5(P2.5) 列6(P2.6) 列7(P2.7)
行0(P2.0) S1 S2 S3 S4
行1(P2.1) S5 S6 S7 S8
行2(P2.2) S9 S10 S11 S12
行3(P2.3) S13 S14 S15 S16

进一步解释,分为两步:
1.单片机先让所有行(P2.0 - P2.3 )都通低电。然后看列,要是发现列 5(P2.5)是低电平,其他列(P2.4、P2.6、P2.7 )是高电平,说明列 5 这一列有按键被按,可能是 S2、S6、S10、S14 (这四个按键在列 5 )。
2. 再确定 “哪一行被按了”
先让行 0(P2.0)通低电,其他行(P2.1 - P2.3 )通高电。这时看列 5 ,要是还低,那就是行 0 和列 5 交叉的 S2 被按;要是列 5 变高了,说明不是行 0 。
在这里附上一张我手书总结的图片:

接着让行 1(P2.1)通低电,其他行通高电。看列 5 ,要是低了,就是行 1 和列 5 交叉的 S6 被按,依这法子,就能确定到底是 S2、S6、S10、S14 里哪个被按啦。

在这之后还有一个矩阵按键软件消抖的问题,由于矩阵按键本身的特性,它会产生机械抖动。

软件去抖操作步骤如下:

①检测到按键按下后进行10~15ms延时,用于跳过这个抖动区域。

②延时后再检测按键状态,如果没有按下,表明是抖动或者干扰造成,如果仍旧按下,可以认为是真正的按下,并进行对应的操作。

③同样按键释放后也要进行去抖动延时,延时后检测按键是否真正松开。

在这里我继续绘图演示。

2.项目软件程序设计
一般步骤:

  • 单片机将行线(P20~P23)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下,再来进一步确定键值。

拆分为步骤

  1. 单片机将行线(P20~P23)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下
  2. 当列线有出现低电平时调用延时程序以此来去除按键抖动
  3. 延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下
  4. 确定键值,一旦判断确实有按键按下后,行线轮流输出低电平,根据读入列线的数据可以确定键值

首先,单片机将P20输出为低电平,其他P21~P23输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P21输出低电平,其他P20、P22、P23仍为高电平,此时再来读取列线数据,发现列线读到的数据有低电平,数值为P20=1、P21=0、P22=1、P23=1(即1101),此时列项S7按键按下导.致P27=0、P26=1、P25=1、P24=1(即0111),最后将按键特征码组合为01111101(即0x7d),那么0x7d代表S7的按键值,执行按键扫描功能处理子程序就可以达到目的

代码设计流程框图如下:

posted on 2025-06-18 17:10  vvvvcat  阅读(93)  评论(0)    收藏  举报