第一章 第二节 STM32F1系列 矩阵键盘的使用

第一章 第二节 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是换行符号

一个按键对应这么对字节
在这里插入图片描述

在这里插入图片描述


总结

提示:这里对文章进行总结:仿真跟现实操作还是有比较大的差距。我感觉很多物理接线,问题调试才是嵌入式的关键操作。在仿真平台中,只能加深对代码的理解,但是,从另一种程度上,没有从头到位新建工程,没有自己下载,而是使用一种呆呆式的下载方案,还是对整个项目的理解程度太低了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值