适用于stm32f10x的矩阵键盘思路与代码

看过不少关于矩阵键盘的代码和思路,常见的一种就是轮询扫描,其原理是控制行的和列的配置不同的模式,如在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等。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值