三.STM32嵌入式学习--GPIO口(3)----通用输入的应用--按键的配置
前面我们讲了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)----通用输入的应用--按键的配置相关推荐
- 【STM32】Cortex_M4 GPIO口概述知识总结
一.GPIO概述 1.什么是GPIO口? GPIO口:简单而言,就是芯片用来控制或者采集外部器件的相关信息,这个又可以称之为输入输出的端口. 2.GPIO有什么作用? 是芯片用来感知外部世界并且用来控 ...
- STM32 嵌入式学习入门(4)——PWM原理
STM32 嵌入式学习入门(4)--PWM原理 本文先对STM32F103的通用定时器作一简单介绍,然后详细介绍通用定时器的一个应用--输出PWM波形的原理.整个文章以介绍"怎么用" ...
- GD32F130FXP6学习笔记三:ARM的GPIO初识
出处:http://www.openedv.com/posts/list/32730.htm 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_M ...
- STM32单片机的GPIO寄存器CRL、CRH、IDR、ODR、BRSS、BRR
STM32的寄存器多如牛毛,要一个一个的弄清楚谈何容易呀,所以我们在学习的时候要抓住重点,挑重要的进行学习和记忆,因为STM32一个一个去配置寄存器的话相当的麻烦,我们实际开发的话也不会一个一个去配置 ...
- STM8单片机GPIO口的驱动深度解析
上一节给大家介绍了STM8标准库的移植,本节课开始学习我们单片机的外设的驱动,单片机基本的外设资料包括GPIO.外部中断.定时器.串口等,本节先给大家介绍一下STM8单片机的GPIO口. 我们先不介绍 ...
- STM32学习笔记(三) STM32的GPIO的深入学习
STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置.STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32 ...
- STM32开发板学习——GPIO功能、5v兼容口
GPIO功能 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉 ...
- 嵌入式学习笔记——STM32的USART通信概述
文章目录 前言 常用通信协议分类及其特征介绍 通信协议 通信协议分类 1.同步异步通信 2.全双工/半双工/单工 3.现场总线/板级总线 4. 串行/并行通信 5. 有线通信.无线通信 STM32通信 ...
- 嵌入式学习笔记——使用寄存器编程操作GPIO
使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...
最新文章
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
- tensorflow keras 对应版本
- SURF算法与源码分析、上
- QT的QSet类的使用
- 【渝粤题库】陕西师范大学152102 管理学原理作业(高起专)
- 浏览器中插入富文本编辑器
- 三星Galaxy Note20系列再遭减配:100倍变焦也没了
- netty框架中 bossGroup与workGroup是一个还是两个Reactor
- worldwind 三维模型加载优化总结
- Python数据分析(三)—— Pandas数据统计
- V-rep 仿真与python远程控制
- 一款恋爱星座男女配对微信小程序源码
- oracle12c amm,oracle 11gR2和12C中引入AMM和hugepage的使用.
- 「RPA商战风云」从这次农行总部招标说起
- 华三交换机配置access命令_H3C交换机基本配置命令明细一览
- JS计算当前日期的周次
- 腾讯云COS创建Bucket报错
- android多行注释快捷键,AndroidStudio 常用快捷键
- app混合式开发中HbuilderX连接手机真机调试
- Java IDE MyEclipse 使用教程:创建Web服务项目