IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103ZET6【标准库函数开发】------02.2 按键实现短按、长按、双击的效果(非中断方式) -> 正文阅读

[嵌入式]STM32F103ZET6【标准库函数开发】------02.2 按键实现短按、长按、双击的效果(非中断方式)

一、硬件介绍

正点原子战舰开发板
在这里插入图片描述
在这里插入图片描述

LED0-----PB5
LED1-----PE5
KEY0-----PA4

二、实现目的

开机LED0、LED1均熄灭
单击KEY0,LED0点亮、LED1熄灭
双击KEY0,LED0熄灭、LED1点亮
长按,LED0,LED1均熄灭

三、设计思路

1、两个LED对应的IO设置为推挽输出,高电平,保证开机时灯处于熄灭状态
2、按键KEY0设置为上拉输入,按下后为低电平,松手为高电平
3、单击、双击、长按的区别示意图如下
在这里插入图片描述
首先需要区分单击和长按,可以看到长按就是按下的时间比较长的单击。如下图可以看到,如果检测到低电平的时间超过S3那么则是长按,否则就是单击。
在这里插入图片描述
单击和双击的区别,松开后,在一定的时间内是否再次检测到低电平。如下图,在松开手后如果在D2内检测到低电平,那么便是双击。否则便是单击。
在这里插入图片描述

单击表现出来的效果为高、低、高。即按下后低电平持续时间小于1s为单击
双击表现形式为高、低、高、低、高,即两次单击,且两次单击之间间隔要小于200ms
长按表现形式为高、低、高。即按下后低电平持续时间长于1s为长按

四、代码简介

主要是五个文件

LED源文件和头文件
led.c

void LED_Init(void)
{
	 GPIO_InitTypeDef  GPIO_InitStructure; 	
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
		
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
	 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高
	
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
	 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
	 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
}

led.h

#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5	
void LED_Init(void);//初始化

KEY源文件和头文件
key.c

//按键初始化函数
void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure; 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;//KEY0-KEY2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
}

key.h

#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
void KEY_Init(void);//IO初始化	

主函数main.c
main.c

 int main(void)
 {
	int a=0,b=0,c=0;
	delay_init();	    	 //延时函数初始化	  
 	LED_Init();			     //LED端口初始化
	KEY_Init();          //初始化与按键连接的硬件接口
	LED0=1;//保证LED0熄灭状态
	LED1=1;//保证LED1熄灭状态
	while(1)
	{		  
		if(KEY0==0) //按键按下
		{
			delay_ms(10);//消抖
			if(KEY0==0) //按键按下
			{
				while((KEY0==0)&&c<100)//10*100=1000ms,即超过1s即为长按
				{
					c++;
					delay_ms(10);
				}
				if(c>=100)//执行长按操作
				{
					LED0=1;//LED0点亮
					LED1=1;//LED1熄灭
					while(KEY0==0);//按键松开
				}
			
				else//执行单击操作
				{
					for(b=0;b<10;b++)//循环检测10*20ms=200ms内是否按键再次按下、即检测双击
					{
						delay_ms(20);
						if(KEY0==0)//如果检测到按键按下,即执行双击命令
						{
							a=1;
							LED0=0;//LED0点亮
							LED1=0;//LED1熄灭	
							while(KEY0==0);//按键松开
						}
					}
					if(a==0)//执行单击操作
					{
							LED0=0;//LED0点亮
							LED1=1;//LED1熄灭						
					}
				}
					a=0;
					c=0;
			}
		}						
	}
}	 

这个是通过扫描和循环的方式进行按键判断,代码参考的洋桃电子,没有用到定时器和中断,代码验证过,可以参考。
通过c的值,来判断操作是单击还是长按;通过a的值,来判断是单击还是双击。
通过改变两个自加次数,来改变双击之间时间间隔以及长按判定等的时间参数。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:35:52  更:2022-05-05 11:36:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:28:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码