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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 Cubemax(十一) ——利用状态机实现按键的长短按和双击 -> 正文阅读

[嵌入式]STM32 Cubemax(十一) ——利用状态机实现按键的长短按和双击

STM32 Cubemax(十一) ——利用状态机实现按键的长短按和双击


前言

状态机是一种根据当前状态来执行相应动作,根据输入去改变状态的方法,出处应该在数字电路中。
我们利用状态机的思想来实现按键的消抖和一些其他功能的实现

一、状态图

在这里插入图片描述
我们的按键实验,就是以此状态图为基础,然后做延申,实现长短按和双击。

二、Cubemax配置

1、IO口配置

这个配置很简单,看自己的板子上按键的IO口是哪个,我这里以KEY0做演示
在这里插入图片描述
配置PH3为输出IO,而且由电路图可知,应该设置为上拉。
在这里插入图片描述

2、定时器配置

我们需要配置一个10ms的定时器,以10ms去检测按键的状态
在这里插入图片描述
在这里插入图片描述

三、代码

1、编写有关按键的结构体和定义相关参数

#define IOSTATE HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_3)			//读取PH3的IO信息

typedef struct
{
		uint8_t flag;				//双击标志
		uint8_t mode;				//按键模式,0为短按,1为长按,2为双击
		uint8_t press_state;		//表示按键按下时,IO口为高电平还是低电平
}Key;

2、结构体初始化


void Key_Init()
{
		key.mode = 2;
		key.press_state = 0;
		key.flag = 0;
		HAL_TIM_Base_Start_IT(&htim2);
}	

3、状态机编写

我这里用一个变量a去观察结果

//此函数在定时器中每10ms调用一次
void Key_Check()
{
		static uint8_t state = 0, key_time = 0, twice_time = 0;
	
		if(key.flag == 1)
		{
				twice_time++;
				if(twice_time == 100)			//双击的间隔时间
				{
						twice_time = 0;
						key.flag = 0;
				}
		}
		
		switch(state)
		{
			case 0:
				if(IOSTATE == key.press_state) state = 1;
				break;
			
			case 1:
				if(IOSTATE == key.press_state)
				{
						if(key.mode == 0)	a++;			//单击模式
						else if(key.mode == 2)				//双击模式
						{
								key.flag++;
								if(key.flag == 2)
								{
										a++;
										key.flag = 0;
										twice_time = 0;
								}
						}
						state = 2;
			
				}
				else state = 0;
				break;
				
			case 2:
				if(IOSTATE != key.press_state)
				{
						state = 0;
						key_time = 0;
				}
				else	if(key.mode == 1)									//长按模式
				{
						key_time++;	
						if(key_time == 50)									//长按时间
						{
								a++;
						}
				}
				break;
		}
}

4、10ms定时器中反复检测按键状态

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		if(htim->Instance == htim2.Instance)
		{
					Key_Check();
		}
}

总结

状态机的思想,适用于状态多变的场所,不仅是按键中。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:46:05  更:2021-08-12 16:47:39 
 
开发: 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年5日历 -2024/5/11 18:30:29-

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