第一章 第二节 STM32F1系列 矩阵键盘的使用
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
第一章 简单交互组
第一节 STM32F1系列 一位数码管的使用
第二节 STM32F1系列 矩阵键盘的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
矩阵键盘是单个按键的升级版,如果使用单个按键4x4需要16个IO口,使用4x4矩阵键盘,只需要使用8个IO就可以实现。大大节约了系统资源。本章节比较难理解的是,就是矩阵键盘的扫描原理、代码实现。
学习目标
(1)学会矩阵键盘的原理、代码实现
(2)学会使用简单的串口通讯
单纯的矩阵按键是没有意义的,只有我们给矩阵Amn赋予信息,才能有对应的意义。因此,本章节其实还有内容就是,定义好了矩阵键盘,再让矩阵键盘的每个按键具有对应的意义,最后输出到串口助手中。
一、原理
4x4矩阵键盘的判断本质是一个a44数组,即:(1)先判断行信号(2)再判断列信号(3)组合确定二维数组的位置
共使用8个引脚,其中4个是行引脚,4个是列引脚。
行引脚:命名为1,2,3,4
列引脚:命名为5,6,7,8
模式使用推挽模式
行引脚均输出高电平,
列引脚均输出低电平
开关作为连接,行引脚和列引脚的中间组件
(思考一下,库是如何封装的?)
在行引进开始流入前,已经做好了标记
当按键按下,行引脚的高电平,流入,列引脚的低电平,此时,列引脚将监测到高电平信号
思考1:利用电压波动。当开关连接之后,行引脚输出高电平会有数值波动,可以当作监测指标
思考2:利用时序控制。行引脚输出高电平的时候,我按周期输入,1-5ms,6-10ms,11-15ms,16-20ms。我按这个周期命名为:T1、T2、T3、T4。分别输出高电平。当检测到列引脚有高电平的时候,我再判断:行引脚的高电平是在哪个周期内发生的,就可以判断出 行的标号是什么了。
列的标号是简单的:5、6、7、8这四个引脚,哪个检测到了高电平,就是哪个列
二、使用步骤
1.键盘扫描函数代码
代码如下(示例):
//矩阵键盘扫描函数
u8 KEYBOARD16_Scan(void)
{
static u8 flag1=1,flag2=1,flag3=1,flag4=1;
H1 = 1;
H2 = 0;
H3 = 0;
H4 = 0;
if(flag1&&(L1==1||L2==1||L3==1||L4==1))
{
flag1=0;
if(L1==1)
{
KEY16=KEY1_PRES;
}
else if(L2==1)
KEY16=KEY2_PRES;
else if(L3==1)
KEY16=KEY3_PRES;
else if(L4==1)
KEY16=KEY4_PRES;
}
else if(L1==0&&L2==0&&L3==0&&L4==0)
flag1=1;
// else
// return 0;
H1 = 0;
H2 = 1;
H3 = 0;
H4 = 0;
//中间省略了一堆重复性的代码,能看懂就能自己写!
// return 0;
return KEY16;
}
提示:这个工程的主要工作是检测输入的电平数据,输入虽然也是模拟量数据,但是不需要对其值进行采集,只需要按区间采集就好了,因此难度会降低很多,不需要用AD转换,也不需要用数模转换器
提示:KEY16=KEY4_PRES;
检测到按键被按下的时候,就把某个变量输入到 KEY16 变量,然后在串口的地方,负责输出就行了
也不是很难
2.串口通信库
代码如下(示例):
//键值处理函数
void key16_process(void)
{
//编辑串口打印信息
switch (KEY16)
{
case 0x01:
printf("input 'K1'\n");
break;
case 0x02:
printf("input 'K2'\n");
break;
case 0x03:
printf("input 'K3'\n");
break;
....//中间省略一堆无用的,反正是使用0x01到0x10的十六进制寄存器使用操作
break;
case 0x10:
printf("input 'K16'\n");
break;
default:
break;
}
KEY16 = 0;
}
3.主函数
代码如下(示例):
int main()
{
uint8_t key_value = 0;
//初始化串口1
uart_init(115200);
//初始化按键矩阵
KEYBOARD16_Init();
while(1)
{
//开启按键扫描
key_value = KEYBOARD16_Scan();
if( key_value )
{
//处理键值并通过串口助手打印
key16_process(key_value);
}
}
}
4.仿真图像
(1)问:是任意两个引脚都可以实现TX,RX的功能吗?
(2)问:为什么不适用同组的PA11、12、13呢?
(3)串口助手解析
文本模式
HEX信息模式
0X0a是换行符号
一个按键对应这么对字节
总结
提示:这里对文章进行总结:仿真跟现实操作还是有比较大的差距。我感觉很多物理接线,问题调试才是嵌入式的关键操作。在仿真平台中,只能加深对代码的理解,但是,从另一种程度上,没有从头到位新建工程,没有自己下载,而是使用一种呆呆式的下载方案,还是对整个项目的理解程度太低了。