上期简单的测试了一下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; }}
定义一个函数用来检测是否按下与是否长按,这里我们将其封装成一个函数接口,将结构体和变量绑定到一起。