当前位置: 首页 > news >正文

松江品划网站建设维护郑州网站制作郑州网站制作

松江品划网站建设维护,郑州网站制作郑州网站制作,中国企业排行榜前十名,北京确诊病例活动轨迹公布🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏

🪔本系列专栏 -  蓝桥杯嵌入式_勾栏听曲_0的博客

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 - 勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇立班超志,守苏武节,歌武穆词,做易水别。📈


目录

原理图解析

设置STM32CubeMX

按键配置

定时器配置

手搓代码

中断回调(服务)函数

 按键判断函数

按键单击判断函数

按键双击判断函数

按键长按判断函数


原理图解析

我们以PB1为例来分析,假如按键没有被按下,那么PB1的电平就与左上角的VDD相等,也就是PB1 = 1;如果按键被按下,那么右下角的接地就会被导通,PB1的电平3就与GND相等,也就是PB1 = 2。

这样我们就能通过以上原理对按键进行判断,但是按键判断是一个事件触发程序,所以我们要使用定时器来使开发板能在任意时间都能对按键进行判断。因此我们再下一步设置STM32CubeMX中需要对定时器初始化。

设置​​​​​​​STM32CubeMX

按键配置

首先我们先根据按键的原理图配置好引脚,需要注意的是,再前几篇文章中讲LCD与LED我们讲引脚都是设置为GPIO_Output,但是按键的四个引脚,我们需要设置为GPIO_input,如图:

 然后在左侧选择GPIO中的按键的四个引脚,上下拉模式设为上拉,为以下状态:

定时器配置

关于定时器的详细知识点与解析可前往蓝桥杯嵌入式这篇博客,在这里我们只讲定时器的应用

如果大家有去做过省赛或国赛题目,就都会看到过对按键响应时间是有要求的,一般都是响应时间在0.1秒内,所以我们的定时器可以就设置为0.01秒。

以下是使能中断 

 

手搓代码

中断回调(服务)函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

以下就是中断回调函数,很长,记不住怎么办。别担心,还有办法,我们打开keil5,在Project下找到stm32g4xx_it.c,在里面找到stm32g4xx_hal-tim.h并打开他,翻到最下面,再往上滑一点点,大概两千五百多行的位置,就可以找到这个函数啦,我们就可以直接复制使用。

 

 按键判断函数

实现创建一个按键的结构体,其含义写在注释中了:

struct keys
{uchar judge_sta;	//判断按键按键按下的动作到了第几步bool key_sta;		//如果按键被按下,为0bool key_flag;	//如果确认被按下,为1
};

 具体实现按键判断函数的思路:

1.判断中断回调函数收到的中断信号是不是我们刚刚给按键设置的定时器3的信号,如果是就进入按键判断函数

2.读取每个按键这一时刻的电平

3.判断有哪些按键为按下的状态(低电平)

4.按键抖动判断

5.状态重置

按键单击判断函数

具体实现代码如下,代码中也有详细注释,希望能有所帮助:

struct keys key[4]={0,0,0,0};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)			//判断中断信号是否来自定时器3{key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);		//读按键PB0现在的状态,如果被按下,PB0  = 0;如果没有被按下,PB0 = 1;key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i < 4; i++ )		//确认是哪个或哪些按键被按下了{switch (key[i].judge_sta){case 0:{if(key[i].key_sta==0) key[i].judge_sta = 1;	//第一次判断是否按下}break;case 1:{if(key[i].key_sta==0)	//进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖{key[i].judge_sta = 2;key[i].key_flag = 1;}else		//否则就是抖动,本次不算按键被按下key[i].judge_sta = 0;}break;case 2:{if(key[i].key_sta==1) key[i].judge_sta = 0;	//判断是否松手,松手后按键状态重置}break;}}}
}

按键双击判断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)			//判断中断信号是否来自定时器3{key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);		//读按键PB0现在的状态,如果被按下,PB0  = 0;如果没有被按下,PB0 = 1;key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i < 4; i++ )		//确认是哪个或哪些按键被按下了{switch (key[i].judge_sta){case 0:{if(key[i].key_sta==0) key[i].judge_sta = 1;	//第一次判断是否按下}break;case 1:{if(key[i].key_sta==0)	//进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖{if(a == i && key[a].key_time < 70)	//小于70,说明上次按下后到这次按下时间间隔小于0.7秒{key[i].double_key_flag = 1;		//这是一次双击事件}else{key[i].key_flag = 1;a = i;							//记录这一次是上面按键被按下}key[i].judge_sta = 2;}else		//否则就是抖动,本次不算按键被按下key[i].judge_sta = 0;}break;case 2:{if(key[i].key_sta==1) key[i].judge_sta = 0;	//判断是否松手,松手后按键状态重置key[i].key_time = 0;}break;}}key[a].key_time++;		//第一次被按下之后,开始计时}
}

按键长按判断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i < 4; i++ ){switch (key[i].judge_sta){case 0:{if(key[i].key_sta==0) {key[i].judge_sta = 1;	//第一次判断是否按下key[i].key_time = 0;}}break;case 1:{if(key[i].key_sta==0)	//进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖{key[i].judge_sta = 2;}elsekey[i].judge_sta = 0;}break;case 2:{				if(key[i].key_sta==1) 		//判断是否松手{if(key[i].key_time < 100){key[i].key_flag = 1;}
//						if(key[i].key_time > 100)				//一次扫描10毫秒,100次1000毫秒,就是判断是否长按超过1000毫秒
//																						//松手后,才会执行相应反应
//						{
//							key[i].long_flag = 1;
//						}key[i].judge_sta = 0;		}else{key[i].key_time++;if(key[i].key_time > 100)				//一次扫描10毫秒,100次1000毫秒,就是判断是否长按超过1000毫秒//未松手时,就会执行相应反应{key[i].long_flag = 1;}}}break;}}}
}

http://www.yayakq.cn/news/414660/

相关文章:

  • 怎么制作手机网站平台宝安印刷网站建设
  • 企业网站建设网站网站建设流程代理商
  • 太原富库网站建设网页设计代码免费
  • 网站网页设计费用广州安全教育平台账号找回
  • 网站服务器ip更换维普网
  • 网站开发不用mvc行不行这样制作公司网站
  • 巴南市政建设网站厦门建设执业资格注册管理中心网站
  • 上门做网站公司wordpress优化网站打开速度
  • 国外设计大师网站快看点自媒体注册入口
  • 网站建设培训会上的讲话如何把自己做的网站放到微信上
  • 学校网站建设策划书模板厦门人才网唯一官方网站登录入口
  • 网站建设后期服务协议创建软件app
  • 潍坊专业环保设备网站优化就是搜索引擎优化
  • WordPress关站插件双滦网站建设
  • 深圳建设网站排名购物帮做特惠的导购网站
  • php网站链接支付宝做网站费用 优帮云
  • 网站维护得多久产品型网站案例
  • 做家乡的网站网站建设与管理学校
  • 网站建设困难沃尔玛网上商城官网
  • 网站推广与宣传怎么做网页设计师联盟网站怎么
  • 主做收影视出版的小说网站企业融资规划师
  • 知名建筑类的网站易观数据app排行
  • 网站备案号去哪查询五合一自助建站网站
  • 网站建设需准备什么什么是网络推广?
  • 鞋图相册网站怎么做wordpress导出文章
  • ICP备案网站服务内容品牌策划网站推荐
  • 做网站服务商百度快照是干嘛的
  • wordpress网站做h5分类曹县做网站建设
  • 北京网站设计联系电话哪个做app的网站好
  • 衡水seo网站建设优化排名济南建设银行网站