首先要感谢江苏科技大学提供的STM32入门课程,让我受益匪浅。我强烈推荐有兴趣的朋友去参加学习。
首先介绍一下我使用的矩阵键盘的外形,这是一种非常常见的类型。
接线图如下(其他型号可根据自己的需求接上GPIO口)。
代码基于stm大善人的代码修改而来,他的讲解非常详细,我在这里要表示非常感谢。
现在直接上代码:
头文件Key4x4.h
主体文件Key4x4.c
主要代码说明:
初始化配置 (KEY_4x4_Init):
- 使能GPIOA模块的时钟。
- 配置GPIOA的前四个引脚(GPIO_Pin_0至GPIO_Pin_3)为推挽输出模式,用于键盘行线的扫描。
- 设置GPIOA的后四个引脚(GPIO_Pin_4至GPIO_Pin_7)为上拉输入模式,用于检测键盘列线的状态。
按键检测 (KEY_Click_Listener):
-
检测列线状态,如果有键按下,则调用
Do_Click
函数记录按键信息并等待按键释放。 -
使用延时函数
Delay_ms
来消除按键抖动。
扫描过程 (KEY_Scan):
- 循环扫描每一行,通过改变行线的状态来检测是否有键按下。
-
调用
KEY_Click_Listener
函数来处理每一行的按键检测。
读取按键值 (Key_Read):
- 返回当前按下的键对应的数值。
补充说明:
line 定义了4个16进制的数值分别转成二进制
0000 0000 1111 1110 0x00fe
0000 0000 1111 1101 0x00fd
0000 0000 1111 1011 0x00fb
0000 0000 1111 0111 0x00f7
低4位为行,高四位为列。
设置0就是给对应行设置低电平。
在扫描的代码中,我们可以看到扫描的方法是先给传入的行line[x]设置低电平。
当扫描到某一列为低电平时就说明这一列被点击了。
循环从第一列到第四列设置低电平,直到检测到某一列也变成低电平。
假设1被点击,则1这一列也是低电平。
就变成第一行第一列低电平。
这样就能确定1被点击。给对应参数赋值1即可。
再根据定义的keys(ASCII码表对应数值)。
主要代码就是上面这些,其他代码只要复制江苏科技大学OLED的课件源码即可。
使用方式 man.c