看过不少关于矩阵键盘的代码和思路,常见的一种就是轮询扫描,其原理是控制行的和列的配置不同的模式,如在stm32中,控制行的配置推挽输出,控制列的配置上拉输入,通过行列配合读取规格为x*y(我用的是4*4)的矩阵键盘的返回值。
一.按键的实现需要的几个函数:
1. 按键引脚初始化代码(stm32的引脚初始化是必须的,51可以直接用);
2.按键读取函数。该函数用于读出按下的值是多少,并反馈。
3.按键处理函数。该函数结合具体功能需要自行加入,但是1,2必须有。
二.原理与代码
1.原理
具体原理是:当按下某个按键时控制行的一个引脚和控制列的一个引脚接在一起,即推挽输出和上拉输入连接在一起,当推挽输出为高电平时,上拉输入的状态默认为高电平,当推挽输出为低电平时,控制列的引脚上拉输入会被拉低到低电平。(这里面还有一些需要讨论的地方是这些不同模式之间能否接在一起,笔者查阅过资料,没看到铁定说推挽和上拉不能接在一起,而推挽和开漏是不能接一起的,详细请感兴趣的自行查阅资料)通过依次设置推挽输出的四个引脚为低电平确定行状态,当按键按下时,就可以读取出对应的列值,进而读出键值。原理图和读取状态表如下:
stm32f103c8t6的PA15,PB3,PB4,PB5,为行配置推挽输出,PB6-PB9为列配置上拉输入。
行/列 | PB6(第一列) | PB7(第二列) | ||||
PA15(第一行) | (PA15==0)&&(PB6==0)?1:0 | (PA15==0)&&(PB7==0)?2:0 | ||||
PB3(第二行) | (PB3==0)&&(PB6==0)?5:0 | (PB3==0)&&(PB7==0)?6:0 | ||||
PB4(第三行) | (PB4==0)&&(PB6==0)?9:0 | (PB4==0)&&(PB7==0)?10:0 | ||||
PB5(第四行) | (PB5==0)&&(PB6==0)?12:0 | (PB5==0)&&(PB7==0)?14:0 | ||||
行/列 | PB8(第三列) | PB9(第四列) | ||||
PA15(第一行) | (PA15==0)&&(PB8==0)?3:0 | (PA15==0)&&(PB9==0)?4:0 | ||||
PB3(第二行) | (PB3==0)&&(PB8==0)?7:0 | (PB3==0)&&(PB9==0)?8:0 | ||||
PB4(第三行) | (PB4==0)&&(PB8==0)?11:0 | (PB4==0)&&(PB9==0)?12:0 | ||||
PB5(第四行) | (PB5==0)&&(PB8==0)?15:0 | (PB5==0)&&(PB9==0)?16:0 |
其引脚初始化代码参考借鉴修改江协科大的代码如下图:
2.Key_Init();(必备)(名字随便定义)
由于PB3,PB4,PA13,PA14,PA15是特殊的IO口,默认用作JTAG/SWD仿真器的调试接口。(不涉及可以忽略)所以代码中涉及相关IO口用做其他功能时,需要启用复用功能用作普通I/O口,同时失能JTAG功能才能让矩阵键盘正常反馈。(这里笔者有一个疑问是:照理论来说这些特殊的IO口是启用了复用功能才用作的IO口,但是涉及复用功能的模式配置时,不需要用复用推挽输出功能,直接如图OUT_PP,推挽输出,不然没办法正常反馈。 有知道的笔者跪求详细解释)
3.按键读取函Key_Read()(必备)如下:(名字随便定义)
最需要注意的是函数内部返回值的定义(下图uint8_t Key=0)必须赋值0;不然键盘按键返回值不确定就会乱跳。
有了这两个函数,就可以使用矩阵键盘了。在循环里面定义一个uint8_t的变量(按键返回值不大于255的话unsigned char也可以)去承接按键的返回值就行了,然后根据需要写自己的代码就行。
4.按键处理函数(看个人需要,可忽略)
通过观看蓝桥杯相关的b 站UP主Alice_西风(UID:1041194501)的代码,写出:如下图所示,在函数内部出现了几个全局变量:Key_Up, Key_Down, Key_Val, Key_Old; (代码前三行忽略,可有可无)Key_Val读取按键读取函数的返回值;下面的Key_Down/Key_Up,就是下降/上升沿检测;Key_Old,是按下的值的存储;这样写了之后在一些需要按键处理过程是非常有用的。
下图中笔者自己的需要是按键处于按下状态时蜂鸣器响,松开则停止,用了Key_Val,因为按着它它的值就是键值,一松开它就会读取按键返回值变成0(再提一嘴,按键读取函数的内部返回值定义时顺手初始化为0)
至于OLED_Disp_Mode是界面标志位,我的设计中涉及OLED界面的一些转换,在不同的OLED界面中,键盘需要对应不同的操作,所以可以这样写。
笔者的测试板子如下:(惨不忍睹,哈哈哈)
三.后续
有疑问的欢迎评论留言,知无不言,后续再更其他内容as608,rfid,hc-05,esp8266等。