在完成了LCD的学习后,我们接下来开始学习按键的控制。
首先要学的是按键的单击控制。
下图是有关按键的控制电路。
在看明白电路之后,我们开始在上一个cubeMX的工程中继续进行配置。
然后,配置完这些之后,我们就来到了控制按键的关键,对定时器进行配置。
我们首先要了解一下,我们使用的板子的定时器,所以我们打开官方给我们的资料。
然后,我选择的是TIM4,继续对定时器继续配置。
到此为止,我们就已经完成了按键在cubeMX上的配置。
然后我们就可以开始编写程序了。
#ifndef __INTERRUPT_H
#define __INTERRUPT_H#include "main.h"
#include "stdbool.h"//声明结构体
struct keys
{
uchar state_index;//按键状态索引
bool key_state;//按键状态
bool single_flag;//按键最后确定被按下时置1
};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
#endif
一般情况下,可以直接在旁边的文件栏找到hal_tim_h,如果找不到,就先将工程编译一下然后去找。
如果编译了之后都还找不到,那么我们就可以进行以下操作。
#include "interrupt.h"
struct keys key[4]={0,0,0,0};
//中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM4)
{
key[0].key_state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_state=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i=0;i<4;i++)
{
switch (key[i].state_index)
{
case 0:
{
if(key[i].key_state==0)
{
key[i].state_index=1;
}
}
break;
case 1:
{
if(key[i].key_state==0)
{
key[i].state_index=2;
key[i].single_flag=1;
}
else
{
key[i].state_index=0;
}
}
break;
case 2:
{
if(key[i].key_state==1)
{
key[i].state_index=0;
}
}
break;
}
}
}
}
if(key[0].single_flag==1)
{
sprintf(text," key0down ");
LCD_DisplayStringLine(Line8, (uint8_t *)text);
key[0].single_flag=0;
}
if(key[1].single_flag==1)
{
sprintf(text," key1down ");
LCD_DisplayStringLine(Line8, (uint8_t *)text);
key[1].single_flag=0;
}
到此为止,我们就完成了按键的单击控制。