极客秀
搜索

外部中断不让用?又不想用轮询?蓝桥杯的板子逼我用定时器实现无阻塞按键检测和连按!

上期简单的测试了一下LCD和24C02。 本期介绍如何使用G431的按钮功能以及利用W24C02写入和读取数据。

从原理图中,四个按键通过上拉电阻接入PA0以及PB1~PB3,因此我们配置外部中断来检测按钮。

配置外部中断,这里不需要上拉或者下拉电阻,因为硬件上进行了上拉。

使能外部中断。

int KeyNumber;

定义一个变量用来接收按钮按下的数据。
我写到这里的时候才发现,我之前看作了,原来他的按键分配的居然是A0,B0,B1,B2,这样子我们的外部中断也无法使用了。哎呀呀气死我了,什么弱智设计。
但是通过光是轮询的方式去检测按键也太傻呗了(我这期文章不是白写了),于是决定加上通过定时器写一个检测函数。
这里本来是想用FreeRTOS将按键作为一个任务来使用,但是后来想想,这个板子是G431,应用领域应该是测量的,所以想了想没有上RTOS,而是使用定时器来检测按键。
使用定时器检测按键的好处不仅仅是可以检测按键是否按下,还可以检测按键是否连按,并且不会出现多个按键同时按下而出现的卡死现象。

我们开启一个定时器,将计时时间设置为50ms,即50ms扫描一次按键。


struct Key{  int KeyStaute;//是否按下  int Continuous;//是否连按  int KeyContinueNumber;//连按统计};struct Key key1,key2,key3,key4;

定义一个结构体来检测是否连按并且定义四个这样子的变量。


void Key_Scan(struct Key * key,GPIO_TypeDef* GPIO_Port,uint16_t GPIO_Pin){  if(!HAL_GPIO_ReadPin(GPIO_Port,GPIO_Pin))//按键拉高被拉低  {    if(key->KeyStaute)    {      key->KeyContinueNumber++;      if(key->KeyContinueNumber>20)//长按超过1s      {        key->Continuous = 1;      }    }    else    {      key->KeyStaute = 1;    }  }  else  {    key->KeyStaute = 0;    key->KeyContinueNumber = 0;    key->Continuous = 0;  }}  

定义一个函数用来检测是否按下与是否长按,这里我们将其封装成一个函数接口,将结构体和变量绑定到一起。

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容