有的人的单片机的部分端口引脚被一些固定原件占用了,无法直接读取ABCD端口对应寄存器的值,于是矩阵键盘8个引脚被迫各连各的,比如读A2,B3,C4,等等,很麻烦。那就用我的方法把,可以适用任意端口的引脚连接你的矩阵键盘,并用一个函数将对应按键按下数字作为读取按键值。
切记:4*4矩阵键盘是由行线,列线,各四条线交叉形成的16个点组成的,我采用先扫描行线上的电平值,再扫描列上的电平值,这样的方法识别按下了哪个键的。
我购买的器件及原理图如上, 仔细观察正面R1R2R3R4对应一二三四行,反过来背面看,从上往下数C4C3C2C1分别对应四三二一列,
如果我们先初始化R1R2R3R4对应你接在stm32上引脚的初始状态为输入上拉(GPIO_Mode_IPU),C4C3C2C1对应引脚为推挽输出(GPIO_Mode_Out_PP)。那么此时R1R2R3R4均为高电平,然后如果按下R1第一行S1S2S3S4,任意一个键,此时读取到的R1电平值为低电平,R2R3R4依然是高电平,🆗,此时,你起码可以通过读取R1R2R3R4对应引脚电平信息分辨按下的是哪一行了。当然,本例你按下第一行(假设这是初始化状态1)
同理,如果我们再初始化R1R2R3R4对应你接在stm32上引脚的初始状态为推挽输出(GPIO_Mode_Out_PP),C4C3C2C1对应引脚为推挽输出输入上拉(GPIO_Mode_IPU)。那么此时C4C3C2C1均为高电平,然后如果按下C1第一行S1S5S9S13,任意一个键,此时读取到的C1电平值为低电平,C2C3C4依然是高电平,你可以通过读取C4C3C2C1对应引脚电平判断按下的是那一列了,当然本例你按下第一列。(假设这是初始化状态2)
两者结合:在程序里,你设置先进行初始化状态1,扫描行的电平信息,发现Rn是低电平,然后再进行初始化状态2,发现Cm是低电平,单片机于是知道你按下了第n行第m列对应的按键。如果n=m=1,那就是按下s1.
基本原理已经清楚,下面上程序。
KEYPAD4×4.h
#ifndef __KEYPAD4x4_H
#define __KEYPAD4x4_H
#include "sys.h"
#include "delay.h"
#define KEYPAD4x4PORT GPIOA //定义IO接口组
#define KEY4 GPIO_Pin_11 //定义IO接口
#define KEY3 GPIO_Pin_12 //定