按键扫描原理

  • 按键扫描即扫描IO口电平状态,来判断按键是否按下。当按键按下时,IO口电平发生改变。
  • 由于按键在按下过程中,按键内部簧片接触过程中会出现很短暂的电平不稳定状态,一般需要去抖。方式有两种,第一种物理去抖,第二种软件去抖。本篇采用软件去抖,即5~10ms的延时。

扫描程序

  • 在key.h中进行引脚宏定义
/* key0 define */
#define KEY0                            PEin(4)
#define KEY0_GPIO_Pin                   GPIO_Pin_4
#define KEY0_GPIO_Port                  GPIOE
#define KEY0_RCC_APB2Periph_CLK         RCC_APB2Periph_GPIOE/* key1 define */
#define KEY1                            PEin(3)
#define KEY1_GPIO_Pin                   GPIO_Pin_3
#define KEY1_GPIO_Port                  GPIOE
#define KEY1_RCC_APB2Periph_CLK         RCC_APB2Periph_GPIOE/* key_up define */
#define WK_UP                           PAin(0)
#define KEY_UP_GPIO_Pin                 GPIO_Pin_0
#define KEY_UP_GPIO_Port                GPIOA
#define KEY_UP_RCC_APB2Periph_CLK       RCC_APB2Periph_GPIOA
  • 定义枚举值,用于扫描返回值
typedef enum _KEY_STA_t KEY_STA_t;
enum _KEY_STA_t
{KEY0_PRESS = 1,KEY1_PRESS,WK_UP_PRESS
};
  • 在key.c中进行按键的IO口定义
/*** @name: KEY_GPIO_Init* @description: KEY 初始化 * @param {*}* @return {*}*/
void KEY_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(KEY0_RCC_APB2Periph_CLK | KEY_UP_RCC_APB2Periph_CLK, ENABLE);GPIO_InitStruct.GPIO_Pin = KEY0_GPIO_Pin;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(KEY0_GPIO_Port, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_Pin;GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = KEY_UP_GPIO_Pin;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(KEY_UP_GPIO_Port, &GPIO_InitStruct);
}
  • 按键扫描函数定义
/*** @name: KEY_Scan* @description: 按键扫描* @param {u8} mode mode=0 表示开启连按; mode=1 表示不能连按;* @return {*}*/
u8 KEY_Scan(u8 mode)
{static u8 key_up = 1;if(mode) key_up = 1;if(KEY0 == 1 && KEY1 == 1 && WK_UP == 0){key_up = 1;}if(key_up && (KEY0 == 0  || KEY1 == 0 || WK_UP == 1)){delay_ms(10);if(KEY0 == 0 || KEY1 == 0 || WK_UP == 1){key_up = 0;if(KEY0 == 0) return KEY0_PRESS;if(KEY1 == 0) return KEY1_PRESS;if(WK_UP == 1) return WK_UP_PRESS;}}return 0;
}

按键扫描运行

  • 在main.c中调用
int main(void)
{uint8_t key_sta = 0;uint32_t t = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);initSysTick();Usart1_Init(115200);LED1_Init();LED2_Init();KEY_GPIO_Init();printf("Init Hardware OK ... \n");for(;;){t++;if(t >= 2000)t = 0;/* 按键开关程序 */key_sta = KEY_Scan(0);if(key_sta == KEY0_PRESS){LED1_Open();printf("key0 press! \n");}if(key_sta == KEY1_PRESS){LED1_Close();printf("key1 press! \n");}/* 系统正常指示灯 */if(0 == t % 100)    {LED2_Toggle();}}
}
  • 程序运行结果,串口中的显示


喜欢请点个赞哦,谢谢!欢迎指正

STM32按键设计一之扫描相关推荐

  1. 单片机按键设计的四个方案

    在单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件.软件设计方面的技巧.一般的在按键的设计上,一般有四种方案:一是GPIO口直接检测单个按键,如图1.1所示;二是按键较多则使用矩阵键盘,如 ...

  2. STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始

    STM32课程设计–数字时钟+数字电压表+扩展功能–从零开始 目录 STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始 准备 建立工程 下载工程模板 添加项目所需文件 下载 加入工程 加 ...

  3. STM32软件架构设计

    STM32软件架构设计 V2.0 1.架构设计的意义 2.总体架构图 3.结构层说明 (1)应用层 (2)业务逻辑层 (3)功能模块层 (4)硬件抽象层 4.遵循规则 (1)命名 (2)调用 (3)增 ...

  4. STM32按键控制开关灯

    2018/4/1 STM32 1.按键操作的原理 1.在stm32f103rc中,存在三个按键(不包括复位),分别为key0(PC5),key1(PA15),wkup(PA0),按下key0和key1 ...

  5. STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)

    @ 蓝牙彩灯V1.4 biliblil视频链接:https://www.bilibili.com/video/BV14L411V78b/ 资料可联系作者:2809786963 一.功能描述 1.手机A ...

  6. (39)FPGA按键设计(第8天)

    (39)FPGA按键设计(第8天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA按键设计(第8天) 5)技术交流 6)参考资料 2 FPGA初级课程介绍 ...

  7. 4月13日,每天30秒,昨夜今晨一览无余/两款iPhone 15 Pro将取消固态按键设计/法国正在考虑对苹果采取反垄断行动

    1.永辉超市全资控股的私募基金主动注销 2.蚂蚁保上线"省心配"智能配置工具 3.国家能源局:大力发展风电太阳能发电,2023年全年风电.光伏装机增加1.6亿千瓦左右 4.国家能源 ...

  8. 【IoT-卫朋】智能硬件 | 产品按键设计

    卫朋丨第123篇文章 阅读提示丨3105字 5分钟 篇幅较长,大家可先收藏 文末有免费彩蛋(8大产品干货资料) 虚实结合,打造最强产品人 上到战略规划,中至运营策略,下至元器件选型,本号力图为读者呈现 ...

  9. 浅析STM32 Bootloader设计

    不需要拆机就能对产品进行固件升级是很多人想要的效果,不仅方便而且节省精力和成本.那么如何完成这项工作呢?接下来所介绍的Bootloader就可以完成这项工作,通过Bootloader引导程序完成固件的 ...

最新文章

  1. 推荐8个特别实用、功能强大的软件,解决痛点需求
  2. Windows下Git Bash 远程仓库
  3. Windows7无法访问共享文件夹(0x800704cf,0x80070035)解决方法
  4. HSC86H SUMTOR 混合步进伺服电机驱动器
  5. 计算机组成原理 — CPU 中央处理器
  6. GIS投影的基本原理、超图数据集导入导出坐标系文件
  7. java开发http协议接口_java开发接口利用http协议传输数据
  8. Nginx源码包软件安装步骤
  9. 项目质量管理—七种基本质量工具
  10. Java Swing
  11. windows补丁修复
  12. vue 下载Excel 文件
  13. Python应用练习题(第一期)——基本语句练习
  14. 代码的坏味道之十七 :Inappropriate Intimacy(狎昵关系)
  15. 比尔盖茨的风流情史,妻子同意他与前女友同居,婚内出轨损失 80 亿
  16. centos php 开启libgdgd_linux gd
  17. 微信扫一扫 扫普通链接二维码打开微信小程序
  18. 最长对称子串 作者 陈越单位 浙江大学
  19. R语言:从 csv 文件中读取数据,然后将数据写入 csv 文件
  20. C语言之贪吃蛇游戏源码

热门文章

  1. 华为存储FusionStorage(备份②)
  2. Java 无意识自动装箱严重消耗性能
  3. 施工行业项目管理软件
  4. Cross-X Learning for Fine-Grained Visual Categorization
  5. linux光盘读取不良,程序员偷偷深爱的9个不良编程习惯
  6. ORACLE ORDER BY用法总结
  7. 奥运五环的绘制-进阶
  8. 【自用向】【新手向】PHP入门学习(不断更新)
  9. dellr420部署os_Dell R420服务器手动安装centos7系统系列问题
  10. 尸体火化,世界上再也找不到第二个比我社死的人了