12.1关于按键
前面控制LED灯是让GPIO输出高低电平,而获取按键则是读取GPIO电平,从而获知用户是否按下按键。
按键监测一般有两种:按键扫描和按键中断。按键扫描是间隔很短时间反复查询GPIO状态,从而得知是否有按键动作,这种方式代码简单,但比较耗资源。按键中断而是通过按键产生中断信 ,从而实现按键的检测,这种方式需要使用到中断机制,需要对MCU了解深入一点,效果是最好的。
本节先介绍按键扫描,理解按键的基本原理,下一章再介绍按键中断,同时了解STM32F103的中断使用方法。
按键一般占用一个GPIO口,通过监测该GPIO的电平变化得知按键操作,典型的电路如图 12.1.1 所示。当所需按键比较多时,则可以采用矩阵按键减少GPIO的占用。矩阵按键需要通过编程扫描等方式实现对多个按键的监控,这里以最简单的独立按键为基础进行介绍。
由此,首先获取对应引脚的电平得知按键状态,再硬件或软件消除抖动。
12.2硬件设计
如下图 12.2.1 所示,是一种常见轻触按键,该按键有四个脚,①和②脚连接,③和④脚连接,按钮按下后,四脚全相连,实现导通效果。
由此可知,按键按下,GPIO引脚电平变低,反之为高。四个按键所接GPIO分别为:KEY1(PA0)、KEY2 (PG15)、KEY3(PC13)、KEY4(PE3)。
- GPIO初始化
代码段 12.3.2 按键初始化(driver_key.c)
将引脚初始化为上拉输入,此处使用了一个小技巧,因为各个按键的除了引脚 不同之外其余参数都是一致的,所以将GPIO结构体除引脚 外的参数只赋值一遍,最后只改变引脚 的那个成员参数的值进行初始化就可以了,不需要每个按键都将所有的成员参数重新赋值一遍,简化了代码量。
- 按键读取函数
因为四个按键这个函数的处理都几乎一致,所以此处只对KEY1,即UP键进行具体举例,其余的请查看具体代码。
代码段 12.3.3 按键读取函数(driver_key.c)
- 8行:定义了一个全局变量标志位“up_flag”,作为UP键被按下的标志;
- 11行:获取该按键状态;
- 13行:延时5-10ms,软件去抖;
- 14行:再次获取该按键状态,此时依旧按下,说明是正常按键操作,非抖动;
- 16行:将标志位置反,按键按一次置反一次(即0->1->0->1这样循环);
- 17行:熄灭红色LED灯;
- 18行:根据标志位“up_flag”的值,让绿色LED灯亮或灭;
- 19行:熄灭蓝色LED灯;
此时每按下一次UP键,绿色LED灯将亮灭交替。剩下的三个按键的效果分别是:DOWN->三个灯同时亮灭;LEFT->红灯亮灭;RIGHT->蓝灯亮灭。
- 主函数测试
代码段 12.3.4 主函数控制逻辑(main.c)
- 1~4行:初始化LED灯和按键;
- 6~16行:一直循环查询每个按键当前状态,从而判断对应按键是否按下;
12.4实验效果
本实验对应配套资料的“5_程序源码5_GPIO—按键轮询”。打开工程后,编译,下载。按下KEY3_L,红色亮/灭;按下KEY3_U,绿色亮/灭;按下KEY3_R,蓝色亮/灭;按下KEY3_D,三灯亮/灭。
百问 技术论坛:
http://bbs.100ask.net/
百问 嵌入式视频官 :
https://www.100ask.net/index
百问 开发板:
淘宝:https://100ask.taobao.com/
天猫:https://weidongshan.tmall.com/
技术交流群(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
QQ群:869222007(已满)752871361
单片机-嵌入式Linux交流群:
QQ群:536785813
文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24698 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!