前面我们讲了IO的通用输出的配置--点灯,今天我们讲讲按键输入。

依旧是学习思路:

如何让芯片内核判断到按键是否按下?

如果按键未按下,内核检测IO口是低电平,如果按下,则检测高电平。

如何检测IO口的电平?

因为是通用输入模式,我们只需要读取数据寄存器对应位的值,就可以知道IO口的电平状态。

按键初始化函数大致框架

{

//时钟使能

//端口模式配置--------通用输入

//上下拉-----------------浮空

}

注意:

由于按键是机械按键,有抖动,不能直接读IDR的位

所以要消抖 再读IDR寄存器

所以我们在写按键扫描函数时应该有一个延时消抖的过程。

u8 key_scan(void)

{

If(按键按下 并且 标志位是1)

{

延时消抖

If(按键真的按下)

{

赋值键值

标志位锁定 //赋值0

}

}

If(按键抬起了)

{

解锁标志位;  //重新赋值1

}

返回键值;

}

static void delay_ms(u32 ms)//延时程序
{u32 i = 168 / 4 * 1000 * ms;while(i){i--;}
}

按键初始化函数

/***********************************************
*函数名    :Key_Init
*函数功能  :对按键所用IO口初始化配置
*函数参数  :无
*函数返回值:无
*函数描述  :KEY1-----PA0KEY2----PE2KEY3----PE3KEY4----PE4
************************************************/
void Key_Init(void)
{//时钟使能RCC->AHB1ENR |=(1<<0);//--------------ARCC->AHB1ENR |=(1<<4);//--------------E//端口模式寄存器配置GPIOA->MODER &= ~(3<<0);GPIOE->MODER &= ~((3<<4)|(3<<6)|(3<<8));//上下拉配置GPIOA->PUPDR &= ~(3<<0);GPIOE->PUPDR &= ~((3<<4)|(3<<6)|(3<<8));}

按键扫描函数

/***********************************************
*函数名    :Key_Scan
*函数功能  :按键扫描
*函数参数  :u8
*函数返回值:无
*函数描述  :
************************************************/
u8 Key_Scan(void)
{u8 key =0xff;static u8 key_flag = 1;if((KEY1||!KEY2||!KEY3||!KEY4) && key_flag ){//延时消抖delay_ms(12);if(KEY1){//锁定标志位key_flag=0;//赋值键值key=1;}else if(!KEY2){//锁定标志位key_flag=0;//赋值键值key=2;}else if(!KEY3){//锁定标志位key_flag=0;//赋值键值key=3;}else if(!KEY4){//锁定标志位key_flag=0;//赋值键值key=4;}   }//按键抬起if(!KEY1 && KEY2 && KEY3 && KEY4 ){key_flag=1;//解锁标志位}return key;}

对于机械按键我们还有很多不同的应用,譬如

两个按键一起按


/******************************************
*函数名    :key_scan_key12
*函数功能  :按键1和按键2一起按
*函数参数  :无
*函数返回值:u8
*函数描述  :两个按键一起按实际是两个按键按下,之间的间隔时间不能超过设定的窗口
*********************************************/
u8 key_scan_key12(void)
{static u8 key_flag = 1;     static u32 cont = 0;u8 key = 0xff;//判断其中一个按键按下if((KEY1|| !KEY2) && key_flag){cont++;//两个按键都按下并且时间差<=250000if((KEY1 && !KEY2) && cont<=250000){delay_ms(10);if(KEY1 && !KEY2){key = 99;key_flag = 0;}}}//消除恶意一直按KEY1,按按键1/2后超过一定时间再按按键1/2无效if(cont > 250000){cont = 255000;}//如果两个按键抬起就解锁if(!KEY1 && KEY2 ){key_flag = 1;cont = 0;}return key;
}

长按:


/******************************************
*函数名    :key1_len_scan
*函数功能  :按键1长按 短按扫描
*函数参数  :无
*函数返回值:u8
*函数描述  :短按返回1  长按返回11
*********************************************/
u8 key1_len_scan(void)
{u8 key_val = 0xff;static u8 key_falg = 1;                //定义长按标志位变量  static u32 cont     = 0;if(KEY1)                               //如果按键1按下{cont++;                              //开始计数if(cont > 250)  cont = 300;          //防止无限加越界delay_ms(10);                        //消抖} //如果按键1抬起 并且时间不超过100  就是短按if(!KEY1 && cont>0 && cont<100)         {key_val = 1;                          //赋值键值1cont = 0;                             //清零}//如果时间超过250   并且 标志位1  就是长按if(cont >= 250 && key_falg){key_val = 11;                         //赋值键值11         key_falg = 0;                         //标志位锁定}if(!KEY1 && cont >= 250)                //如果长按的按键抬起{key_falg = 1;                         //标志位解锁cont = 0;                             //清零} return  key_val;                       //返回键值
}

三.STM32嵌入式学习--GPIO口(3)----通用输入的应用--按键的配置相关推荐

  1. 【STM32】Cortex_M4 GPIO口概述知识总结

    一.GPIO概述 1.什么是GPIO口? GPIO口:简单而言,就是芯片用来控制或者采集外部器件的相关信息,这个又可以称之为输入输出的端口. 2.GPIO有什么作用? 是芯片用来感知外部世界并且用来控 ...

  2. STM32 嵌入式学习入门(4)——PWM原理

    STM32 嵌入式学习入门(4)--PWM原理 本文先对STM32F103的通用定时器作一简单介绍,然后详细介绍通用定时器的一个应用--输出PWM波形的原理.整个文章以介绍"怎么用" ...

  3. GD32F130FXP6学习笔记三:ARM的GPIO初识

    出处:http://www.openedv.com/posts/list/32730.htm 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_M ...

  4. STM32单片机的GPIO寄存器CRL、CRH、IDR、ODR、BRSS、BRR

    STM32的寄存器多如牛毛,要一个一个的弄清楚谈何容易呀,所以我们在学习的时候要抓住重点,挑重要的进行学习和记忆,因为STM32一个一个去配置寄存器的话相当的麻烦,我们实际开发的话也不会一个一个去配置 ...

  5. STM8单片机GPIO口的驱动深度解析

    上一节给大家介绍了STM8标准库的移植,本节课开始学习我们单片机的外设的驱动,单片机基本的外设资料包括GPIO.外部中断.定时器.串口等,本节先给大家介绍一下STM8单片机的GPIO口. 我们先不介绍 ...

  6. STM32学习笔记(三) STM32的GPIO的深入学习

    STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置.STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32 ...

  7. STM32开发板学习——GPIO功能、5v兼容口

    GPIO功能 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉 ...

  8. 嵌入式学习笔记——STM32的USART通信概述

    文章目录 前言 常用通信协议分类及其特征介绍 通信协议 通信协议分类 1.同步异步通信 2.全双工/半双工/单工 3.现场总线/板级总线 4. 串行/并行通信 5. 有线通信.无线通信 STM32通信 ...

  9. 嵌入式学习笔记——使用寄存器编程操作GPIO

    使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...

最新文章

  1. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
  2. tensorflow keras 对应版本
  3. SURF算法与源码分析、上
  4. QT的QSet类的使用
  5. 【渝粤题库】陕西师范大学152102 管理学原理作业(高起专)
  6. 浏览器中插入富文本编辑器
  7. 三星Galaxy Note20系列再遭减配:100倍变焦也没了
  8. netty框架中 bossGroup与workGroup是一个还是两个Reactor
  9. worldwind 三维模型加载优化总结
  10. Python数据分析(三)—— Pandas数据统计
  11. V-rep 仿真与python远程控制
  12. 一款恋爱星座男女配对微信小程序源码
  13. oracle12c amm,oracle 11gR2和12C中引入AMM和hugepage的使用.
  14. 「RPA商战风云」从这次农行总部招标说起
  15. 华三交换机配置access命令_H3C交换机基本配置命令明细一览
  16. JS计算当前日期的周次
  17. 腾讯云COS创建Bucket报错
  18. android多行注释快捷键,AndroidStudio 常用快捷键
  19. app混合式开发中HbuilderX连接手机真机调试
  20. Java IDE MyEclipse 使用教程:创建Web服务项目

热门文章

  1. 实现单片机脉宽测量功能
  2. tx-read-only
  3. 计算机科学与技术(CS)专业图书推荐
  4. 佳能C5235彩色激光复印机复印有底灰
  5. 美容美发行业的私域搭建
  6. 苹果手机或ipad忘记密码怎么办?刷机
  7. SpringBoot中异步线程池AsynConfigurer配置
  8. 掌握什么电子知识,大学阶段如何学习?
  9. PCM / I2S / AC97简介
  10. vue 中的solt插槽